ardworker_rcv.ino 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // This code is in the public domain.
  3. //
  4. // License: CC0
  5. //
  6. #include <Wire.h>
  7. #define MSG_BUF_MAX 128
  8. #define ARDWORKER_I2C_ADDRESS 0x08
  9. char _tbuf[MSG_BUF_MAX];
  10. int i2c_msg_buf_n = 0,
  11. i2c_msg_buf_rdy = 0;
  12. char i2c_msg_buf[MSG_BUF_MAX];
  13. int serial_buf_s=0,
  14. serial_buf_n=0;
  15. char serial_buf[MSG_BUF_MAX];
  16. void setup() {
  17. i2c_msg_buf_rdy = 0;
  18. i2c_msg_buf[0] = '\0';
  19. i2c_msg_buf_n = 0;
  20. serial_buf_s=0;
  21. serial_buf_n=0;
  22. serial_buf[0] = '\0';
  23. Wire.begin(ARDWORKER_I2C_ADDRESS);
  24. Wire.onReceive(receive_i2c_data);
  25. Wire.onRequest(send_i2c_data);
  26. Serial.begin(115200);
  27. }
  28. void loop() {
  29. int i, _b, _cur;
  30. int _ser_print_rdy = 0;
  31. noInterrupts();
  32. if (Serial.available()) {
  33. _b = Serial.read();
  34. if (_b >= 0) {
  35. // Add to our circular serial_buf for later tranport
  36. // through to the i2c line.
  37. //
  38. if (serial_buf_n < MSG_BUF_MAX) {
  39. _cur = (serial_buf_s + serial_buf_n) % MSG_BUF_MAX;
  40. serial_buf[_cur] = (char)_b;
  41. serial_buf_n++;
  42. }
  43. }
  44. }
  45. interrupts();
  46. noInterrupts();
  47. if (i2c_msg_buf_rdy) {
  48. for (i=0; i<MSG_BUF_MAX; i++) {
  49. _tbuf[i] = i2c_msg_buf[i];
  50. }
  51. i2c_msg_buf[0] = '\0';
  52. i2c_msg_buf_n=0;
  53. i2c_msg_buf_rdy=0;
  54. _ser_print_rdy = 1;
  55. }
  56. interrupts();
  57. if (_ser_print_rdy) {
  58. Serial.print(_tbuf);
  59. }
  60. }
  61. void send_i2c_data() {
  62. int res;
  63. if (serial_buf_n > 0) {
  64. res = Wire.write((char)serial_buf[serial_buf_s]);
  65. serial_buf_n--;
  66. serial_buf_s++;
  67. serial_buf_s %= MSG_BUF_MAX;
  68. }
  69. }
  70. void receive_i2c_data(int howMany) {
  71. char c;
  72. while ( Wire.available()) {
  73. c = Wire.read();
  74. i2c_msg_buf[i2c_msg_buf_n++] = c;
  75. if (i2c_msg_buf_n >= MSG_BUF_MAX) {
  76. i2c_msg_buf_n = MSG_BUF_MAX-1;
  77. }
  78. if ((c == '\n') || (c == '\r')) {
  79. i2c_msg_buf[i2c_msg_buf_n] = '\0';
  80. // Our messages are terminated by '\n' and '\r'.
  81. // Once a message is received, shuttle it to the
  82. // serial line.
  83. //
  84. i2c_msg_buf_rdy=1;
  85. }
  86. }
  87. }