Wireless interface using LoRa technology

Dependencies:   AlohaTransceiver RingBuffer SX1276Lib_inAir SerialInterfaceProtocol mbed L3PDU

Revision:
1:101cf4fca4e5
Parent:
0:7d8e24cb62c1
Child:
2:5a74ae8be594
--- a/main.cpp	Thu Jul 14 05:00:13 2016 +0000
+++ b/main.cpp	Thu Jul 14 11:49:34 2016 +0000
@@ -14,6 +14,7 @@
 // aloha transceiver
 AlohaTransceiver aloha;
 AlohaFrame txFrame;
+Timer timer;
 
 void serialInterruptHandler() {
     // Note: you need to actually read from the serial to clear the RX interrupt
@@ -52,10 +53,42 @@
     return 0;
 }
 
-void AlohaDataEcho(AlohaFrame *frame)
-{    
-    // print received message
-    printf("AlohaDataHandler invoked\r\n");
+int sendMessage(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
+{
+    static uint8_t seqid = 0;
+    
+    // prepare for the frame
+    txFrame.setType(AlohaFrame::Aloha_Data);
+    txFrame.setPayloadLength(0x0);
+    txFrame.setSourceAddress(0x1);
+    txFrame.setDestinationAddress(0x2);
+    txFrame.setFullMessageFlag(0x1);
+    txFrame.setSequenceID(seqid);
+    txFrame.generateCrc();
+    
+    
+    uint8_t buffer[20];
+    memset(buffer, 0x0, sizeof(buffer));
+    txFrame.serialize(buffer);
+    
+    
+    aloha.send(buffer, 20);
+    
+    // start the timer to measure round trip time
+    timer.reset();
+    timer.start();
+    
+    seqid += 1;
+
+    return 0;   
+}
+
+void AlohaDataHandler(AlohaFrame *frame)
+{
+    // stop the timer to measure round trip time
+    timer.stop();
+    
+    printf("Received Frame\r\n");
     printf("    Type: 0x%x, PayloadLength: 0x%x\r\n", frame->getType(), frame->getPayloadLength());
     printf("    SrcAddr: 0x%x, DestAddr: 0x%x\r\n", frame->getSourceAddress(), frame->getDestinationAddress());
     printf("    FMF: 0x%x, SequenceID: 0x%x\r\n", frame->getFullMessageFlag(), frame->getSequenceID());
@@ -65,25 +98,19 @@
     }
     printf("    CRC: 0x%x\r\n", frame->getCrc());
     
-    // echo back to the sender
-    txFrame.setType(frame->getType());
-    txFrame.setPayloadLength(frame->getPayloadLength());
-    txFrame.setSourceAddress(frame->getDestinationAddress());
-    txFrame.setDestinationAddress(frame->getSourceAddress());
-    txFrame.setFullMessageFlag(frame->getFullMessageFlag());
-    txFrame.setSequenceID(frame->getSequenceID() + 1);
-    for (uint8_t i = 0; i < frame->getPayloadLength(); i++)
-    {
-        txFrame.setPayload(frame->getPayload(i), i);   
-    }
-    txFrame.generateCrc();
+    // decode payload (range test only)
+    int8_t snr = (int8_t) frame->getPayload(0);
+    
+    uint16_t rssi_h = frame->getPayload(1);
+    uint8_t rssi_l = frame->getPayload(2);
+    int16_t rssi = (int16_t) (rssi_h << 8 | rssi_l);
     
     
-    uint8_t buffer[20];
-    memset(buffer, 0x0, sizeof(buffer));
-    txFrame.serialize(buffer);
+    printf("Base Station respond:\r\n");
+    printf("Rssi: %d, Snr: %d\r\n", rssi, snr);
+    printf("Round trip time: %d ms\r\n", timer.read_ms());
     
-    aloha.send(buffer, 20);
+    
 }
 
 int main() {
@@ -95,9 +122,10 @@
     
     // register callback functions for SIP
     SIP.registerCommand(0x00, toggleChecksum);
+    SIP.registerCommand(0x01, sendMessage);
     
     // register callback functions for aloha transceiver
-    aloha.registerType(AlohaFrame::Aloha_Data, AlohaDataEcho);
+    aloha.registerType(AlohaFrame::Aloha_Data, AlohaDataHandler);
     
     while(1) {
         SIP.poll();