diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 0ca9fe3..e8e6b14 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,6 @@ { "board": "bsfrance:avr:lora32u4", "sketch": "crossbow/crossbow.ino", - "port": "COM5", + "port": "COM7", "output": "../build" } \ No newline at end of file diff --git a/crossbow/crossbow.ino b/crossbow/crossbow.ino index 0999751..9f538f4 100644 --- a/crossbow/crossbow.ino +++ b/crossbow/crossbow.ino @@ -15,7 +15,6 @@ Copyright (c) 20xx, MPL Contributor1 contrib1@example.net #include "qsp.h" #include "sbus.h" #include "platform_node.h" -#include "platform_config.h" #ifdef ARDUINO_AVR_FEATHER32U4 #define LORA_SS_PIN 8 @@ -37,7 +36,6 @@ Copyright (c) 20xx, MPL Contributor1 contrib1@example.net RadioNode radioNode; PlatformNode platformNode; -PlatformConfig platformConfig; /* * Main defines for device working in TX mode @@ -192,11 +190,14 @@ void setup(void) * Prepare Serial1 for S.Bus processing */ Serial1.begin(100000, SERIAL_8E2); + + platformNode.isBindMode = true; + platformNode.bindModeExitMillis = millis() + 1000; #endif #ifdef DEVICE_MODE_TX - platformConfig.seed(); + platformNode.seed(); #ifdef FEATURE_TX_OLED oled.init(); @@ -228,7 +229,13 @@ void setup(void) pinMode(LED_BUILTIN, OUTPUT); - platformConfig.loadBindKey(); + platformNode.loadBindKey(); + + // platformNode.bindKey[0] = 44; + // platformNode.bindKey[1] = 72; + // platformNode.bindKey[2] = 30; + // platformNode.bindKey[3] = 239; + } uint8_t currentSequenceIndex = 0; @@ -287,6 +294,15 @@ int8_t getFrameToTransmit(QspConfiguration_t *qsp) { void loop(void) { + // delay(1000); + // Serial.print(platformNode.bindKey[0]); + // Serial.print(" "); + // Serial.print(platformNode.bindKey[1]); + // Serial.print(" "); + // Serial.print(platformNode.bindKey[2]); + // Serial.print(" "); + // Serial.println(platformNode.bindKey[3]); + uint32_t currentMillis = millis(); #ifdef DEVICE_MODE_RX diff --git a/crossbow/platform_config.cpp b/crossbow/platform_config.cpp deleted file mode 100644 index 3f1243a..0000000 --- a/crossbow/platform_config.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "platform_config.h" -#include "Arduino.h" - -PlatformConfig::PlatformConfig(void) { - randomSeed(analogRead(0)); -}; - -void PlatformConfig::seed(void) { - uint8_t val; - - val = EEPROM.read(EEPROM_ADDRESS_BIND_KEY_SEEDED); - - if (val != 0xf1) { - EEPROM.write(EEPROM_ADDRESS_BIND_0, random(1, 255)); //Yes, from 1 to 254 - EEPROM.write(EEPROM_ADDRESS_BIND_1, random(1, 255)); //Yes, from 1 to 254 - EEPROM.write(EEPROM_ADDRESS_BIND_2, random(1, 255)); //Yes, from 1 to 254 - EEPROM.write(EEPROM_ADDRESS_BIND_3, random(1, 255)); //Yes, from 1 to 254 - EEPROM.write(EEPROM_ADDRESS_BIND_KEY_SEEDED, 0xf1); - } -} - -void PlatformConfig::loadBindKey(void) { - platformNode.bindKey[0] = EEPROM.read(EEPROM_ADDRESS_BIND_0); - platformNode.bindKey[1] = EEPROM.read(EEPROM_ADDRESS_BIND_1); - platformNode.bindKey[2] = EEPROM.read(EEPROM_ADDRESS_BIND_2); - platformNode.bindKey[3] = EEPROM.read(EEPROM_ADDRESS_BIND_3); -} \ No newline at end of file diff --git a/crossbow/platform_config.h b/crossbow/platform_config.h deleted file mode 100644 index 1e177e8..0000000 --- a/crossbow/platform_config.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#ifndef PLATFORM_CONFIG_H -#define PLATFORM_CONFIG_H - -#include -#include "platform_node.h" - -extern PlatformNode platformNode; - -enum platformConfigMemoryLayout { - EEPROM_ADDRESS_BIND_KEY_SEEDED = 0x00, - EEPROM_ADDRESS_BIND_0, - EEPROM_ADDRESS_BIND_1, - EEPROM_ADDRESS_BIND_2, - EEPROM_ADDRESS_BIND_3, - PLATFORM_CONFIG_LAST_BYTE -}; - -class PlatformConfig { - public: - PlatformConfig(void); - void seed(void); - void loadBindKey(); -}; - -#endif \ No newline at end of file diff --git a/crossbow/platform_node.cpp b/crossbow/platform_node.cpp index 9ba18dd..80f6a32 100644 --- a/crossbow/platform_node.cpp +++ b/crossbow/platform_node.cpp @@ -4,6 +4,29 @@ PlatformNode::PlatformNode(void) { for (uint8_t i = 0; i < PLATFORM_TOTAL_CHANNEL_COUNT; i++) { _channels[i] = PLATFORM_DEFAULT_CHANNEL_VALUE; } + + randomSeed(analogRead(0)); +} + +void PlatformNode::seed(void) { + uint8_t val; + + val = EEPROM.read(EEPROM_ADDRESS_BIND_KEY_SEEDED); + + if (val != 0xf1) { + EEPROM.write(EEPROM_ADDRESS_BIND_0, random(1, 255)); //Yes, from 1 to 254 + EEPROM.write(EEPROM_ADDRESS_BIND_1, random(1, 255)); //Yes, from 1 to 254 + EEPROM.write(EEPROM_ADDRESS_BIND_2, random(1, 255)); //Yes, from 1 to 254 + EEPROM.write(EEPROM_ADDRESS_BIND_3, random(1, 255)); //Yes, from 1 to 254 + EEPROM.write(EEPROM_ADDRESS_BIND_KEY_SEEDED, 0xf1); + } +} + +void PlatformNode::loadBindKey(void) { + bindKey[0] = EEPROM.read(EEPROM_ADDRESS_BIND_0); + bindKey[1] = EEPROM.read(EEPROM_ADDRESS_BIND_1); + bindKey[2] = EEPROM.read(EEPROM_ADDRESS_BIND_2); + bindKey[3] = EEPROM.read(EEPROM_ADDRESS_BIND_3); } int PlatformNode::getRcChannel(uint8_t channel) { @@ -23,6 +46,12 @@ void PlatformNode::setRcChannel(uint8_t channel, int value, int offset) { void PlatformNode::enterBindMode(void) { isBindMode = true; + // Set temporary bind mode + bindKey[0] = 0xf1; + bindKey[0] = 0x1e; + bindKey[0] = 0x07; + bindKey[0] = 0x42; + radioNode.set( 0, // Minimum power 125000, // 125kHz bandwidth @@ -34,5 +63,6 @@ void PlatformNode::enterBindMode(void) { void PlatformNode::leaveBindMode(void) { isBindMode = false; + loadBindKey(); radioNode.reset(); } \ No newline at end of file diff --git a/crossbow/platform_node.h b/crossbow/platform_node.h index f07146b..089acfd 100644 --- a/crossbow/platform_node.h +++ b/crossbow/platform_node.h @@ -2,6 +2,7 @@ #include "Arduino.h" #include "radio_node.h" +#include #ifndef PLATFORM_NODE_H #define PLATFORM_NODE_H @@ -17,6 +18,15 @@ enum deviceStates { DEVICE_STATE_FAILSAFE, DEVICE_STATE_UNDETERMINED }; + +enum platformConfigMemoryLayout { + EEPROM_ADDRESS_BIND_KEY_SEEDED = 0x00, + EEPROM_ADDRESS_BIND_0, + EEPROM_ADDRESS_BIND_1, + EEPROM_ADDRESS_BIND_2, + EEPROM_ADDRESS_BIND_3, + PLATFORM_CONFIG_LAST_BYTE +}; class PlatformNode { @@ -26,10 +36,13 @@ class PlatformNode { void setRcChannel(uint8_t channel, int value, int offset); void enterBindMode(void); void leaveBindMode(void); + void seed(void); + void loadBindKey(); uint8_t bindKey[4]; uint32_t nextLedUpdate = 0; uint8_t platformState = DEVICE_STATE_UNDETERMINED; bool isBindMode = false; + uint32_t bindModeExitMillis; private: volatile int _channels[PLATFORM_TOTAL_CHANNEL_COUNT]; }; diff --git a/crossbow/tx_oled.cpp b/crossbow/tx_oled.cpp index ee914ce..5984f1d 100644 --- a/crossbow/tx_oled.cpp +++ b/crossbow/tx_oled.cpp @@ -24,7 +24,12 @@ void TxOled::loop() { case TX_PAGE_BIND: if (button1.getState() == TACTILE_STATE_LONG_PRESS) { - platformNode.isBindMode = !platformNode.isBindMode; + + if (!platformNode.isBindMode) { + platformNode.enterBindMode(); + } else { + platformNode.leaveBindMode(); + } update = true; } break;