}
}
- bool bt_early_init_done = false;
- bool bt_early_init() {
- if (!bt_early_init_done) {
+ bool bt_setup_hw() {
+ if (!bt_ready) {
+ if (EEPROM.read(eeprom_addr(ADDR_CONF_BT)) == BT_ENABLE_BYTE) {
+ bt_enabled = true;
+ } else {
+ bt_enabled = false;
+ }
if (btStart()) {
if (esp_bluedroid_init() == ESP_OK) {
if (esp_bluedroid_enable() == ESP_OK) {
const uint8_t* bda_ptr = esp_bt_dev_get_address();
- memcpy(dev_bt_mac, bda_ptr, BT_DEV_HASH_LEN);
+ char *data = (char*)malloc(BT_DEV_ADDR_LEN+1);
+ for (int i = 0; i < BT_DEV_ADDR_LEN; i++) {
+ data[i] = bda_ptr[i];
+ }
+ data[BT_DEV_ADDR_LEN] = EEPROM.read(eeprom_addr(ADDR_SIGNATURE));
+ unsigned char *hash = MD5::make_hash(data, BT_DEV_ADDR_LEN);
+ memcpy(bt_dh, hash, BT_DEV_HASH_LEN);
+ sprintf(bt_devname, "RNode %02X%02X", bt_dh[14], bt_dh[15]);
+ free(data);
+
+ SerialBT.enableSSP();
+ SerialBT.onConfirmRequest(bt_confirm_pairing);
+ SerialBT.onAuthComplete(bt_pairing_complete);
+ SerialBT.register_callback(bt_connection_callback);
+
+ bt_ready = true;
return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- } else {
- return false;
- }
- } else {
- return true;
- }
- }
-
- bool bt_setup_hw() {
- if (!bt_ready) {
- if (EEPROM.read(eeprom_addr(ADDR_CONF_BT)) == BT_ENABLE_BYTE) { bt_enabled = true; } else { bt_enabled = false; }
- if (bt_early_init()) {
- const uint8_t* bda_ptr = esp_bt_dev_get_address();
- char *data = (char*)malloc(BT_DEV_ADDR_LEN+1);
- for (int i = 0; i < BT_DEV_ADDR_LEN; i++) {
- data[i] = bda_ptr[i];
- }
- data[BT_DEV_ADDR_LEN] = EEPROM.read(eeprom_addr(ADDR_SIGNATURE));
- unsigned char *hash = MD5::make_hash(data, BT_DEV_ADDR_LEN);
- memcpy(bt_dh, hash, BT_DEV_HASH_LEN);
- sprintf(bt_devname, "RNode %02X%02X", bt_dh[14], bt_dh[15]);
- free(data);
-
- SerialBT.enableSSP();
- SerialBT.onConfirmRequest(bt_confirm_pairing);
- SerialBT.onAuthComplete(bt_pairing_complete);
- SerialBT.register_callback(bt_connection_callback);
-
- bt_ready = true;
- return true;
+ } else { return false; }
+ } else { return false; }
} else { return false; }
}
}
}
bool device_init() {
- if (bt_early_init()) {
+ if (bt_ready) {
for (uint8_t i=0; i<EEPROM_SIG_LEN; i++){dev_eeprom_signature[i]=EEPROM.read(eeprom_addr(ADDR_SIGNATURE+i));}
mbedtls_md_context_t ctx;
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256;
bool stat_area_intialised = false;
void draw_stat_area() {
- if (!stat_area_intialised) {
- stat_area.drawBitmap(0, 0, bm_frame, 64, 64, SSD1306_WHITE, SSD1306_BLACK);
- stat_area_intialised = true;
- }
+ if (device_init_done) {
+ if (!stat_area_intialised) {
+ stat_area.drawBitmap(0, 0, bm_frame, 64, 64, SSD1306_WHITE, SSD1306_BLACK);
+ stat_area_intialised = true;
+ }
- draw_cable_icon(3, 8);
- draw_bt_icon(3, 30);
- draw_lora_icon(45, 8);
- draw_mw_icon(45, 30);
- draw_battery_bars(4, 58);
- if (radio_online) {
- draw_quality_bars(28, 56);
- draw_signal_bars(44, 56);
- draw_waterfall(27, 4);
+ draw_cable_icon(3, 8);
+ draw_bt_icon(3, 30);
+ draw_lora_icon(45, 8);
+ draw_mw_icon(45, 30);
+ draw_battery_bars(4, 58);
+ if (radio_online) {
+ draw_quality_bars(28, 56);
+ draw_signal_bars(44, 56);
+ draw_waterfall(27, 4);
+ }
}
}
const uint8_t pages = 3;
uint8_t disp_page = START_PAGE;
void draw_disp_area() {
- if (!disp_ext_fb or bt_ssp_pin != 0) {
- if (device_signatures_ok()) {
- disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
- } else {
- disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
- }
-
- if (!hw_ready || radio_error || !device_firmware_ok()) {
- if (!device_firmware_ok()) {
- disp_area.drawBitmap(0, 37, bm_fw_corrupt, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ if (!device_init_done) {
+ disp_area.drawBitmap(0, 37, bm_boot, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ } else {
+ if (!disp_ext_fb or bt_ssp_pin != 0) {
+ if (device_signatures_ok()) {
+ disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
} else {
- disp_area.drawBitmap(0, 37, bm_hwfail, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- }
- } else if (bt_state == BT_STATE_PAIRING and bt_ssp_pin != 0) {
- char *pin_str = (char*)malloc(DISP_PIN_SIZE+1);
- sprintf(pin_str, "%06d", bt_ssp_pin);
-
- disp_area.drawBitmap(0, 37, bm_pairing, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- for (int i = 0; i < DISP_PIN_SIZE; i++) {
- uint8_t numeric = pin_str[i]-48;
- uint8_t offset = numeric*5;
- disp_area.drawBitmap(7+9*i, 37+16, bm_n_uh+offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+ disp_area.drawBitmap(0, 0, bm_def, disp_area.width(), 37, SSD1306_WHITE, SSD1306_BLACK);
}
+
+ if (!hw_ready || radio_error || !device_firmware_ok()) {
+ if (!device_firmware_ok()) {
+ disp_area.drawBitmap(0, 37, bm_fw_corrupt, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ } else {
+ disp_area.drawBitmap(0, 37, bm_hwfail, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ }
+ } else if (bt_state == BT_STATE_PAIRING and bt_ssp_pin != 0) {
+ char *pin_str = (char*)malloc(DISP_PIN_SIZE+1);
+ sprintf(pin_str, "%06d", bt_ssp_pin);
+
+ disp_area.drawBitmap(0, 37, bm_pairing, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ for (int i = 0; i < DISP_PIN_SIZE; i++) {
+ uint8_t numeric = pin_str[i]-48;
+ uint8_t offset = numeric*5;
+ disp_area.drawBitmap(7+9*i, 37+16, bm_n_uh+offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+ }
- } else {
- if (millis()-last_page_flip >= page_interval) {
- disp_page = (++disp_page%pages);
- last_page_flip = millis();
- if (not community_fw and disp_page == 0) disp_page = 1;
- }
+ } else {
+ if (millis()-last_page_flip >= page_interval) {
+ disp_page = (++disp_page%pages);
+ last_page_flip = millis();
+ if (not community_fw and disp_page == 0) disp_page = 1;
+ }
- if (disp_page == 0) {
- if (device_signatures_ok()) {
+ if (disp_page == 0) {
+ if (device_signatures_ok()) {
+ if (radio_online) {
+ disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ } else {
+ disp_area.drawBitmap(0, 37, bm_checks, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ }
+ } else {
+ disp_area.drawBitmap(0, 37, bm_nfr, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ }
+ } else if (disp_page == 1) {
if (radio_online) {
disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- } else {
- disp_area.drawBitmap(0, 37, bm_checks, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ } else{
+ disp_area.drawBitmap(0, 37, bm_hwok, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
}
- } else {
- disp_area.drawBitmap(0, 37, bm_nfr, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- }
- } else if (disp_page == 1) {
- if (radio_online) {
- disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- } else{
- disp_area.drawBitmap(0, 37, bm_hwok, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- }
- } else if (disp_page == 2) {
- if (radio_online) {
- disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- } else{
- disp_area.drawBitmap(0, 37, bm_version, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
- char *v_str = (char*)malloc(3+1);
- sprintf(v_str, "%01d%02d", MAJ_VERS, MIN_VERS);
- for (int i = 0; i < 3; i++) {
- uint8_t numeric = v_str[i]-48; uint8_t bm_offset = numeric*5;
- uint8_t dxp = 20;
- if (i == 1) dxp += 9*1+4;
- if (i == 2) dxp += 9*2+4;
- disp_area.drawBitmap(dxp, 37+16, bm_n_uh+bm_offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+ } else if (disp_page == 2) {
+ if (radio_online) {
+ disp_area.drawBitmap(0, 37, bm_online, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ } else{
+ disp_area.drawBitmap(0, 37, bm_version, disp_area.width(), 27, SSD1306_WHITE, SSD1306_BLACK);
+ char *v_str = (char*)malloc(3+1);
+ sprintf(v_str, "%01d%02d", MAJ_VERS, MIN_VERS);
+ for (int i = 0; i < 3; i++) {
+ uint8_t numeric = v_str[i]-48; uint8_t bm_offset = numeric*5;
+ uint8_t dxp = 20;
+ if (i == 1) dxp += 9*1+4;
+ if (i == 2) dxp += 9*2+4;
+ disp_area.drawBitmap(dxp, 37+16, bm_n_uh+bm_offset, 8, 5, SSD1306_WHITE, SSD1306_BLACK);
+ }
+ disp_area.drawLine(27, 37+19, 28, 37+19, SSD1306_BLACK);
+ disp_area.drawLine(27, 37+20, 28, 37+20, SSD1306_BLACK);
}
- disp_area.drawLine(27, 37+19, 28, 37+19, SSD1306_BLACK);
- disp_area.drawLine(27, 37+20, 28, 37+20, SSD1306_BLACK);
}
}
+ } else {
+ disp_area.drawBitmap(0, 0, fb, disp_area.width(), disp_area.height(), SSD1306_WHITE, SSD1306_BLACK);
}
- } else {
- disp_area.drawBitmap(0, 0, fb, disp_area.width(), disp_area.height(), SSD1306_WHITE, SSD1306_BLACK);
}
}
0x29, 0x94, 0x11, 0x48, 0x03, 0x20, 0x05, 0x10, 0x09, 0x20, 0x01, 0x40, 0x01, 0x80, 0x01, 0x00
};
+const unsigned char bm_boot [] PROGMEM = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfc, 0x38, 0x66, 0x67, 0x1c, 0x3f, 0xff, 0xff, 0xfc, 0x99, 0xe6, 0x66, 0x4c, 0xff, 0xff,
+ 0xff, 0xfc, 0x98, 0x70, 0xe6, 0x7c, 0x3f, 0xff, 0xff, 0xfc, 0x99, 0xf0, 0xe6, 0x4c, 0xff, 0xff,
+ 0xff, 0xfc, 0x38, 0x79, 0xe7, 0x1c, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x0c, 0x38, 0xe1, 0xc3, 0x33, 0x38, 0x7f, 0xfe, 0x7e, 0x72, 0x64, 0xe7, 0x31, 0x33, 0xff,
+ 0xff, 0x1e, 0x70, 0x61, 0xe7, 0x30, 0x32, 0x7f, 0xff, 0xce, 0x72, 0x61, 0xe7, 0x32, 0x32, 0x7f,
+ 0xfe, 0x1e, 0x72, 0x64, 0xe7, 0x33, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
const unsigned char bm_version [] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
void setup() {
#if MCU_VARIANT == MCU_ESP32
- // TODO: Reset?
- // delay(500);
+ boot_seq();
EEPROM.begin(EEPROM_SIZE);
Serial.setRxBufferSize(CONFIG_UART_BUFFER_SIZE);
#endif
// pins for the LoRa module
LoRa.setPins(pin_cs, pin_reset, pin_dio);
+ #if HAS_DISPLAY
+ disp_ready = display_init();
+ update_display();
+ #endif
+
#if MCU_VARIANT == MCU_ESP32
#if HAS_PMU == true
pmu_ready = init_pmu();
#endif
- kiss_indicate_reset();
- #endif
+ #if HAS_BLUETOOTH
+ bt_init();
+ bt_init_ran = true;
+ #endif
- #if HAS_DISPLAY
- disp_ready = display_init();
+ kiss_indicate_reset();
#endif
// Validate board health, EEPROM and config
hw_ready = false;
Serial.write("Error, invalid hardware check state\r\n");
#if HAS_DISPLAY
- if (disp_ready) update_display();
+ if (disp_ready) {
+ device_init_done = true;
+ update_display();
+ }
#endif
led_indicate_boot_error();
}
} else {
Serial.write("Error, indeterminate boot vector\r\n");
#if HAS_DISPLAY
- if (disp_ready) update_display();
+ if (disp_ready) {
+ device_init_done = true;
+ update_display();
+ }
#endif
led_indicate_boot_error();
}
hw_ready = false;
Serial.write("Error, incorrect boot vector\r\n");
#if HAS_DISPLAY
- if (disp_ready) update_display();
+ if (disp_ready) {
+ device_init_done = true;
+ update_display();
+ }
#endif
led_indicate_boot_error();
}
#endif
#if HAS_BLUETOOTH
- if (!bt_init_ran && millis() > 1000) {
- bt_init();
- bt_init_ran = true;
- }
-
if (bt_ready) update_bt();
#endif
}
pixels.show();
}
}
+
+ void boot_seq() {
+ uint8_t rs[] = { 0x00, 0x00, 0x00 };
+ uint8_t gs[] = { 0x10, 0x08, 0x00 };
+ uint8_t bs[] = { 0x00, 0x08, 0x10 };
+ for (int i = 0; i < 1*sizeof(rs); i++) {
+ npset(rs[i%sizeof(rs)], gs[i%sizeof(gs)], bs[i%sizeof(bs)]);
+ delay(33);
+ npset(0x00, 0x00, 0x00);
+ delay(66);
+ }
+ }
+#else
+ void boot_seq() { }
#endif
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560