@@ -25,8 +25,11 @@ const char mac_tx_ok[] PROGMEM = "mac_tx_ok";
25
25
const char mac_rx[] PROGMEM = " mac_rx" ;
26
26
const char mac_err[] PROGMEM = " mac_err" ;
27
27
const char rn2483[] PROGMEM = " RN2483" ;
28
+ const char rn2483a[] PROGMEM = " RN2483A" ;
29
+ const char rn2903[] PROGMEM = " RN2903" ;
30
+ const char rn2903as[] PROGMEM = " RN2903AS" ;
28
31
29
- const char *const compare_table[] PROGMEM = {ok, on, off, accepted, mac_tx_ok, mac_rx, mac_err, rn2483};
32
+ const char *const compare_table[] PROGMEM = {ok, on, off, accepted, mac_tx_ok, mac_rx, mac_err, rn2483, rn2483a, rn2903, rn2903as };
30
33
31
34
#define CMP_OK 0
32
35
#define CMP_ON 1
@@ -36,6 +39,9 @@ const char *const compare_table[] PROGMEM = {ok, on, off, accepted, mac_tx_ok, m
36
39
#define CMP_MAC_RX 5
37
40
#define CMP_MAC_ERR 6
38
41
#define CMP_RN2483 7
42
+ #define CMP_RN2483A 8
43
+ #define CMP_RN2903 9
44
+ #define CMP_RN2903AS 10
39
45
40
46
// CMP OK
41
47
const char busy[] PROGMEM = " busy" ;
@@ -109,8 +115,9 @@ const char response_is_not_ok[] PROGMEM = "Response is not OK: ";
109
115
const char error_key_length[] PROGMEM = " One or more keys are of invalid length." ;
110
116
const char check_configuration[] PROGMEM = " Check your coverage, keys and backend status." ;
111
117
const char no_response[] PROGMEM = " No response from RN module." ;
118
+ const char invalid_module[] PROGMEM = " Invalid module (must be RN2xx3[xx])." ;
112
119
113
- const char *const error_msg[] PROGMEM = {invalid_sf, invalid_fp, unexpected_response, send_command_failed, join_failed, join_not_accepted, personalize_not_accepted, response_is_not_ok, error_key_length, check_configuration, no_response};
120
+ const char *const error_msg[] PROGMEM = {invalid_sf, invalid_fp, unexpected_response, send_command_failed, join_failed, join_not_accepted, personalize_not_accepted, response_is_not_ok, error_key_length, check_configuration, no_response, invalid_module };
114
121
115
122
#define ERR_INVALID_SF 0
116
123
#define ERR_INVALID_FP 1
@@ -123,18 +130,21 @@ const char *const error_msg[] PROGMEM = {invalid_sf, invalid_fp, unexpected_resp
123
130
#define ERR_KEY_LENGTH 8
124
131
#define ERR_CHECK_CONFIGURATION 9
125
132
#define ERR_NO_RESPONSE 10
133
+ #define ERR_INVALID_MODULE 11
126
134
127
135
const char personalize_accepted[] PROGMEM = " Personalize accepted. Status: " ;
128
136
const char join_accepted[] PROGMEM = " Join accepted. Status: " ;
129
137
const char successful_transmission[] PROGMEM = " Successful transmission" ;
130
138
const char successful_transmission_received[] PROGMEM = " Successful transmission. Received " ;
139
+ const char valid_module[] PROGMEM = " Valid module connected." ;
131
140
132
- const char *const success_msg[] PROGMEM = {personalize_accepted, join_accepted, successful_transmission, successful_transmission_received};
141
+ const char *const success_msg[] PROGMEM = {personalize_accepted, join_accepted, successful_transmission, successful_transmission_received, valid_module };
133
142
134
143
#define SCS_PERSONALIZE_ACCEPTED 0
135
144
#define SCS_JOIN_ACCEPTED 1
136
145
#define SCS_SUCCESSFUL_TRANSMISSION 2
137
146
#define SCS_SUCCESSFUL_TRANSMISSION_RECEIVED 3
147
+ #define SCS_VALID_MODULE 4
138
148
139
149
const char radio_prefix[] PROGMEM = " radio" ;
140
150
const char radio_set[] PROGMEM = " set" ;
@@ -381,6 +391,11 @@ size_t TheThingsNetwork::getHardwareEui(char *buffer, size_t size)
381
391
return readResponse (SYS_TABLE, SYS_TABLE, SYS_GET_HWEUI, buffer, size);
382
392
}
383
393
394
+ size_t TheThingsNetwork::getVersion (char *buffer, size_t size)
395
+ {
396
+ return readResponse (SYS_TABLE, SYS_TABLE, SYS_GET_VER, buffer, size);
397
+ }
398
+
384
399
uint16_t TheThingsNetwork::getVDD ()
385
400
{
386
401
if (readResponse (SYS_TABLE, SYS_TABLE, SYS_GET_VDD, buffer, sizeof (buffer)) > 0 ) {
@@ -632,22 +647,25 @@ void TheThingsNetwork::autoBaud()
632
647
633
648
void TheThingsNetwork::reset (bool adr)
634
649
{
650
+ // autobaud and send "sys reset"
635
651
autoBaud ();
636
652
readResponse (SYS_TABLE, SYS_RESET, buffer, sizeof (buffer));
637
653
654
+ // autobaud (again, because baudrate was reset with "sys reset") and get HW model and SW version
638
655
autoBaud ();
639
- readResponse (SYS_TABLE, SYS_TABLE, SYS_GET_VER, buffer, sizeof (buffer));
656
+ getVersion ( buffer, sizeof (buffer));
640
657
641
658
// buffer contains "RN2xx3[xx] x.x.x ...", splitting model from version
642
659
char *model = strtok (buffer, " " );
643
660
debugPrintIndex (SHOW_MODEL, model);
644
661
char *version = strtok (NULL , " " );
645
662
debugPrintIndex (SHOW_VERSION, version);
646
663
664
+ // set DEVEUI as HWEUI
647
665
readResponse (SYS_TABLE, SYS_TABLE, SYS_GET_HWEUI, buffer, sizeof (buffer));
648
666
sendMacSet (MAC_DEVEUI, buffer);
667
+ // set ADR
649
668
setADR (adr);
650
- this ->needsHardReset = false ;
651
669
}
652
670
653
671
void TheThingsNetwork::resetHard (uint8_t resetPin){
@@ -671,9 +689,11 @@ void TheThingsNetwork::onMessage(void (*cb)(const uint8_t *payload, size_t size,
671
689
messageCallback = cb;
672
690
}
673
691
674
- bool TheThingsNetwork::personalize (const char *devAddr, const char *nwkSKey, const char *appSKey)
692
+ bool TheThingsNetwork::personalize (const char *devAddr, const char *nwkSKey, const char *appSKey, bool resetFirst )
675
693
{
676
- reset (adr);
694
+ if (resetFirst) {
695
+ reset (adr);
696
+ }
677
697
if (strlen (devAddr) != 8 || strlen (appSKey) != 32 || strlen (nwkSKey) != 32 )
678
698
{
679
699
debugPrintMessage (ERR_MESSAGE, ERR_KEY_LENGTH);
@@ -703,9 +723,11 @@ bool TheThingsNetwork::personalize()
703
723
return true ;
704
724
}
705
725
706
- bool TheThingsNetwork::provision (const char *appEui, const char *appKey)
726
+ bool TheThingsNetwork::provision (const char *appEui, const char *appKey, bool resetFirst )
707
727
{
708
- reset (adr);
728
+ if (resetFirst) {
729
+ reset (adr);
730
+ }
709
731
if (strlen (appEui) != 16 || strlen (appKey) != 32 )
710
732
{
711
733
debugPrintMessage (ERR_MESSAGE, ERR_KEY_LENGTH);
@@ -917,6 +939,34 @@ void TheThingsNetwork::showStatus()
917
939
debugPrintIndex (SHOW_RX_DELAY_2, buffer);
918
940
}
919
941
942
+ bool TheThingsNetwork::checkValidModuleConnected (bool autoBaudFirst)
943
+ {
944
+ // check if we want to autobaud first
945
+ if (autoBaudFirst)
946
+ {
947
+ autoBaud ();
948
+ }
949
+ // send "sys get ver" to check if (and what) module is connected
950
+ getVersion (buffer, sizeof (buffer));
951
+ // check if we got a response (whatever it might be)
952
+ // needsHardReset flag is set by readLine() (called at some point down the line by getVersion())
953
+ if (this ->needsHardReset )
954
+ {
955
+ return false ; // no response
956
+ }
957
+ // buffer contains "RN2xx3[xx] x.x.x ...", getting only model (RN2xx3[xx])
958
+ char *model = strtok (buffer, " " );
959
+ debugPrintIndex (SHOW_MODEL, model);
960
+ // check if module is valid (must be RN2483, RN2483A, RN2903 or RN2903AS)
961
+ if (pgmstrcmp (model, CMP_RN2483) == 0 || pgmstrcmp (model, CMP_RN2483A) == 0 || pgmstrcmp (model, CMP_RN2903) == 0 || pgmstrcmp (model, CMP_RN2903AS) == 0 )
962
+ {
963
+ debugPrintMessage (SUCCESS_MESSAGE, SCS_VALID_MODULE);
964
+ return true ; // module responded and is valid (recognized/supported)
965
+ }
966
+ debugPrintMessage (ERR_MESSAGE, ERR_INVALID_MODULE);
967
+ return false ; // module responded but is invalid (unrecognized/unsupported)
968
+ }
969
+
920
970
void TheThingsNetwork::configureEU868 ()
921
971
{
922
972
sendMacSet (MAC_RX2, 3 , 869525000 );
0 commit comments