Wireless interface using LoRa technology
Dependencies: AlohaTransceiver RingBuffer SX1276Lib_inAir SerialInterfaceProtocol mbed L3PDU
Diff: main.cpp
- Revision:
- 16:dcc5f9075595
- Parent:
- 15:cfc7d817e444
- Child:
- 17:7093a533b4ae
--- a/main.cpp Fri Aug 12 03:34:51 2016 +0000 +++ b/main.cpp Tue Aug 23 04:50:45 2016 +0000 @@ -20,9 +20,22 @@ InterruptIn button(USER_BUTTON); // sensors -#define SUPPLY_VOLTAGE 3.3; +#define SUPPLY_VOLTAGE 3.3f; AnalogIn TempSensor(PA_0); +// convert fp32 to 4 byte string +typedef union +{ + float fp32; + uint8_t bytes[4]; +} float_bytes_32; + +typedef union +{ + int16_t int16; + uint8_t bytes[2]; +} int_string_16; + float getTemperature() { float reading = TempSensor.read(); @@ -67,6 +80,42 @@ return 0; } +int queryServiceQuality(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length) +{ + // decode user message + uint8_t node_id = payload[0]; + + // create a command packet + ControlPacket packet; + + // layer 3 sequence id is not used in this case + packet.setSequenceID(0x0); + + // set source id as current device id + packet.setSourceID(aloha.getDeviceID()); + + // set destination id as node id + packet.setDestinationID(node_id); + + // set command as query (0x03) + packet.setCommand(0x03); + + // generate crc + packet.generateCrc(); + + // create buffer for transmission + uint8_t buffer[8]; + memset(buffer, 0x0, sizeof(buffer)); + + // copy bytes into buffer + packet.serialize(buffer); + + // send to aloha transceiver + aloha.send(buffer, 8, node_id); + + return 0; +} + /* * Format: * < :start flag @@ -450,10 +499,82 @@ break; } + + case 0x2: // received response for service quality + { + uint8_t payload[6]; + + // first byte is the snr of foreign host + payload[0] = controlPacket.getData(0); + + // second and third byte are the rssi of foreign host + payload[1] = controlPacket.getData(1); + payload[2] = controlPacket.getData(2); + + // fourth byte is the snr of local host + payload[3] = (uint8_t) aloha.getSnr(); + + // fifth and sixth byte are the rssi of local host + int_string_16 rssi; + rssi.int16 = aloha.getRssi(); + + payload[4] = rssi.bytes[0]; + payload[5] = rssi.bytes[1]; + + // make response + SIP.respond(0xf1, payload, 3); + + break; + } + case 0x3: // respond for service quality + { + int_string_16 rssi; + uint8_t snr; + + // get rssi and snr + rssi.int16 = aloha.getRssi(); + snr = aloha.getSnr(); + + // create response + ControlPacket response; + + // set layer 3 sequence id + response.setSequenceID(0x0); + + // set source id + response.setSourceID(aloha.getDeviceID()); + + // set destination id + response.setDestinationID(src_addr); + + // set command as respond + response.setCommand(0x2); + + // set payload + response.setData(0, (uint8_t) snr); // store SNR + response.setData(1, (uint8_t) rssi.bytes[0]); // store higher bits of RSSI + response.setData(2, (uint8_t) rssi.bytes[1]); // store lower bits of RSSI + + // generate crc + packet.generateCrc(); + + // create buffer for transmission + uint8_t buffer[8]; + memset(buffer, 0x0, sizeof(buffer)); + + // copy bytes into buffer + packet.serialize(buffer); + + // send to aloha transceiver + aloha.send(buffer, 8, src_addr); + + break; + } + default: break; } - + break; } case BasicPacket::L3DataBlockPacket: @@ -500,7 +621,7 @@ // register callback functions for SIP SIP.registerCommand(0x00, toggleChecksum); - SIP.registerCommand(0x01, NULL); // disable sendMessage for now + SIP.registerCommand(0x01, queryServiceQuality); SIP.registerCommand(0x02, configureRadio); SIP.registerCommand(0x03, radioUpdateSettings);