|
51 | 51 | #define CMD_FACTORY_RESET 51 |
52 | 52 | #define CMD_SEND_PATH_DISCOVERY_REQ 52 |
53 | 53 | #define CMD_SET_FLOOD_SCOPE 54 |
| 54 | +#define CMD_SEND_CONTROL_DATA 55 |
54 | 55 |
|
55 | 56 | #define RESP_CODE_OK 0 |
56 | 57 | #define RESP_CODE_ERR 1 |
|
100 | 101 | #define PUSH_CODE_TELEMETRY_RESPONSE 0x8B |
101 | 102 | #define PUSH_CODE_BINARY_RESPONSE 0x8C |
102 | 103 | #define PUSH_CODE_PATH_DISCOVERY_RESPONSE 0x8D |
| 104 | +#define PUSH_CODE_CONTROL_DATA 0x8E |
103 | 105 |
|
104 | 106 | #define ERR_CODE_UNSUPPORTED_CMD 1 |
105 | 107 | #define ERR_CODE_NOT_FOUND 2 |
@@ -626,6 +628,26 @@ bool MyMesh::onContactPathRecv(ContactInfo& contact, uint8_t* in_path, uint8_t i |
626 | 628 | return BaseChatMesh::onContactPathRecv(contact, in_path, in_path_len, out_path, out_path_len, extra_type, extra, extra_len); |
627 | 629 | } |
628 | 630 |
|
| 631 | +void MyMesh::onControlDataRecv(mesh::Packet *packet) { |
| 632 | + if (packet->payload_len + 4 > sizeof(out_frame)) { |
| 633 | + MESH_DEBUG_PRINTLN("onControlDataRecv(), payload_len too long: %d", packet->payload_len); |
| 634 | + return; |
| 635 | + } |
| 636 | + int i = 0; |
| 637 | + out_frame[i++] = PUSH_CODE_CONTROL_DATA; |
| 638 | + out_frame[i++] = (int8_t)(_radio->getLastSNR() * 4); |
| 639 | + out_frame[i++] = (int8_t)(_radio->getLastRSSI()); |
| 640 | + out_frame[i++] = packet->path_len; |
| 641 | + memcpy(&out_frame[i], packet->payload, packet->payload_len); |
| 642 | + i += packet->payload_len; |
| 643 | + |
| 644 | + if (_serial->isConnected()) { |
| 645 | + _serial->writeFrame(out_frame, i); |
| 646 | + } else { |
| 647 | + MESH_DEBUG_PRINTLN("onControlDataRecv(), data received while app offline"); |
| 648 | + } |
| 649 | +} |
| 650 | + |
629 | 651 | void MyMesh::onRawDataRecv(mesh::Packet *packet) { |
630 | 652 | if (packet->payload_len + 4 > sizeof(out_frame)) { |
631 | 653 | MESH_DEBUG_PRINTLN("onRawDataRecv(), payload_len too long: %d", packet->payload_len); |
@@ -1523,6 +1545,14 @@ void MyMesh::handleCmdFrame(size_t len) { |
1523 | 1545 | memset(send_scope.key, 0, sizeof(send_scope.key)); // set scope to null |
1524 | 1546 | } |
1525 | 1547 | writeOKFrame(); |
| 1548 | + } else if (cmd_frame[0] == CMD_SEND_CONTROL_DATA && len >= 2 && (cmd_frame[1] & 0x80) != 0) { |
| 1549 | + auto resp = createControlData(&cmd_frame[1], len - 1); |
| 1550 | + if (resp) { |
| 1551 | + sendZeroHop(resp); |
| 1552 | + writeOKFrame(); |
| 1553 | + } else { |
| 1554 | + writeErrFrame(ERR_CODE_TABLE_FULL); |
| 1555 | + } |
1526 | 1556 | } else { |
1527 | 1557 | writeErrFrame(ERR_CODE_UNSUPPORTED_CMD); |
1528 | 1558 | MESH_DEBUG_PRINTLN("ERROR: unknown command: %02X", cmd_frame[0]); |
|
0 commit comments