Bugfixing and extension of functions
This commit is contained in:
parent
7e1110ac4f
commit
4c394202c0
116
src/librnode.c
116
src/librnode.c
@ -129,23 +129,11 @@ int rnode_handle_resp(struct RNode* rn, bool* in_frame, uint8_t* cmd, uint8_t* c
|
||||
}
|
||||
}
|
||||
} else if (*cmd == CMD_INTERFACES) {
|
||||
if (sbyte == FESC) {
|
||||
escape = true;
|
||||
} else {
|
||||
if (escape) {
|
||||
if (sbyte == TFEND) {
|
||||
sbyte = FEND;
|
||||
} else if (sbyte == TFESC) {
|
||||
sbyte = FESC;
|
||||
}
|
||||
escape = false;
|
||||
}
|
||||
cmd_buf[*cmd_buf_l] = sbyte;
|
||||
(*cmd_buf_l)++;
|
||||
if (*cmd_buf_l == 2) {
|
||||
rn->interfaces[cmd_buf[0]] = cmd_buf[1];
|
||||
*cmd_buf_l = 0;
|
||||
}
|
||||
cmd_buf[*cmd_buf_l] = sbyte;
|
||||
(*cmd_buf_l)++;
|
||||
if (*cmd_buf_l == 2) {
|
||||
rn->interfaces[cmd_buf[0]] = cmd_buf[1];
|
||||
*cmd_buf_l = 0;
|
||||
}
|
||||
} else if (*cmd == CMD_FREQUENCY) {
|
||||
if (sbyte == FESC) {
|
||||
@ -233,6 +221,8 @@ int rnode_handle_resp(struct RNode* rn, bool* in_frame, uint8_t* cmd, uint8_t* c
|
||||
rn->lt_alock = at / 100.0;
|
||||
*cmd_buf_l = 0;
|
||||
}
|
||||
} else if (*cmd == CMD_RADIO_STATE) {
|
||||
rn->int_state[rn->sel_int] = sbyte;
|
||||
} else if (*cmd == CMD_ROM_READ) {
|
||||
if (sbyte == FESC) {
|
||||
escape = true;
|
||||
@ -283,15 +273,15 @@ int rnode_handle_resp(struct RNode* rn, bool* in_frame, uint8_t* cmd, uint8_t* c
|
||||
*/
|
||||
int rnode_detect(struct RNode* rn) {
|
||||
int err_code;
|
||||
uint8_t tx_buf[20];
|
||||
uint8_t tx_buf[16];
|
||||
bool in_frame = false;
|
||||
uint8_t cmd = CMD_UNKNOWN;
|
||||
uint8_t cmd_buf[10] = {0};
|
||||
uint8_t cmd_buf_l = 0;
|
||||
uint16_t frame_len = 0;
|
||||
|
||||
memcpy(tx_buf, (uint8_t[20]){FEND, CMD_DETECT, DETECT_REQ, FEND, FEND, CMD_FW_VERSION, 0x00, FEND, FEND, CMD_PLATFORM, 0x00, FEND, FEND, CMD_MCU, 0x00, FEND, FEND, CMD_INTERFACES, 0x00, FEND}, 20*sizeof(uint8_t));
|
||||
err_code = write_port(rn->fd, tx_buf, 20);
|
||||
memcpy(tx_buf, (uint8_t[16]){FEND, CMD_DETECT, DETECT_REQ, FEND, FEND, CMD_FW_VERSION, 0x00, FEND, FEND, CMD_PLATFORM, 0x00, FEND, FEND, CMD_MCU, 0x00, FEND}, 16*sizeof(uint8_t));
|
||||
err_code = write_port(rn->fd, tx_buf, 16);
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
@ -541,8 +531,14 @@ int rnode_get_interfaces(struct RNode* rn) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
}
|
||||
|
||||
if (err_code > 0) {
|
||||
return 0;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
|
||||
|
||||
return err_code;
|
||||
}
|
||||
|
||||
/* Radio configuration functions */
|
||||
@ -739,8 +735,8 @@ int rnode_set_txp(struct RNode* rn, uint8_t txp) {
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (!err_code) {
|
||||
return rn->txp;
|
||||
if (err_code > 0) {
|
||||
return txp == rn->txp ? 0 : -1;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
@ -803,8 +799,8 @@ int rnode_set_sf(struct RNode* rn, uint8_t sf) {
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (!err_code) {
|
||||
return rn->sf;
|
||||
if (err_code > 0) {
|
||||
return sf == rn->sf ? 0 : -1;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
@ -816,6 +812,7 @@ int rnode_set_sf(struct RNode* rn, uint8_t sf) {
|
||||
/* Get spreading factor on an RNode
|
||||
* Scope: public
|
||||
* Returns
|
||||
* >=5 - spreading factor
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
@ -867,8 +864,8 @@ int rnode_set_cr(struct RNode* rn, uint8_t cr) {
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (!err_code) {
|
||||
return rn->cr;
|
||||
if (err_code > 0) {
|
||||
return cr == rn->cr ? 0 : -1;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
@ -880,6 +877,7 @@ int rnode_set_cr(struct RNode* rn, uint8_t cr) {
|
||||
/* Get coding rate on an RNode
|
||||
* Scope: public
|
||||
* Returns
|
||||
* >=5 - coding rate
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
@ -899,7 +897,7 @@ int rnode_get_cr(struct RNode* rn) {
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (!err_code) {
|
||||
if (err_code > 0) {
|
||||
return rn->cr;
|
||||
} else {
|
||||
return err_code;
|
||||
@ -934,8 +932,8 @@ float rnode_set_st_alock(struct RNode* rn, float at_l) {
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (!err_code) {
|
||||
return rn->st_alock;
|
||||
if (err_code > 0) {
|
||||
return at_l == rn->st_alock ? 0 : -1;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
@ -969,8 +967,8 @@ float rnode_set_lt_alock(struct RNode* rn, float at_l) {
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (!err_code) {
|
||||
return rn->lt_alock;
|
||||
if (err_code > 0) {
|
||||
return at_l == rn->lt_alock ? 0 : -1;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
@ -979,6 +977,48 @@ float rnode_set_lt_alock(struct RNode* rn, float at_l) {
|
||||
}
|
||||
}
|
||||
|
||||
/* Start or stop selected interface on an RNode
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_set_interface_state(struct RNode* rn, bool state) {
|
||||
int err_code;
|
||||
uint8_t tx_buf[4];
|
||||
bool in_frame = false;
|
||||
uint8_t cmd = CMD_UNKNOWN;
|
||||
uint8_t cmd_buf[10] = {0};
|
||||
uint8_t cmd_buf_l = 0;
|
||||
uint16_t frame_len = 0;
|
||||
|
||||
memcpy(tx_buf, (uint8_t[4]){FEND, CMD_RADIO_STATE, state, FEND}, 4*sizeof(uint8_t));
|
||||
|
||||
err_code = write_port(rn->fd, tx_buf, 4);
|
||||
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
if (err_code > 0) {
|
||||
return state == rn->int_state[rn->sel_int] ? 0 : -1;
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
} else {
|
||||
return err_code;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get selected interface state on an RNode
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_get_interface_state(struct RNode* rn) {
|
||||
return rn->int_state[rn->sel_int];
|
||||
}
|
||||
|
||||
/* Mode selection functions */
|
||||
|
||||
/* Enable the host-controlled (normal) mode of operation on an RNode
|
||||
@ -1115,6 +1155,12 @@ int rnode_set_hw_rev(struct RNode* rn, uint8_t hw_rev) {
|
||||
return rnode_write_eeprom(rn, ADDR_HW_REV, hw_rev);
|
||||
}
|
||||
|
||||
/* Sets an RNode's serial in its EEPROM
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_set_serial(struct RNode* rn, uint8_t* serial) {
|
||||
int err_code = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
@ -1206,6 +1252,7 @@ int rnode_set_checksum(struct RNode* rn, uint8_t* checksum) {
|
||||
}
|
||||
|
||||
/* Generate's an RNode's EEPROM signature from the checksum
|
||||
* THE RETURNED POINTER MUST BE free()'D!
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
@ -1327,7 +1374,7 @@ int rnode_dump_eeprom(struct RNode* rn) {
|
||||
uint8_t tx_buf[4];
|
||||
bool in_frame = false;
|
||||
uint8_t cmd = CMD_UNKNOWN;
|
||||
uint8_t cmd_buf[10] = {0};
|
||||
uint8_t cmd_buf[256] = {0};
|
||||
uint8_t cmd_buf_l = 0;
|
||||
uint16_t frame_len = 0;
|
||||
|
||||
@ -1335,10 +1382,11 @@ int rnode_dump_eeprom(struct RNode* rn) {
|
||||
err_code = write_port(rn->fd, tx_buf, 4);
|
||||
|
||||
if (!err_code) {
|
||||
sleep_ms(100);
|
||||
err_code = rnode_handle_resp(rn, &in_frame, &cmd, cmd_buf, &cmd_buf_l, &frame_len);
|
||||
}
|
||||
|
||||
return err_code;
|
||||
return err_code > 0 ? 0 : -1;
|
||||
}
|
||||
|
||||
/* Verify an RNode's EEPROM matches the expected values
|
||||
|
@ -120,6 +120,8 @@ struct RNode {
|
||||
|
||||
uint8_t interfaces[MAX_INTERFACES];
|
||||
|
||||
uint8_t int_state[MAX_INTERFACES];
|
||||
|
||||
//
|
||||
|
||||
void (*prog_cb)(uint8_t);
|
||||
@ -340,13 +342,22 @@ float rnode_set_st_alock(struct RNode* rn, float at_l);
|
||||
*/
|
||||
float rnode_set_lt_alock(struct RNode* rn, float at_l);
|
||||
|
||||
/* Set radio modem state (on or off)
|
||||
|
||||
/* Start or stop selected interface on an RNode
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_set_radio_state(struct RNode* rn, bool state);
|
||||
int rnode_set_interface_state(struct RNode* rn, bool state);
|
||||
|
||||
/* Get selected interface state on an RNode
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_get_interface_state(struct RNode* rn);
|
||||
|
||||
/* Mode selection functions */
|
||||
|
||||
@ -400,6 +411,41 @@ int rnode_set_model(struct RNode* rn, uint8_t model);
|
||||
*/
|
||||
int rnode_set_hw_rev(struct RNode* rn, uint8_t hw_rev);
|
||||
|
||||
/* Sets an RNode's serial in its EEPROM
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_set_serial(struct RNode* rn, uint8_t* serial);
|
||||
|
||||
/* Sets an RNode's manufacture time in its EEPROM
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_set_made_time(struct RNode* rn, uint32_t time);
|
||||
|
||||
/* Calculates an RNode's checksum for its EEPROM. Must ONLY be called AFTER
|
||||
* rnode_set_product, rnode_set_model, rnode_set_hw_rev, rnode_set_serial and
|
||||
* rnode_set_made_time are all called. OR alternatively, after rnode_get_eeprom.
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
* -3 - provided array was too small
|
||||
*/
|
||||
int rnode_calculate_checksum(struct RNode* rn, uint8_t* checksum);
|
||||
|
||||
/* Sets an RNode's checksum in its EEPROM
|
||||
* Scope: public
|
||||
* Returns
|
||||
* 0 - success
|
||||
* -1 - generic error
|
||||
*/
|
||||
int rnode_set_checksum(struct RNode* rn, uint8_t* checksum);
|
||||
|
||||
/* Generate's an RNode's EEPROM signature from the checksum
|
||||
* Scope: public
|
||||
* Returns
|
||||
|
66
tests/test.c
66
tests/test.c
@ -15,11 +15,11 @@
|
||||
char* port = "/dev/ttyACM0";
|
||||
//char* port = "/dev/serial/by-id/usb-Heltec_HT-n5262_1E35113239EFFE55-if00";
|
||||
char* zip = "/home/elimin8/Downloads/rnode_firmware_t3s3_sx1280_pa.zip";
|
||||
char* key = "/home/elimin8/.config/rnodeconf/firmware/signing.key";
|
||||
char* key = "/home/jake/.config/rnodeconf/firmware/signing.key";
|
||||
uint32_t baud = 115200;
|
||||
struct RNode rn = {0};
|
||||
|
||||
EVP_PKEY* load_key(struct RNode* rn, char* path) {
|
||||
EVP_PKEY* load_key(char* path) {
|
||||
EVP_PKEY *priv_key = EVP_PKEY_new();
|
||||
OSSL_DECODER_CTX *dctx;
|
||||
const char *format = "DER"; /* NULL for any format */
|
||||
@ -68,7 +68,7 @@ void esp32_flash(struct RNode* rn, char* zip) {
|
||||
ok(rnode_set_platform(rn, PLATFORM_ESP32) == 0, "RNode set platform");
|
||||
|
||||
time_t start = time(NULL);
|
||||
EVP_PKEY *priv_key = load_key(rn, key);
|
||||
EVP_PKEY *priv_key = load_key(key);
|
||||
ok(priv_key != NULL, "Load EEPROM signing key");
|
||||
rn->product = 0xf0;
|
||||
rn->model = 0xac;
|
||||
@ -89,7 +89,7 @@ void nrf52_flash(struct RNode* rn, char* zip) {
|
||||
ok(rnode_set_platform(rn, PLATFORM_NRF52) == 0, "RNode set platform");
|
||||
|
||||
time_t start = time(NULL);
|
||||
EVP_PKEY *priv_key = load_key(rn, key);
|
||||
EVP_PKEY *priv_key = load_key(key);
|
||||
ok(priv_key != NULL, "Load EEPROM signing key");
|
||||
rn->product = 0x10;
|
||||
rn->model = 0x12;
|
||||
@ -100,10 +100,10 @@ void nrf52_flash(struct RNode* rn, char* zip) {
|
||||
}
|
||||
|
||||
int main() {
|
||||
//printf("--- RNode reset test ---\n\n");
|
||||
|
||||
ok(rnode_init(&rn, port, baud, true, false) == 0, "RNode initialisation & detection");
|
||||
|
||||
//printf("--- RNode reset test ---\n\n");
|
||||
//ok(rnode_reset(&rn) == 0, "RNode reset");
|
||||
//sleep_ms(5000);
|
||||
|
||||
@ -186,21 +186,61 @@ int main() {
|
||||
//printf("--- RNode flash & provision test ---\n\n");
|
||||
|
||||
|
||||
printf("--- RNode TNC mode test ---\n\n");
|
||||
//printf("--- RNode TNC mode test ---\n\n");
|
||||
|
||||
ok(rnode_get_interfaces(&rn) == 0, "Get interfaces");
|
||||
//ok(rnode_get_interfaces(&rn) == 0, "Get interfaces");
|
||||
|
||||
ok(rnode_select_interface(&rn, 0) == 0, "Select interface 0");
|
||||
//ok(rnode_select_interface(&rn, 0) == 0, "Select interface 0");
|
||||
|
||||
ok(rnode_set_freq(&rn, 865700000) > 0, "Set frequency");
|
||||
//ok(rnode_set_freq(&rn, 865700000) > 0, "Set frequency");
|
||||
|
||||
ok(rnode_set_sf(&rn, 7) == 0, "Set spreading factor");
|
||||
//ok(rnode_set_sf(&rn, 7) == 0, "Set spreading factor");
|
||||
|
||||
ok(rnode_set_cr(&rn, 7) == 0, "Set coding rate");
|
||||
//ok(rnode_set_cr(&rn, 7) == 0, "Set coding rate");
|
||||
|
||||
ok(rnode_set_txp(&rn, 7) == 0, "Set TX power");
|
||||
//ok(rnode_set_txp(&rn, 7) == 0, "Set TX power");
|
||||
|
||||
ok(rnode_set_tnc_mode(&rn) == 0, "Enable TNC mode");
|
||||
//ok(rnode_set_st_alock(&rn, 10) == 0, "Set ST alock");
|
||||
|
||||
//ok(rnode_set_lt_alock(&rn, 10) == 0, "Set LT alock");
|
||||
|
||||
//ok(rnode_set_interface_state(&rn, true) == 0, "Enable radio interface");
|
||||
|
||||
//ok(rnode_set_tnc_mode(&rn) == 0, "Enable TNC mode");
|
||||
|
||||
//printf("--- RNode EEPROM read test ---\n\n");
|
||||
|
||||
//ok(rnode_get_eeprom(&rn) == 0, "Retrieve EEPROM");
|
||||
|
||||
printf("--- RNode EEPROM provision test ---\n\n");
|
||||
|
||||
ok(rnode_set_product(&rn, 0x20) == 0, "Set EEPROM product");
|
||||
|
||||
ok(rnode_set_model(&rn, 0x21) == 0, "Set EEPROM product");
|
||||
|
||||
ok(rnode_set_hw_rev(&rn, 0x01) == 0, "Set hardware revision");
|
||||
|
||||
uint8_t serial[4] = {0};
|
||||
|
||||
ok(rnode_set_serial(&rn, serial) == 0, "Set serial");
|
||||
|
||||
ok(rnode_set_made_time(&rn, 3200) == 0, "Set manufacture time & date");
|
||||
|
||||
uint8_t checksum[11] = {0};
|
||||
|
||||
ok(rnode_calculate_checksum(&rn, checksum) == 0, "Calculate checksum");
|
||||
|
||||
ok(rnode_set_checksum(&rn, checksum) == 0, "Set checksum");
|
||||
|
||||
EVP_PKEY *priv_key = load_key(key);
|
||||
|
||||
void* signature = rnode_generate_signature(&rn, priv_key);
|
||||
|
||||
ok(signature != NULL, "Generate signature");
|
||||
|
||||
ok(rnode_set_signature(&rn, signature) == 0, "Set signature");
|
||||
|
||||
free(signature);
|
||||
|
||||
ok(rnode_cleanup(&rn) == 0, "RNode cleanup");
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user