Skip to content

Commit 310ab97

Browse files
authored
Merge branch 'dev' into dev
2 parents 67ca4a1 + 69d1d92 commit 310ab97

38 files changed

+864
-95
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"build": {
3+
"arduino": {
4+
"ldscript": "nrf52840_s140_v7.ld"
5+
},
6+
"core": "nRF5",
7+
"cpu": "cortex-m4",
8+
"extra_flags": "-DARDUINO_Seeed_XIAO_nRF52840 -DNRF52840_XXAA -DSEEED_XIAO_NRF52840 ",
9+
"f_cpu": "64000000L",
10+
"hwids": [
11+
[ "0x2886", "0x8044" ],
12+
[ "0x2886", "0x0044" ]
13+
],
14+
"mcu": "nrf52840",
15+
"variant": "Seeed_XIAO_nRF52840",
16+
"softdevice": {
17+
"sd_flags": "-DS140",
18+
"sd_name": "s140",
19+
"sd_version": "7.3.0",
20+
"sd_fwid": "0x0123"
21+
},
22+
"bsp": {
23+
"name": "adafruit"
24+
},
25+
"bootloader": {
26+
"settings_addr": "0xFF000"
27+
},
28+
"usb_product": "XIAO nRF52840"
29+
},
30+
"connectivity": [
31+
"bluetooth"
32+
],
33+
"debug": {
34+
"jlink_device": "nRF52840_xxAA",
35+
"openocd_target": "nrf52.cfg",
36+
"svd_path": "nrf52840.svd"
37+
},
38+
"frameworks": [
39+
"arduino"
40+
],
41+
"name": "Seeed Studio XIAO nRF52840",
42+
"upload": {
43+
"maximum_ram_size": 237568,
44+
"maximum_size": 811008,
45+
"protocol": "nrfutil",
46+
"speed": 115200,
47+
"protocols": [
48+
"jlink",
49+
"nrfjprog",
50+
"nrfutil",
51+
"cmsis-dap",
52+
"sam-ba",
53+
"blackmagic"
54+
],
55+
"use_1200bps_touch": true,
56+
"require_upload_port": true,
57+
"wait_for_upload_port": true
58+
},
59+
"url": "https://wiki.seeedstudio.com/XIAO_BLE",
60+
"vendor": "Seeed Studio"
61+
}

examples/companion_radio/UITask.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,26 @@ static const uint8_t meshcore_logo [] PROGMEM = {
2525
0xe3, 0xe3, 0x8f, 0xff, 0x1f, 0xfc, 0x3c, 0x0e, 0x1f, 0xf8, 0xff, 0xf8, 0x70, 0x3c, 0x7f, 0xf8,
2626
};
2727

28-
void UITask::begin(DisplayDriver* display, const char* node_name, const char* build_date, uint32_t pin_code) {
28+
void UITask::begin(DisplayDriver* display, const char* node_name, const char* build_date, const char* firmware_version, uint32_t pin_code) {
2929
_display = display;
3030
_auto_off = millis() + AUTO_OFF_MILLIS;
3131
clearMsgPreview();
3232
_node_name = node_name;
33-
_build_date = build_date;
3433
_pin_code = pin_code;
3534
if (_display != NULL) {
3635
_display->turnOn();
3736
}
37+
38+
// strip off dash and commit hash by changing dash to null terminator
39+
// e.g: v1.2.3-abcdef -> v1.2.3
40+
char *version = strdup(firmware_version);
41+
char *dash = strchr(version, '-');
42+
if(dash){
43+
*dash = 0;
44+
}
45+
46+
// v1.2.3 (1 Jan 2025)
47+
sprintf(_version_info, "%s (%s)", version, build_date);
3848
}
3949

4050
void UITask::msgRead(int msgcount) {
@@ -90,10 +100,9 @@ void UITask::renderCurrScreen() {
90100
_display->setCursor(0, 20);
91101
_display->setTextSize(1);
92102
_display->print(_node_name);
93-
94-
sprintf(tmp, "Build: %s", _build_date);
103+
95104
_display->setCursor(0, 32);
96-
_display->print(tmp);
105+
_display->print(_version_info);
97106

98107
if (_connected) {
99108
//_display->printf("freq : %03.2f sf %d\n", _prefs.freq, _prefs.sf);

examples/companion_radio/UITask.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class UITask {
1111
bool _connected;
1212
uint32_t _pin_code;
1313
const char* _node_name;
14-
const char* _build_date;
14+
char _version_info[32];
1515
char _origin[62];
1616
char _msg[80];
1717
int _msgcount;
@@ -26,7 +26,7 @@ class UITask {
2626
_next_refresh = 0;
2727
_connected = false;
2828
}
29-
void begin(DisplayDriver* display, const char* node_name, const char* build_date, uint32_t pin_code);
29+
void begin(DisplayDriver* display, const char* node_name, const char* build_date, const char* firmware_version, uint32_t pin_code);
3030

3131
void setHasConnection(bool connected) { _connected = connected; }
3232
bool hasDisplay() const { return _display != NULL; }

examples/companion_radio/main.cpp

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ static uint32_t _atoi(const char* sp) {
8383

8484
/*------------ Frame Protocol --------------*/
8585

86-
#define FIRMWARE_VER_CODE 3
86+
#define FIRMWARE_VER_CODE 4
8787

8888
#ifndef FIRMWARE_BUILD_DATE
89-
#define FIRMWARE_BUILD_DATE "30 Mar 2025"
89+
#define FIRMWARE_BUILD_DATE "7 Apr 2025"
9090
#endif
9191

9292
#ifndef FIRMWARE_VERSION
93-
#define FIRMWARE_VERSION "v1.4.2"
93+
#define FIRMWARE_VERSION "v1.4.3"
9494
#endif
9595

9696
#define CMD_APP_START 1
@@ -130,6 +130,7 @@ static uint32_t _atoi(const char* sp) {
130130
#define CMD_SIGN_FINISH 35
131131
#define CMD_SEND_TRACE_PATH 36
132132
#define CMD_SET_DEVICE_PIN 37
133+
#define CMD_SET_OTHER_PARAMS 38
133134

134135
#define RESP_CODE_OK 0
135136
#define RESP_CODE_ERR 1
@@ -164,6 +165,7 @@ static uint32_t _atoi(const char* sp) {
164165
#define PUSH_CODE_STATUS_RESPONSE 0x87
165166
#define PUSH_CODE_LOG_RX_DATA 0x88
166167
#define PUSH_CODE_TRACE_DATA 0x89
168+
#define PUSH_CODE_NEW_ADVERT 0x8A
167169

168170
#define ERR_CODE_UNSUPPORTED_CMD 1
169171
#define ERR_CODE_NOT_FOUND 2
@@ -184,7 +186,7 @@ struct NodePrefs { // persisted to file
184186
uint8_t sf;
185187
uint8_t cr;
186188
uint8_t reserved1;
187-
uint8_t reserved2;
189+
uint8_t manual_add_contacts;
188190
float bw;
189191
uint8_t tx_power_dbm;
190192
uint8_t unused[3];
@@ -499,11 +501,19 @@ class MyMesh : public BaseChatMesh {
499501
}
500502
}
501503

504+
bool isAutoAddEnabled() const override {
505+
return (_prefs.manual_add_contacts & 1) == 0;
506+
}
507+
502508
void onDiscoveredContact(ContactInfo& contact, bool is_new) override {
503509
if (_serial->isConnected()) {
504-
out_frame[0] = PUSH_CODE_ADVERT;
505-
memcpy(&out_frame[1], contact.id.pub_key, PUB_KEY_SIZE);
506-
_serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
510+
if (!isAutoAddEnabled() && is_new) {
511+
writeContactRespFrame(PUSH_CODE_NEW_ADVERT, contact);
512+
} else {
513+
out_frame[0] = PUSH_CODE_ADVERT;
514+
memcpy(&out_frame[1], contact.id.pub_key, PUB_KEY_SIZE);
515+
_serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
516+
}
507517
} else {
508518
soundBuzzer();
509519
}
@@ -663,6 +673,10 @@ class MyMesh : public BaseChatMesh {
663673
}
664674

665675
void onRawDataRecv(mesh::Packet* packet) override {
676+
if (packet->payload_len + 4 > sizeof(out_frame)) {
677+
MESH_DEBUG_PRINTLN("onRawDataRecv(), payload_len too long: %d", packet->payload_len);
678+
return;
679+
}
666680
int i = 0;
667681
out_frame[i++] = PUSH_CODE_RAW_DATA;
668682
out_frame[i++] = (int8_t)(_radio->getLastSNR() * 4);
@@ -746,7 +760,7 @@ class MyMesh : public BaseChatMesh {
746760
file.read((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60
747761
file.read((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61
748762
file.read((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
749-
file.read((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63
763+
file.read((uint8_t *) &_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
750764
file.read((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64
751765
file.read((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
752766
file.read((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69
@@ -847,7 +861,7 @@ class MyMesh : public BaseChatMesh {
847861
file.write((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60
848862
file.write((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61
849863
file.write((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
850-
file.write((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63
864+
file.write((uint8_t *) &_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
851865
file.write((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64
852866
file.write((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
853867
file.write((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69
@@ -888,12 +902,15 @@ class MyMesh : public BaseChatMesh {
888902
out_frame[i++] = MAX_LORA_TX_POWER;
889903
memcpy(&out_frame[i], self_id.pub_key, PUB_KEY_SIZE); i += PUB_KEY_SIZE;
890904

891-
int32_t lat, lon, alt = 0;
905+
int32_t lat, lon;
892906
lat = (_prefs.node_lat * 1000000.0);
893907
lon = (_prefs.node_lon * 1000000.0);
894908
memcpy(&out_frame[i], &lat, 4); i += 4;
895909
memcpy(&out_frame[i], &lon, 4); i += 4;
896-
memcpy(&out_frame[i], &alt, 4); i += 4;
910+
out_frame[i++] = 0; // reserved
911+
out_frame[i++] = 0; // reserved
912+
out_frame[i++] = 0; // reserved
913+
out_frame[i++] = _prefs.manual_add_contacts;
897914

898915
uint32_t freq = _prefs.freq * 1000;
899916
memcpy(&out_frame[i], &freq, 4); i += 4;
@@ -1177,6 +1194,10 @@ class MyMesh : public BaseChatMesh {
11771194
_prefs.airtime_factor = ((float)af) / 1000.0f;
11781195
savePrefs();
11791196
writeOKFrame();
1197+
} else if (cmd_frame[0] == CMD_SET_OTHER_PARAMS) {
1198+
_prefs.manual_add_contacts = cmd_frame[1];
1199+
savePrefs();
1200+
writeOKFrame();
11801201
} else if (cmd_frame[0] == CMD_REBOOT && memcmp(&cmd_frame[1], "reboot", 6) == 0) {
11811202
board.reboot();
11821203
} else if (cmd_frame[0] == CMD_GET_BATTERY_VOLTAGE) {
@@ -1505,7 +1526,7 @@ void setup() {
15051526
#endif
15061527

15071528
#ifdef HAS_UI
1508-
ui_task.begin(disp, the_mesh.getNodeName(), FIRMWARE_BUILD_DATE, the_mesh.getBLEPin());
1529+
ui_task.begin(disp, the_mesh.getNodeName(), FIRMWARE_BUILD_DATE, FIRMWARE_VERSION, the_mesh.getBLEPin());
15091530
#endif
15101531
}
15111532

examples/simple_repeater/UITask.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,33 @@ static const uint8_t meshcore_logo [] PROGMEM = {
2020
0xe3, 0xe3, 0x8f, 0xff, 0x1f, 0xfc, 0x3c, 0x0e, 0x1f, 0xf8, 0xff, 0xf8, 0x70, 0x3c, 0x7f, 0xf8,
2121
};
2222

23-
void UITask::begin(const char* node_name, const char* build_date) {
23+
void UITask::begin(const char* node_name, const char* build_date, const char* firmware_version) {
2424
_prevBtnState = HIGH;
2525
_auto_off = millis() + AUTO_OFF_MILLIS;
2626
_node_name = node_name;
27-
_build_date = build_date;
2827
_display->turnOn();
28+
29+
// strip off dash and commit hash by changing dash to null terminator
30+
// e.g: v1.2.3-abcdef -> v1.2.3
31+
char *version = strdup(firmware_version);
32+
char *dash = strchr(version, '-');
33+
if(dash){
34+
*dash = 0;
35+
}
36+
37+
// v1.2.3 (1 Jan 2025)
38+
sprintf(_version_info, "%s (%s)", version, build_date);
2939
}
3040

3141
void UITask::renderCurrScreen() {
32-
char tmp[80];
3342
// render 'home' screen
3443
_display->drawXbm(0, 0, meshcore_logo, 128, 13);
3544
_display->setCursor(0, 20);
3645
_display->setTextSize(1);
3746
_display->print(_node_name);
3847

39-
sprintf(tmp, "Build: %s", _build_date);
4048
_display->setCursor(0, 32);
41-
_display->print(tmp);
49+
_display->print(_version_info);
4250
_display->setCursor(0, 43);
4351
_display->print("< Repeater >");
4452
//_display->printf("freq : %03.2f sf %d\n", _prefs.freq, _prefs.sf);

examples/simple_repeater/UITask.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ class UITask {
77
unsigned long _next_read, _next_refresh, _auto_off;
88
int _prevBtnState;
99
const char* _node_name;
10-
const char* _build_date;
10+
char _version_info[32];
1111

1212
void renderCurrScreen();
1313
public:
1414
UITask(DisplayDriver& display) : _display(&display) { _next_read = _next_refresh = 0; }
15-
void begin(const char* node_name, const char* build_date);
15+
void begin(const char* node_name, const char* build_date, const char* firmware_version);
1616

1717
void loop();
1818
};

examples/simple_repeater/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
/* ------------------------------ Config -------------------------------- */
2121

2222
#ifndef FIRMWARE_BUILD_DATE
23-
#define FIRMWARE_BUILD_DATE "30 Mar 2025"
23+
#define FIRMWARE_BUILD_DATE "7 Apr 2025"
2424
#endif
2525

2626
#ifndef FIRMWARE_VERSION
27-
#define FIRMWARE_VERSION "v1.4.2"
27+
#define FIRMWARE_VERSION "v1.4.3"
2828
#endif
2929

3030
#ifndef LORA_FREQ
@@ -658,7 +658,7 @@ void setup() {
658658
the_mesh.begin(fs);
659659

660660
#ifdef DISPLAY_CLASS
661-
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE);
661+
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE, FIRMWARE_VERSION);
662662
#endif
663663

664664
// send out initial Advertisement to the mesh

examples/simple_room_server/UITask.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,33 @@ static const uint8_t meshcore_logo [] PROGMEM = {
2020
0xe3, 0xe3, 0x8f, 0xff, 0x1f, 0xfc, 0x3c, 0x0e, 0x1f, 0xf8, 0xff, 0xf8, 0x70, 0x3c, 0x7f, 0xf8,
2121
};
2222

23-
void UITask::begin(const char* node_name, const char* build_date) {
23+
void UITask::begin(const char* node_name, const char* build_date, const char* firmware_version) {
2424
_prevBtnState = HIGH;
2525
_auto_off = millis() + AUTO_OFF_MILLIS;
2626
_node_name = node_name;
27-
_build_date = build_date;
2827
_display->turnOn();
28+
29+
// strip off dash and commit hash by changing dash to null terminator
30+
// e.g: v1.2.3-abcdef -> v1.2.3
31+
char *version = strdup(firmware_version);
32+
char *dash = strchr(version, '-');
33+
if(dash){
34+
*dash = 0;
35+
}
36+
37+
// v1.2.3 (1 Jan 2025)
38+
sprintf(_version_info, "%s (%s)", version, build_date);
2939
}
3040

3141
void UITask::renderCurrScreen() {
32-
char tmp[80];
3342
// render 'home' screen
3443
_display->drawXbm(0, 0, meshcore_logo, 128, 13);
3544
_display->setCursor(0, 20);
3645
_display->setTextSize(1);
3746
_display->print(_node_name);
3847

39-
sprintf(tmp, "Build: %s", _build_date);
4048
_display->setCursor(0, 32);
41-
_display->print(tmp);
49+
_display->print(_version_info);
4250
_display->setCursor(0, 43);
4351
_display->print("< Room Server >");
4452
//_display->printf("freq : %03.2f sf %d\n", _prefs.freq, _prefs.sf);

examples/simple_room_server/UITask.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ class UITask {
77
unsigned long _next_read, _next_refresh, _auto_off;
88
int _prevBtnState;
99
const char* _node_name;
10-
const char* _build_date;
10+
char _version_info[32];
1111

1212
void renderCurrScreen();
1313
public:
1414
UITask(DisplayDriver& display) : _display(&display) { _next_read = _next_refresh = 0; }
15-
void begin(const char* node_name, const char* build_date);
15+
void begin(const char* node_name, const char* build_date, const char* firmware_version);
1616

1717
void loop();
1818
};

0 commit comments

Comments
 (0)