From ffb8190b6bf46b9f03d3c8b6163058a9b0403243 Mon Sep 17 00:00:00 2001 From: doohoyi Date: Tue, 10 Dec 2019 20:59:52 +0900 Subject: [PATCH] basic postman protocol tested. --- client/platformio.ini | 28 ++++++++++ client/src/main.cpp | 29 +++++++++++ platformio.ini | 4 +- src/main.cpp | 115 ++++++++++++++++++++++++++++++++++++------ 4 files changed, 160 insertions(+), 16 deletions(-) create mode 100644 client/platformio.ini create mode 100644 client/src/main.cpp diff --git a/client/platformio.ini b/client/platformio.ini new file mode 100644 index 0000000..1b94da1 --- /dev/null +++ b/client/platformio.ini @@ -0,0 +1,28 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +env_default = teensy35 + +[common] +lib_deps = + 721@3.0.2 ; TaskScheduler + +[env:teensy35] +platform = teensy@3.6.0 +board = teensy35 +framework = arduino +lib_deps = ${common.lib_deps} + +[env:teensy36] +platform = teensy@3.6.0 +board = teensy36 +framework = arduino +lib_deps = ${common.lib_deps} diff --git a/client/src/main.cpp b/client/src/main.cpp new file mode 100644 index 0000000..0adb486 --- /dev/null +++ b/client/src/main.cpp @@ -0,0 +1,29 @@ +#include +const int16_t I2C_ADDR = 3; + +void receiveEvent(int howMany) { + (void) howMany; + while (1 < Wire.available()) { + char c = Wire.read(); + Serial.print(c); + } + char x = Wire.read(); + Serial.println(x); +} + +void requestEvent() { + if (random(1000) == 0) { + Wire.write("[bcdefghabcdefghabcdefghabcdefg]"); //32 bytes + } else { + Wire.write(" "); // no letter to send + } +} + +void setup() { + Wire.begin(I2C_ADDR); + Wire.onRequest(requestEvent); + Wire.onReceive(receiveEvent); +} + +void loop() { +} diff --git a/platformio.ini b/platformio.ini index 224884e..215066c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,13 +19,13 @@ lib_deps = Wire 64 ; ArduinoJson 1269 ; Painless Mesh -src_filter = [env:nodemcuv2] platform = espressif8266 board = nodemcuv2 framework = ${common.framework} upload_speed = 921600 +upload_port = /dev/ttyUSB0 lib_deps = ESP8266WiFi Servo(esp8266) @@ -36,6 +36,7 @@ platform = espressif8266 board = huzzah framework = ${common.framework} upload_speed = 921600 +upload_port = /dev/ttyUSB0 lib_deps = ESP8266WiFi Servo(esp8266) @@ -48,6 +49,7 @@ platform = espressif32 board = featheresp32 framework = ${common.framework} upload_speed = 921600 +upload_port = /dev/ttyUSB0 lib_deps = 1826@1.0.3 ; AsyncTCP ${common.lib_deps} diff --git a/src/main.cpp b/src/main.cpp index efb877a..86ea1c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,9 +48,8 @@ #define MESH_PORT 5555 #define MESH_CHANNEL 5 // #define MESH_ANCHOR -#define MSG_LENGTH_MAX 256 #define LONELY_TO_DIE (30000) -//======================== +//======================= // // LED status indication @@ -60,6 +59,7 @@ // phase 1 // - LED => slow blinking (syncronized) // - + connected. +// #if defined(ARDUINO_ESP8266_NODEMCU) // nodemcuv2 #define LED_PIN 2 #elif defined(ARDUINO_ESP8266_ESP12) // huzzah @@ -70,13 +70,17 @@ #define LED_PERIOD (1111) #define LED_ONTIME (1) -// +//arduino #include -// -#include +//i2c +#include +#define I2C_ADDR 3 +#define POST_LENGTH 32 +#define POST_BUFF_LEN (POST_LENGTH + 1) -// painless mesh +//painlessmesh +#include painlessMesh mesh; //scheduler @@ -112,7 +116,7 @@ void taskStatusBlink_steadyOff() { onFlag = false; } -// happy or lonely +//task #1 : happy or lonely // --> automatic reset after some time of 'loneliness (disconnected from any node)' void nothappyalone() { static bool isConnected_prev = false; @@ -135,7 +139,7 @@ void nothappyalone() { // esp32 doesn't support 'reset()' yet... // (restart() is framework-supported, reset() is more forced hardware-reset-action) #else -#error unknown +#error unknown esp. #endif } } @@ -144,11 +148,92 @@ void nothappyalone() { } Task nothappyalone_task(1000, TASK_FOREVER, ¬happyalone, &runner, true); // by default, ENABLED. +//task #2 : regular post collection +void collect_post() { + // + static char letter_outro[POST_BUFF_LEN] = "................................"; + // ask a letter and collect the feedback. + Wire.requestFrom(I2C_ADDR, POST_LENGTH); + // error flag + bool letter_is_good = false; + // check the first byte + char first = '.'; + // automatically match start byte. + while (Wire.available()) { + first = Wire.read(); + if (first == '[') { + // client want to give me a letter. + letter_outro[0] = first; + // matched! + letter_is_good = true; + break; + } else if (first == ' ') { + // client says nothing to send. + Serial.print("."); // nothing to send. + return; + } + } + // + if (letter_is_good == false) { + // no more letters, but no valid char. + Serial.print("?"); // wrong client. + return; + } else if (letter_is_good == true) { + // get more contents + for (int i = 1; i < (POST_LENGTH-1); i++) { + if (Wire.available()) { + letter_outro[i] = Wire.read(); + } else { + // hmm.. letter is too short. + letter_outro[i] = '.'; // fill-out with dots. + Serial.print("$"); // too $hort msg. + letter_is_good = false; + } + } + // the last byte + char last = '.'; + if (Wire.available()) { + letter_outro[POST_LENGTH-1] = last = Wire.read(); + if (last != ']') { + // hmm.. last byte is strange + Serial.print("#"); // last byte error. + letter_is_good = false; + } + } else { + // hmm.. letter is too short. + letter_outro[POST_LENGTH-1] = '.'; // fill-out with dots. + Serial.print("$"); // too $hort msg. + letter_is_good = false; + } + // terminal char. + letter_outro[POST_LENGTH] = '\0'; + } + // no good letter, we discard. + if (letter_is_good == false) { + return; + } + // or, post it. + if (isConnected == true) { + mesh.sendBroadcast(String(letter_outro)); + Serial.print("sendBroadcast: "); + Serial.println(letter_outro); + } else { + Serial.print("_"); // disconnected. + } +} +Task collect_post_task(10, TASK_FOREVER, &collect_post, &runner, true); // by default, ENABLED +//MAYBE... 10ms is too fast? move this to the loop() then? + // mesh callbacks void receivedCallback(uint32_t from, String & msg) { // REQUIRED - // give it to I2C device - ///// - Serial.print("Got one."); + Serial.print("got msg.: "); + Serial.println(msg); + // truncate any extra. letters. + msg = msg.substring(0, POST_LENGTH); // (0) ~ (POST_LENGTH-1) + // send whatever letter we postmans trust other postman. + Wire.beginTransmission(I2C_ADDR); + Wire.write(msg.c_str()); + Wire.endTransmission(); } void changedConnectionCallback() { // check status -> modify status LED @@ -171,7 +256,7 @@ void changedConnectionCallback() { } // let I2C device know ///// - Serial.println("Conn. change."); + Serial.println("hi. client, we ve got a change in the net."); } void newConnectionCallback(uint32_t nodeId) { changedConnectionCallback(); @@ -213,7 +298,7 @@ void setup() { delay(100); Serial.println("hi, postman ready."); #if defined(DISABLE_AP) - Serial.println("INFO: we are in the WIFI_STA mode!"); + Serial.println("!NOTE!: we are in the WIFI_STA mode!"); #endif //understanding what is 'the nodeId' ==> last 4 bytes of 'softAPmacAddress' @@ -246,8 +331,8 @@ void setup() { // nodeId (hex) : 2D370A07 // MAC : B6, E6, 2D, 37, A, 7 - //i2c - Serial.println("TODO. we need to setup I2C."); + //i2c master + Wire.begin(); } void loop() {