basic postman protocol tested.

This commit is contained in:
doohoyi 2019-12-10 20:59:52 +09:00
parent 3c3d5a6e7b
commit ffb8190b6b
4 changed files with 160 additions and 16 deletions

28
client/platformio.ini Normal file
View file

@ -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}

29
client/src/main.cpp Normal file
View file

@ -0,0 +1,29 @@
#include <Wire.h>
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() {
}

View file

@ -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}

View file

@ -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)
//============<parameters>============
//============</parameters>===========
//
// 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 <Arduino.h>
//
#include <painlessMesh.h>
//i2c
#include <Wire.h>
#define I2C_ADDR 3
#define POST_LENGTH 32
#define POST_BUFF_LEN (POST_LENGTH + 1)
// painless mesh
//painlessmesh
#include <painlessMesh.h>
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, &nothappyalone, &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() {