My Marlin configs for Fabrikator Mini and CTC i3 Pro B
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

twibus.h 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /*
  2. * Marlin 3D Printer Firmware
  3. * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #ifndef TWIBUS_H
  23. #define TWIBUS_H
  24. #include "macros.h"
  25. #include <Wire.h>
  26. // Print debug messages with M111 S2 (Uses 236 bytes of PROGMEM)
  27. //#define DEBUG_TWIBUS
  28. typedef void (*twiReceiveFunc_t)(int bytes);
  29. typedef void (*twiRequestFunc_t)();
  30. #define TWIBUS_BUFFER_SIZE 32
  31. /**
  32. * TWIBUS class
  33. *
  34. * This class implements a wrapper around the two wire (I2C) bus, it allows
  35. * Marlin to send and request data from any slave device on the bus. This is
  36. * an experimental feature and it's inner workings as well as public facing
  37. * interface are prune to change in the future.
  38. *
  39. * The two main consumers of this class are M155 and M156, where M155 allows
  40. * Marlin to send a I2C packet to a device (please be aware that no repeated
  41. * starts are possible), this can be done in caching method by calling multiple
  42. * times M155 B<byte-1 value in base 10> or a one liner M155, have a look at
  43. * the gcode_M155() function for more information. M156 allows Marlin to
  44. * request data from a device, the received data is then relayed into the serial
  45. * line for host interpretation.
  46. *
  47. */
  48. class TWIBus {
  49. private:
  50. /**
  51. * @brief Number of bytes on buffer
  52. * @description Number of bytes in the buffer waiting to be flushed to the bus
  53. */
  54. uint8_t buffer_s = 0;
  55. /**
  56. * @brief Internal buffer
  57. * @details A fixed buffer. TWI commands can be no longer than this.
  58. */
  59. char buffer[TWIBUS_BUFFER_SIZE];
  60. public:
  61. /**
  62. * @brief Target device address
  63. * @description The target device address. Persists until changed.
  64. */
  65. uint8_t addr = 0;
  66. /**
  67. * @brief Class constructor
  68. * @details Initialize the TWI bus and clear the buffer
  69. */
  70. TWIBus();
  71. /**
  72. * @brief Reset the buffer
  73. * @details Set the buffer to a known-empty state
  74. */
  75. void reset();
  76. /**
  77. * @brief Send the buffer data to the bus
  78. * @details Flush the buffer to the target address
  79. */
  80. void send();
  81. /**
  82. * @brief Add one byte to the buffer
  83. * @details Add a byte to the end of the buffer.
  84. * Silently fails if the buffer is full.
  85. *
  86. * @param c a data byte
  87. */
  88. void addbyte(const char c);
  89. /**
  90. * @brief Add some bytes to the buffer
  91. * @details Add bytes to the end of the buffer.
  92. * Concatenates at the buffer size.
  93. *
  94. * @param src source data address
  95. * @param bytes the number of bytes to add
  96. */
  97. void addbytes(char src[], uint8_t bytes);
  98. /**
  99. * @brief Add a null-terminated string to the buffer
  100. * @details Add bytes to the end of the buffer up to a nul.
  101. * Concatenates at the buffer size.
  102. *
  103. * @param str source string address
  104. */
  105. void addstring(char str[]);
  106. /**
  107. * @brief Set the target slave address
  108. * @details The target slave address for sending the full packet
  109. *
  110. * @param adr 7-bit integer address
  111. */
  112. void address(const uint8_t adr);
  113. /**
  114. * @brief Prefix for echo to serial
  115. * @details Echo a label, length, address, and "data:"
  116. *
  117. * @param bytes the number of bytes to request
  118. */
  119. static void echoprefix(uint8_t bytes, const char prefix[], uint8_t adr);
  120. /**
  121. * @brief Echo data on the bus to serial
  122. * @details Echo some number of bytes from the bus
  123. * to serial in a parser-friendly format.
  124. *
  125. * @param bytes the number of bytes to request
  126. */
  127. static void echodata(uint8_t bytes, const char prefix[], uint8_t adr);
  128. /**
  129. * @brief Echo data in the buffer to serial
  130. * @details Echo the entire buffer to serial
  131. * to serial in a parser-friendly format.
  132. *
  133. * @param bytes the number of bytes to request
  134. */
  135. void echobuffer(const char prefix[], uint8_t adr);
  136. /**
  137. * @brief Request data from the slave device and wait.
  138. * @details Request a number of bytes from a slave device.
  139. * Wait for the data to arrive, and return true
  140. * on success.
  141. *
  142. * @param bytes the number of bytes to request
  143. * @return status of the request: true=success, false=fail
  144. */
  145. bool request(const uint8_t bytes);
  146. /**
  147. * @brief Capture data from the bus into the buffer.
  148. * @details Capture data after a request has succeeded.
  149. *
  150. * @param bytes the number of bytes to request
  151. * @return the number of bytes captured to the buffer
  152. */
  153. uint8_t capture(char *dst, const uint8_t bytes);
  154. /**
  155. * @brief Flush the i2c bus.
  156. * @details Get all bytes on the bus and throw them away.
  157. */
  158. static void flush();
  159. /**
  160. * @brief Request data from the slave device, echo to serial.
  161. * @details Request a number of bytes from a slave device and output
  162. * the returned data to serial in a parser-friendly format.
  163. *
  164. * @param bytes the number of bytes to request
  165. */
  166. void relay(const uint8_t bytes);
  167. #if I2C_SLAVE_ADDRESS > 0
  168. /**
  169. * @brief Register a slave receive handler
  170. * @details Set a handler to receive data addressed to us
  171. *
  172. * @param handler A function to handle receiving bytes
  173. */
  174. inline void onReceive(const twiReceiveFunc_t handler) { Wire.onReceive(handler); }
  175. /**
  176. * @brief Register a slave request handler
  177. * @details Set a handler to send data requested from us
  178. *
  179. * @param handler A function to handle receiving bytes
  180. */
  181. inline void onRequest(const twiRequestFunc_t handler) { Wire.onRequest(handler); }
  182. /**
  183. * @brief Default handler to receive
  184. * @details Receive bytes sent to our slave address
  185. * and simply echo them to serial.
  186. */
  187. void receive(uint8_t bytes);
  188. /**
  189. * @brief Send a reply to the bus
  190. * @details Send the buffer and clear it.
  191. * If a string is passed, write it into the buffer first.
  192. */
  193. void reply(char str[]=NULL);
  194. inline void reply(const char str[]) { this->reply((char*)str); }
  195. #endif
  196. #if ENABLED(DEBUG_TWIBUS)
  197. /**
  198. * @brief Prints a debug message
  199. * @details Prints a simple debug message "TWIBus::function: value"
  200. */
  201. static void prefix(const char func[]);
  202. static void debug(const char func[], uint32_t adr);
  203. static void debug(const char func[], char c);
  204. static void debug(const char func[], char adr[]);
  205. static inline void debug(const char func[], uint8_t v) { debug(func, (uint32_t)v); }
  206. #endif
  207. };
  208. #endif //TWIBUS_H