| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- //
- // This code is in the public domain.
- //
- // License: CC0
- //
- #include <Wire.h>
- #define MSG_BUF_MAX 128
- #define ARDWORKER_I2C_ADDRESS 0x08
- char _tbuf[MSG_BUF_MAX];
- int i2c_msg_buf_n = 0,
- i2c_msg_buf_rdy = 0;
- char i2c_msg_buf[MSG_BUF_MAX];
- int serial_buf_s=0,
- serial_buf_n=0;
- char serial_buf[MSG_BUF_MAX];
- void setup() {
- i2c_msg_buf_rdy = 0;
- i2c_msg_buf[0] = '\0';
- i2c_msg_buf_n = 0;
- serial_buf_s=0;
- serial_buf_n=0;
- serial_buf[0] = '\0';
-
- Wire.begin(ARDWORKER_I2C_ADDRESS);
- Wire.onReceive(receive_i2c_data);
- Wire.onRequest(send_i2c_data);
- Serial.begin(115200);
- }
- void loop() {
- int i, _b, _cur;
- int _ser_print_rdy = 0;
-
- noInterrupts();
- if (Serial.available()) {
- _b = Serial.read();
- if (_b >= 0) {
-
- // Add to our circular serial_buf for later tranport
- // through to the i2c line.
- //
- if (serial_buf_n < MSG_BUF_MAX) {
- _cur = (serial_buf_s + serial_buf_n) % MSG_BUF_MAX;
- serial_buf[_cur] = (char)_b;
- serial_buf_n++;
- }
- }
- }
- interrupts();
- noInterrupts();
- if (i2c_msg_buf_rdy) {
- for (i=0; i<MSG_BUF_MAX; i++) {
- _tbuf[i] = i2c_msg_buf[i];
- }
-
- i2c_msg_buf[0] = '\0';
- i2c_msg_buf_n=0;
- i2c_msg_buf_rdy=0;
- _ser_print_rdy = 1;
- }
- interrupts();
- if (_ser_print_rdy) {
- Serial.print(_tbuf);
- }
- }
- void send_i2c_data() {
- int res;
- if (serial_buf_n > 0) {
- res = Wire.write((char)serial_buf[serial_buf_s]);
- serial_buf_n--;
- serial_buf_s++;
- serial_buf_s %= MSG_BUF_MAX;
- }
- }
- void receive_i2c_data(int howMany) {
- char c;
- while ( Wire.available()) {
- c = Wire.read();
- i2c_msg_buf[i2c_msg_buf_n++] = c;
- if (i2c_msg_buf_n >= MSG_BUF_MAX) {
- i2c_msg_buf_n = MSG_BUF_MAX-1;
- }
- if ((c == '\n') || (c == '\r')) {
- i2c_msg_buf[i2c_msg_buf_n] = '\0';
- // Our messages are terminated by '\n' and '\r'.
- // Once a message is received, shuttle it to the
- // serial line.
- //
- i2c_msg_buf_rdy=1;
- }
- }
- }
|