From a6fcbde70bd484bdef781d3b11935ca43fa53770 Mon Sep 17 00:00:00 2001 From: Streamliner Date: Sun, 1 Dec 2019 11:31:53 -0600 Subject: [PATCH 01/13] Refactor system monitor to become its own sensor, eliminate hard-coded telemetry packet --- external/sensor_protocol | 2 +- lib/WaggleNetNet | 2 +- src/main.cpp | 6 +--- src/system.h | 74 ++++++++++++++-------------------------- 4 files changed, 28 insertions(+), 56 deletions(-) diff --git a/external/sensor_protocol b/external/sensor_protocol index 487ebe8..620b231 160000 --- a/external/sensor_protocol +++ b/external/sensor_protocol @@ -1 +1 @@ -Subproject commit 487ebe8bde349a7c8db3732a69344d62be869bd7 +Subproject commit 620b2314257c7af9e2829f670b066b95334a60d1 diff --git a/lib/WaggleNetNet b/lib/WaggleNetNet index d4f9a18..6976993 160000 --- a/lib/WaggleNetNet +++ b/lib/WaggleNetNet @@ -1 +1 @@ -Subproject commit d4f9a181585058c7161806dc35f96432021bcb80 +Subproject commit 69769938a53cc5587ea646fc8ec596189b590a0e diff --git a/src/main.cpp b/src/main.cpp index e965a8e..18ca90f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,15 +10,11 @@ WaggleNode node(RADIO_CE, RADIO_CSN); -void reportSysStats() { - transmit_power_stats(node); -} - void reportTelemetry() { collectData(node); } -Ticker systemStatsTimer(reportSysStats, 10000); +Ticker systemStatsTimer(updateSystemMonitor, 10000); Ticker telemetryTimer(reportTelemetry, 5000); void setup() { diff --git a/src/system.h b/src/system.h index 3c556c6..968e661 100644 --- a/src/system.h +++ b/src/system.h @@ -1,16 +1,17 @@ #pragma once #include "Arduino.h" +#include "sensor.h" #include "comm.h" #include "pinout.h" #define TYPE_WN_NODE_SYSTEM_STATUS 0x001A -struct system_t { - float solar_volt; - float battery_volt; - bool charging; - bool charge_ready; -}; +Sensor systemMonitorSensor(4); + +float solar_volt; +float battery_volt; +bool charging; +bool charge_ready; float computeVoltage(int pin){ int sensorValue = analogRead(pin); @@ -19,7 +20,16 @@ float computeVoltage(int pin){ return voltage; } -system_t getPowerReadouts() { +void initSystemMonitor() { + systemMonitorSensor.type = TYPE_WN_NODE_SYSTEM_STATUS; + systemMonitorSensor.address = 0; + systemMonitorSensor.addFloatEntry(solar_volt); + systemMonitorSensor.addFloatEntry(battery_volt); + systemMonitorSensor.addBoolEntry(charging); + systemMonitorSensor.addBoolEntry(charge_ready); +} + +void updateSystemMonitor() { analogReference(INTERNAL); if (!(ADMUX >> REFS1)) { analogRead(A6); @@ -29,46 +39,12 @@ system_t getPowerReadouts() { analogRead(A6); } // Get my voltage right - system_t result; - result.battery_volt = computeVoltage(BATT_SENS); - result.solar_volt = computeVoltage(SOLAR_SENS); - result.charging = !digitalRead(CHRG_CHARGING); - result.charge_ready = !digitalRead(CHRG_STANDBY); - return result; + battery_volt = computeVoltage(BATT_SENS); + solar_volt = computeVoltage(SOLAR_SENS); + charging = !digitalRead(CHRG_CHARGING); + charge_ready = !digitalRead(CHRG_STANDBY); + systemMonitorSensor.changed(0); + systemMonitorSensor.changed(1); + systemMonitorSensor.changed(2); + systemMonitorSensor.changed(3); } - -void transmit_power_stats(WaggleNode& node) { - auto readouts = getPowerReadouts(); - // Data size - // Header 15 - // Entry overhead + 8 - // All entries + 10 - // -------------------- - // total = 33 - const size_t data_size = 33; - uint8_t* buffer = new uint8_t[data_size]; - *(uint32_t*)buffer = node.nodeID; - *(uint32_t*)(buffer+5) = 0; // Sensor ID - *(uint32_t*)(buffer+9) = TYPE_WN_NODE_SYSTEM_STATUS; // Sensor Type - buffer[4] = 0; // reserved - buffer[13] = 0; // reserved - buffer[14] = 4; // # of entries - // Entry 1: Solar volt - buffer[15] = 0; // Entry ID - buffer[16] = sizeof(float); // Data size - memcpy(buffer+17, &(readouts.solar_volt), sizeof(float)); - // Entry 2: Battery volt - buffer[21] = 1; // Entry ID - buffer[22] = sizeof(float); // Data size - memcpy(buffer+23, &(readouts.battery_volt), sizeof(float)); - // Entry 3: Charging - buffer[27] = 2; // Entry ID - buffer[28] = sizeof(bool); // Data size - memcpy(buffer+29, &(readouts.charging), sizeof(bool)); - // Entry 4: Charge ready - buffer[30] = 3; // Entry ID - buffer[31] = sizeof(bool); // Data size - memcpy(buffer+32, &(readouts.charge_ready), sizeof(bool)); - node.send_telemetry(buffer, data_size); - delete[] buffer; -} \ No newline at end of file From e7f6bc09c789740819f2a795f41e3d2741606454 Mon Sep 17 00:00:00 2001 From: Streamliner Date: Sun, 1 Dec 2019 15:59:30 -0600 Subject: [PATCH 02/13] Uplink data into local sensors --- external/sensor_protocol | 2 +- src/comm.cpp | 4 +- src/sensing.cpp | 105 +++++++++++++++++++++++++++++++++++++++ src/sensing.h | 82 ++---------------------------- 4 files changed, 114 insertions(+), 79 deletions(-) create mode 100644 src/sensing.cpp diff --git a/external/sensor_protocol b/external/sensor_protocol index 620b231..fdf9080 160000 --- a/external/sensor_protocol +++ b/external/sensor_protocol @@ -1 +1 @@ -Subproject commit 620b2314257c7af9e2829f670b066b95334a60d1 +Subproject commit fdf90804918985c7f57b757ee9a0587d2439631e diff --git a/src/comm.cpp b/src/comm.cpp index c87ab31..c1fdfdd 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -1,4 +1,5 @@ #include "comm.h" +#include "sensing.h" #include "pinout.h" WaggleNode::WaggleNode(uint8_t CE_pin, uint8_t CS_pin) @@ -28,7 +29,8 @@ void WaggleNode::update() { size_t data_size = network.peek(header); byte *payload = new byte[data_size]; network.read(header, payload, data_size); - // TODO: Callback for received payload + // Write data into the sensor + writeData(payload, data_size); delete[] payload; } } diff --git a/src/sensing.cpp b/src/sensing.cpp new file mode 100644 index 0000000..eec88cf --- /dev/null +++ b/src/sensing.cpp @@ -0,0 +1,105 @@ +#include "sensing.h" + +SensorManager manager; + +void initSensing() { + manager.begin(); +} + +void transmitSensorList(WaggleNode& node) { + uint8_t msg_size = manager.getSensorCount()*8 + 7; + uint8_t msg[msg_size]; + // Prepare the sysmsg header + // Schema: https://wagglenet.atlassian.net/wiki/spaces/SPORT/pages/13238331/Node-to-Router+Data+Format + *(uint32_t*)msg = node.nodeID; + msg[4] = 0; + uint8_t pos = 5; + for (int sensor_idx = 0; sensor_idx < manager.getSensorCount(); sensor_idx++) { + auto sensor = manager.getSensor(sensor_idx); + *(uint32_t*)(msg+pos) = (uint32_t)sensor->address; + pos += 4; + *(uint32_t*)(msg+pos) = (uint32_t)sensor->type; + pos += 4; + } + // Report all the sensors to router + node.send_telemetry(msg, msg_size, CH_SYSMSG); +} + +void collectData(WaggleNode& node) { + for (int sensor_idx = 0; sensor_idx < manager.getSensorCount(); sensor_idx++) { + Serial.print(F("-!>\tCOLL\tSensor.Index\t")); + Serial.println(sensor_idx); + manager.collect(sensor_idx); + auto sensor = manager.getSensor(sensor_idx); + // FIRST PASS: Compute size of message block + uint8_t block_size = 15; // Headers + uint8_t num_entry = 0; + for (int entry = 0; entry < sensor->getSize(); entry++) { + if (sensor->hasChanged(entry)) { + block_size += sensor->getLength(entry) + 2; + num_entry ++; + } + } + Serial.print(F("-!>\tSEND\tMessage.Size\t")); + Serial.println(block_size); + Serial.print(F("-!>\tSEND\tMessage.Entries\t")); + Serial.println(num_entry); + if (!num_entry) return; + // SECOND PASS: Populate the message block + uint8_t* msg = new uint8_t[block_size]; + // Populate node header + *(uint32_t*)msg = node.nodeID; + msg[4] = 0; + // Populate sensor header + *(uint32_t*)(msg+5) = sensor->address; + *(uint32_t*)(msg+9) = sensor->type; + msg[13] = 0; + // Populate entry number + msg[14] = num_entry; + uint8_t write_head = 15; // Write from here + for (int entry = 0; entry < sensor->getSize(); entry++) { + // if (sensor->hasChanged(entry)) { + if (!sensor->hasChanged(entry)) continue; + msg[write_head] = entry; + msg[write_head+1] = sensor->getLength(entry); + auto& msg_size = msg[write_head+1]; + memcpy(msg+write_head+2, sensor->getData(entry), msg_size); + write_head += 2 + msg_size; + Serial.print(F("-!>\tCOLL\tCollect.Entry\t")); + Serial.println(entry); + Serial.print(F("-!>\tCOLL\tCollect.Size\t")); + Serial.println(msg_size); + // } + } + // Transmit the message + node.send_telemetry(msg, block_size); + // Clean it up + delete[] msg; + } +} + +void writeData(byte* buffer, byte size) { + // Failure mode: If size cannot even contain header, return + if (size <= 15) return; + auto sensor_address = *(uint32_t*)(buffer+5); + auto sensor_type = *(uint32_t*)(buffer+9); + // First we validate if the type matches + auto sensorIdx = manager.getIndexByAddress(sensor_address); + // Failure mode: Target sensor not found + if (sensorIdx >= manager.getSensorCount()) return; + auto& sensor = *(manager.getSensor(sensorIdx)); + // Now we parse out the fields + auto numEntries = *(byte*)(buffer+14); + size_t base_ptr = 15; // This is our operating head + for (int i = 0; i < numEntries; i++) { + auto entryIdx = *(byte*)(buffer+base_ptr); + auto entryLength = *(byte*)(buffer+base_ptr+1); + // Failure mode: Length mismatches + if (sensor.getLength(sensorIdx) != entryLength) return; + // Failure mode: Length overshoots message size + if (entryLength + 2 + base_ptr > size) return; + memcpy(sensor.getData(entryIdx), buffer+base_ptr+2, entryLength); + sensor.changed(entryIdx); + base_ptr += entryLength + 2; + } +} diff --git a/src/sensing.h b/src/sensing.h index 45a8501..c7654c7 100644 --- a/src/sensing.h +++ b/src/sensing.h @@ -2,80 +2,8 @@ #include "sensor.h" #include "comm.h" -SensorManager manager; - -void initSensing() { - manager.begin(); -} - -void transmitSensorList(WaggleNode& node) { - uint8_t msg_size = manager.getSensorCount()*8 + 7; - uint8_t msg[msg_size]; - // Prepare the sysmsg header - // Schema: https://wagglenet.atlassian.net/wiki/spaces/SPORT/pages/13238331/Node-to-Router+Data+Format - *(uint32_t*)msg = node.nodeID; - msg[4] = 0; - uint8_t pos = 5; - for (int sensor_idx = 0; sensor_idx < manager.getSensorCount(); sensor_idx++) { - auto sensor = manager.getSensor(sensor_idx); - *(uint32_t*)(msg+pos) = (uint32_t)sensor->address; - pos += 4; - *(uint32_t*)(msg+pos) = (uint32_t)sensor->type; - pos += 4; - } - // Report all the sensors to router - node.send_telemetry(msg, msg_size, CH_SYSMSG); -} - -void collectData(WaggleNode& node) { - for (int sensor_idx = 0; sensor_idx < manager.getSensorCount(); sensor_idx++) { - Serial.print(F("-!>\tCOLL\tSensor.Index\t")); - Serial.println(sensor_idx); - manager.collect(sensor_idx); - auto sensor = manager.getSensor(sensor_idx); - // FIRST PASS: Compute size of message block - uint8_t block_size = 15; // Headers - uint8_t num_entry = 0; - for (int entry = 0; entry < sensor->getSize(); entry++) { - if (sensor->hasChanged(entry)) { - block_size += sensor->getLength(entry) + 2; - num_entry ++; - } - } - Serial.print(F("-!>\tSEND\tMessage.Size\t")); - Serial.println(block_size); - Serial.print(F("-!>\tSEND\tMessage.Entries\t")); - Serial.println(num_entry); - if (!num_entry) return; - // SECOND PASS: Populate the message block - uint8_t* msg = new uint8_t[block_size]; - // Populate node header - *(uint32_t*)msg = node.nodeID; - msg[4] = 0; - // Populate sensor header - *(uint32_t*)(msg+5) = sensor->address; - *(uint32_t*)(msg+9) = sensor->type; - msg[13] = 0; - // Populate entry number - msg[14] = num_entry; - uint8_t write_head = 15; // Write from here - for (int entry = 0; entry < sensor->getSize(); entry++) { - // if (sensor->hasChanged(entry)) { - if (!sensor->hasChanged(entry)) continue; - msg[write_head] = entry; - msg[write_head+1] = sensor->getLength(entry); - auto& msg_size = msg[write_head+1]; - memcpy(msg+write_head+2, sensor->getData(entry), msg_size); - write_head += 2 + msg_size; - Serial.print(F("-!>\tCOLL\tCollect.Entry\t")); - Serial.println(entry); - Serial.print(F("-!>\tCOLL\tCollect.Size\t")); - Serial.println(msg_size); - // } - } - // Transmit the message - node.send_telemetry(msg, block_size); - // Clean it up - delete[] msg; - } -} \ No newline at end of file +extern SensorManager manager; +void initSensing(); +void transmitSensorList(WaggleNode& node); +void collectData(WaggleNode& node); +void writeData(byte* buffer, byte size); From e36d9c32954e900bc81c24097a97063946b4d40a Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Mon, 2 Dec 2019 10:46:00 -0600 Subject: [PATCH 03/13] merge --- external/sensor_protocol | 2 +- src/sensing.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/external/sensor_protocol b/external/sensor_protocol index fdf9080..0fbecb9 160000 --- a/external/sensor_protocol +++ b/external/sensor_protocol @@ -1 +1 @@ -Subproject commit fdf90804918985c7f57b757ee9a0587d2439631e +Subproject commit 0fbecb913a80ee2ce9d9a9775711a03b010ca59b diff --git a/src/sensing.cpp b/src/sensing.cpp index eec88cf..74ca14e 100644 --- a/src/sensing.cpp +++ b/src/sensing.cpp @@ -69,6 +69,8 @@ void collectData(WaggleNode& node) { Serial.println(entry); Serial.print(F("-!>\tCOLL\tCollect.Size\t")); Serial.println(msg_size); + // Set the entry as not changed + sensor->changed(entry, false); // } } // Transmit the message From 6bba990e51ec2113767a15e4b1b4ae02b6b48d0f Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Mon, 2 Dec 2019 10:46:31 -0600 Subject: [PATCH 04/13] Get updated with wnn on master --- lib/WaggleNetNet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WaggleNetNet b/lib/WaggleNetNet index 6976993..3d3f3df 160000 --- a/lib/WaggleNetNet +++ b/lib/WaggleNetNet @@ -1 +1 @@ -Subproject commit 69769938a53cc5587ea646fc8ec596189b590a0e +Subproject commit 3d3f3df455ec0795baacc9f90be5947333dc6377 From 9e71b02d4523b2b7ad967b6b7a77a870205ce3dd Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Mon, 2 Dec 2019 10:58:10 -0600 Subject: [PATCH 05/13] Bugfix: System monitor not registered as a sensor --- src/system.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/system.h b/src/system.h index 968e661..d5421ab 100644 --- a/src/system.h +++ b/src/system.h @@ -1,6 +1,7 @@ #pragma once #include "Arduino.h" #include "sensor.h" +#include "sensing.h" #include "comm.h" #include "pinout.h" @@ -27,6 +28,7 @@ void initSystemMonitor() { systemMonitorSensor.addFloatEntry(battery_volt); systemMonitorSensor.addBoolEntry(charging); systemMonitorSensor.addBoolEntry(charge_ready); + manager.addSensor(&systemMonitorSensor); } void updateSystemMonitor() { From f47953286feae19199fff8dd2c91e6d05037d20e Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Tue, 21 Jan 2020 03:35:44 -0600 Subject: [PATCH 06/13] Add missing F-string annotation to strings --- src/comm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/comm.cpp b/src/comm.cpp index c1fdfdd..dee1b99 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -68,7 +68,7 @@ uint8_t WaggleNode::write_(void *payload, uint8_t ch, uint8_t len) { // If a write fails, check connectivity to the mesh network if (!mesh.checkConnection()) { // refresh the network address - Serial.println("Renewing Address"); + Serial.println(F("Renewing Address")); mesh.renewAddress(); return 2; } else return 1; From 090a34f4144fc239f1a7db180cc09608c7240165 Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Tue, 21 Jan 2020 03:35:53 -0600 Subject: [PATCH 07/13] AVR watchdog timers on nodes --- src/main.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 18ca90f..481e897 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #define UNO +#include #include "Ticker.h" #include "system.h" #include "sensing.h" @@ -11,6 +12,7 @@ WaggleNode node(RADIO_CE, RADIO_CSN); void reportTelemetry() { + Serial.println(F("Updating telemetry...")); collectData(node); } @@ -18,8 +20,15 @@ Ticker systemStatsTimer(updateSystemMonitor, 10000); Ticker telemetryTimer(reportTelemetry, 5000); void setup() { + wdt_enable(WDTO_8S); + signal_init(); + signal_startup(); + wdt_reset(); // Setting up everything Serial.begin(115200); + Serial.print(F("RESET>\t")); + Serial.println(MCUSR, HEX); + MCUSR &= 0xf0; // Clear the flag Serial.println(F("!>BOOT")); // Get DFU started if (is_dfu_available()) { @@ -27,27 +36,36 @@ void setup() { uint32_t flag = millis(); while (millis() < flag + 1000) { if (Serial.available() && Serial.read() == 'D') { - while (1) dfu_loop(); + while (1) { + dfu_loop(); + wdt_reset(); // Hush doggy + } } } } + + // Actually start a bunch of timeouts + wdt_reset(); // Hush doggy Serial.setTimeout(5000); analogReference(INTERNAL); - signal_init(); - signal_startup(); // Configure Net Serial.println(F(">>Starting node")); auto result = node.begin(); signal_connection_begin(result); Serial.println(F(">>Starting sensing")); + wdt_reset(); // Hush doggy initSensing(); transmitSensorList(node); + initSystemMonitor(); Serial.println(F(">>Starting event loop")); + wdt_reset(); // Hush doggy systemStatsTimer.start(); telemetryTimer.start(); + wdt_reset(); // Hush doggy } void loop() { + wdt_reset(); // Hush doggy node.update(); systemStatsTimer.update(); telemetryTimer.update(); From 6ac5c4751451fe1ca40450d5d3bdeccc885d0ad4 Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Tue, 21 Jan 2020 03:47:47 -0600 Subject: [PATCH 08/13] Fix pinout for voltage sensing pins --- src/pinout.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pinout.h b/src/pinout.h index 1e29358..eb32d5a 100644 --- a/src/pinout.h +++ b/src/pinout.h @@ -3,8 +3,8 @@ #define CHRG_CHARGING 7 #define CHRG_STANDBY 8 -#define BATT_SENS A6 -#define SOLAR_SENS A7 +#define SOLAR_SENS A6 +#define BATT_SENS A7 #define LED_BLUE 6 #define LED_ORANGE 4 From cc43ec04d28867b0301131ed0820cd629cacdbfd Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Tue, 21 Jan 2020 03:47:58 -0600 Subject: [PATCH 09/13] Fixed node monitoring SDS schema --- src/system.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system.h b/src/system.h index d5421ab..ce09135 100644 --- a/src/system.h +++ b/src/system.h @@ -24,8 +24,8 @@ float computeVoltage(int pin){ void initSystemMonitor() { systemMonitorSensor.type = TYPE_WN_NODE_SYSTEM_STATUS; systemMonitorSensor.address = 0; - systemMonitorSensor.addFloatEntry(solar_volt); systemMonitorSensor.addFloatEntry(battery_volt); + systemMonitorSensor.addFloatEntry(solar_volt); systemMonitorSensor.addBoolEntry(charging); systemMonitorSensor.addBoolEntry(charge_ready); manager.addSensor(&systemMonitorSensor); From 6074eb43b203bddce6fd463df16cc1250e3677da Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Wed, 22 Jan 2020 21:06:43 -0600 Subject: [PATCH 10/13] Enabling callback from PnP upstream --- external/sensor_protocol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/sensor_protocol b/external/sensor_protocol index 0fbecb9..2f38a08 160000 --- a/external/sensor_protocol +++ b/external/sensor_protocol @@ -1 +1 @@ -Subproject commit 0fbecb913a80ee2ce9d9a9775711a03b010ca59b +Subproject commit 2f38a08ab9e19ef07109ddb595961bc53c73798c From 5c15ee80068d76096fe0c02469ad1ef1603017e3 Mon Sep 17 00:00:00 2001 From: Jimmy He Date: Wed, 22 Jan 2020 21:17:14 -0600 Subject: [PATCH 11/13] System control experiment for remote toggling of LEDs --- src/main.cpp | 1 + src/system.h | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 481e897..31f21a1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,6 +57,7 @@ void setup() { initSensing(); transmitSensorList(node); initSystemMonitor(); + initSystemControlExperiment(); Serial.println(F(">>Starting event loop")); wdt_reset(); // Hush doggy systemStatsTimer.start(); diff --git a/src/system.h b/src/system.h index ce09135..1ed1d34 100644 --- a/src/system.h +++ b/src/system.h @@ -6,14 +6,19 @@ #include "pinout.h" #define TYPE_WN_NODE_SYSTEM_STATUS 0x001A +#define TYPE_WN_NODE_SYSTEM_CONTROL_EXPERIMENT 0x00F1 Sensor systemMonitorSensor(4); +Sensor systemControlExperimentSensor(2); float solar_volt; float battery_volt; bool charging; bool charge_ready; +bool blueLightOn; +bool orangeLightOn; + float computeVoltage(int pin){ int sensorValue = analogRead(pin); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V): @@ -50,3 +55,20 @@ void updateSystemMonitor() { systemMonitorSensor.changed(2); systemMonitorSensor.changed(3); } + +void handleWriteSystemExperimentLED(uint8_t entry_index) { + if (entry_index == 0) { // blue + digitalWrite(LED_BLUE, blueLightOn); + } else { // orange + digitalWrite(LED_ORANGE, orangeLightOn); + } +} + +void initSystemControlExperiment() { + systemControlExperimentSensor.type = TYPE_WN_NODE_SYSTEM_CONTROL_EXPERIMENT; + systemControlExperimentSensor.address = 0x10; + systemControlExperimentSensor.addData((void*)&blueLightOn, sizeof(blueLightOn), (1 << CFLAG_RW_LOC) | DATA_TYPE_BOOL); + systemControlExperimentSensor.addData((void*)&orangeLightOn, sizeof(blueLightOn), (1 << CFLAG_RW_LOC) | DATA_TYPE_BOOL); + systemControlExperimentSensor.setCallback(0, handleWriteSystemExperimentLED); + systemControlExperimentSensor.setCallback(1, handleWriteSystemExperimentLED); +} From be2cdd1c830cf9feb2a6ce653c905852b73e66a9 Mon Sep 17 00:00:00 2001 From: Yixuan Wang Date: Sun, 2 Feb 2020 21:02:00 -0600 Subject: [PATCH 12/13] dfu test 1 --- src/comm.cpp | 43 ++++++++++++++++++++++++++++++------------- src/comm.h | 4 ++-- src/dfu.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 81 insertions(+), 18 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index c87ab31..b3a1e5a 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -49,26 +49,43 @@ uint32_t WaggleNode::get_sig_byte_() { return res; } -uint8_t WaggleNode::send_telemetry(void* payload, uint8_t len, uint8_t channel) { - return write_(payload, channel, len); +uint8_t WaggleNode::send_telemetry(void* payload, uint8_t len, uint8_t channel,nodeid_t dest) { + return write_(payload, channel, len, dest); } -uint8_t WaggleNode::write_(void *payload, uint8_t ch, uint8_t len) { +uint8_t WaggleNode::write_(void *payload, uint8_t ch, uint8_t len, nodeid_t dest) { /* Returns: - 0: Normal - 1: Send failed, test OK - 2: Send failed, address is lost (will block) - 3: Invalid send call */ - auto my_id = mesh.getNodeID(mesh.mesh_address); - if (my_id < 0 || my_id != nodeID) mesh.renewAddress(); - if (!mesh.write(payload, ch, len)) { - // If a write fails, check connectivity to the mesh network - if (!mesh.checkConnection()) { - // refresh the network address - Serial.println("Renewing Address"); + if(dest == 0 ){ + auto my_id = mesh.getNodeID(mesh.mesh_address); + if (my_id < 0 || my_id != nodeID) mesh.renewAddress(); + if (!mesh.write(payload, ch, len)) { + // If a write fails, check connectivity to the mesh network + if (!mesh.checkConnection()) { + // refresh the network address + Serial.println("Renewing Address"); + mesh.renewAddress(); + return 2; + } else return 1; + } else return 0; + } + //dest = 1 for dfu send_packet + else{ mesh.renewAddress(); - return 2; - } else return 1; - } else return 0; + if (!mesh.write(payload, ch, len)) { + // If a write fails, check connectivity to the mesh network + if (!mesh.checkConnection()) { + // refresh the network address + Serial.println("Renewing Address"); + mesh.renewAddress(); + return 2; + } else return 1; + } else return 0; + + + } } diff --git a/src/comm.h b/src/comm.h index ae27fdf..488e827 100644 --- a/src/comm.h +++ b/src/comm.h @@ -24,9 +24,9 @@ class WaggleNode { bool begin(); bool begin(uint8_t radio_channel); void update(); - uint8_t send_telemetry(void* payload, uint8_t len, uint8_t channel = CH_TELEMETRY); + uint8_t send_telemetry(void* payload, uint8_t len, uint8_t channel = CH_TELEMETRY, nodeid_t dest); nodeid_t nodeID; private: - uint8_t write_(void *payload, uint8_t ch, uint8_t len); + uint8_t write_(void *payload, uint8_t ch, uint8_t len, nodeid_t dest); uint32_t get_sig_byte_(); }; diff --git a/src/dfu.cpp b/src/dfu.cpp index 4dd6418..aec5524 100644 --- a/src/dfu.cpp +++ b/src/dfu.cpp @@ -1,5 +1,5 @@ #include "dfu.h" - +#include "comm.h" #define DFU_STATE_MAIN 0 #define DFU_STATE_SETID 1 @@ -8,8 +8,10 @@ #define DFU_STATE_HUMAN 200 #define DFU_STATE_HELP 201 + uint8_t dfu_state = DFU_STATE_MAIN; uint8_t dfu_human_mode = false; +uint8_t dfu_update_flag = false; int8_t parse_hex_from_char(char ch) { if (ch >= '0' && ch <= '9') @@ -45,21 +47,39 @@ void dfu_loop() { case DFU_STATE_NUKE: dfu_nuke(); break; + case DFU_STATE_ACTIVATE: + dfu_activate(); + break; + case DFU_STATE_RENEW_ADDRESS: + dfu_renew_address(); + break; + case DFU_STATE_SEND_PACKET: + dfu_send_packet(); + break; } } + + + + void dfu_help() { Serial.println(F("DFU Mode Instructions:")); Serial.println(F("S=setid Set Node ID in EEPROM")); Serial.println(F("T=test Test radio and print result")); Serial.println(F("N=nuke Nuke the DFU for good")); Serial.println(F("H=human Enter / Exit human mode; detailed response")); + Serial.println(F("A=activate Activate the node")); + Serial.println(F("R=Renew Renew node address")); + Serial.println(F("P=send Send packet")); dfu_state = DFU_STATE_MAIN; } void dfu_main() { Serial.print(F("DFU>")); - while(!Serial.available()); + while(!Serial.available()){ + dfu_activate(); + } char c = Serial.read(); // Echo back the char Serial.println(c); @@ -77,6 +97,12 @@ void dfu_main() { case 'H': case 'h': dfu_state = DFU_STATE_HUMAN; break; + case 'A': case 'a': + dfu_state = DFU_STATE_ACTIVATE; + case 'R': case 'r': + dfu_state = DFU_STATE_RENEW_ADDRESS; + case 'P': case 'p': + dfu_state = DFU_STATE_SEND_PACKET; default: dfu_state = DFU_STATE_HELP; break; @@ -108,7 +134,7 @@ void dfu_setid() { Serial.print(F("?>")); // Expect 8 characters while (ds_setid_counter < 8) { - if (!Serial.available()) continue; + if (!Serial.available()) dfu_activate(); char ch = Serial.read(); Serial.write(ch); // Echo back this char int8_t data = parse_hex_from_char(ch); @@ -162,3 +188,23 @@ void dfu_nuke() { // Perform a hard reset asm volatile (" jmp 0"); } + +void dfu_activate() { + update(); + return 0; +} + +void dfu_renew_address(){ + mesh.renewAddress(); + Serial.println(F("Finish renew address")); + return 0; +} + +void dfu_send_packet(){ + char dest=Serial.read(); + + + // payload :destination address, length, payload + send_telemetry(dest, strlen(dest), CH_TELEMETRY, 1) + +} \ No newline at end of file From 67ea547b374797934e07e4dfb20c4fede9da0949 Mon Sep 17 00:00:00 2001 From: Yixuan Wang Date: Thu, 6 Feb 2020 18:24:48 -0600 Subject: [PATCH 13/13] dfu.cpp update 2 --- src/dfu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dfu.cpp b/src/dfu.cpp index aec5524..2ad2055 100644 --- a/src/dfu.cpp +++ b/src/dfu.cpp @@ -190,7 +190,10 @@ void dfu_nuke() { } void dfu_activate() { - update(); + node.begin() + //set flag + dfu_update_flag = true; + return 0; }