Wireless interface using LoRa technology

Dependencies:   AlohaTransceiver RingBuffer SX1276Lib_inAir SerialInterfaceProtocol mbed L3PDU

Committer:
rba90
Date:
Thu Jul 14 11:49:34 2016 +0000
Revision:
1:101cf4fca4e5
Parent:
0:7d8e24cb62c1
Child:
2:5a74ae8be594
Send hardcoded message on request

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rba90 0:7d8e24cb62c1 1 #include "mbed.h"
rba90 0:7d8e24cb62c1 2 #include "AlohaTransceiver.h"
rba90 0:7d8e24cb62c1 3 #include "buffer.h"
rba90 0:7d8e24cb62c1 4 #include "SerialInterfaceProtocol.h"
rba90 0:7d8e24cb62c1 5 #include "AlohaFrame.h"
rba90 0:7d8e24cb62c1 6
rba90 0:7d8e24cb62c1 7 Serial pc(USBTX, USBRX);
rba90 0:7d8e24cb62c1 8
rba90 0:7d8e24cb62c1 9 // sip uses two buffer queues
rba90 0:7d8e24cb62c1 10 CircularBuffer<uint8_t> SerialInputBuffer;
rba90 0:7d8e24cb62c1 11 CircularBuffer<uint8_t> SerialOutputBuffer;
rba90 0:7d8e24cb62c1 12 SerialInterfaceProtocol SIP(&SerialInputBuffer, &SerialOutputBuffer);
rba90 0:7d8e24cb62c1 13
rba90 0:7d8e24cb62c1 14 // aloha transceiver
rba90 0:7d8e24cb62c1 15 AlohaTransceiver aloha;
rba90 0:7d8e24cb62c1 16 AlohaFrame txFrame;
rba90 1:101cf4fca4e5 17 Timer timer;
rba90 0:7d8e24cb62c1 18
rba90 0:7d8e24cb62c1 19 void serialInterruptHandler() {
rba90 0:7d8e24cb62c1 20 // Note: you need to actually read from the serial to clear the RX interrupt
rba90 0:7d8e24cb62c1 21 int c = pc.getc();
rba90 0:7d8e24cb62c1 22
rba90 0:7d8e24cb62c1 23 // add to buffer
rba90 0:7d8e24cb62c1 24 if (SerialInputBuffer.isLocked())
rba90 0:7d8e24cb62c1 25 {
rba90 0:7d8e24cb62c1 26 printf("Mutex Locked\r\n");
rba90 0:7d8e24cb62c1 27 }
rba90 0:7d8e24cb62c1 28 else
rba90 0:7d8e24cb62c1 29 {
rba90 0:7d8e24cb62c1 30 SerialInputBuffer.enqueue((uint8_t) c);
rba90 0:7d8e24cb62c1 31 }
rba90 0:7d8e24cb62c1 32 }
rba90 0:7d8e24cb62c1 33
rba90 0:7d8e24cb62c1 34 int toggleChecksum(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 0:7d8e24cb62c1 35 {
rba90 0:7d8e24cb62c1 36 // one payload
rba90 0:7d8e24cb62c1 37 if (payload_length != 1)
rba90 0:7d8e24cb62c1 38 {
rba90 0:7d8e24cb62c1 39 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 0:7d8e24cb62c1 40 *response_length = 22;
rba90 0:7d8e24cb62c1 41 return 1;
rba90 0:7d8e24cb62c1 42 }
rba90 0:7d8e24cb62c1 43
rba90 0:7d8e24cb62c1 44 if ((bool) payload[0])
rba90 0:7d8e24cb62c1 45 {
rba90 0:7d8e24cb62c1 46 SIP.enableChecksum();
rba90 0:7d8e24cb62c1 47 }
rba90 0:7d8e24cb62c1 48 else
rba90 0:7d8e24cb62c1 49 {
rba90 0:7d8e24cb62c1 50 SIP.disableChecksum();
rba90 0:7d8e24cb62c1 51 }
rba90 0:7d8e24cb62c1 52
rba90 0:7d8e24cb62c1 53 return 0;
rba90 0:7d8e24cb62c1 54 }
rba90 0:7d8e24cb62c1 55
rba90 1:101cf4fca4e5 56 int sendMessage(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 1:101cf4fca4e5 57 {
rba90 1:101cf4fca4e5 58 static uint8_t seqid = 0;
rba90 1:101cf4fca4e5 59
rba90 1:101cf4fca4e5 60 // prepare for the frame
rba90 1:101cf4fca4e5 61 txFrame.setType(AlohaFrame::Aloha_Data);
rba90 1:101cf4fca4e5 62 txFrame.setPayloadLength(0x0);
rba90 1:101cf4fca4e5 63 txFrame.setSourceAddress(0x1);
rba90 1:101cf4fca4e5 64 txFrame.setDestinationAddress(0x2);
rba90 1:101cf4fca4e5 65 txFrame.setFullMessageFlag(0x1);
rba90 1:101cf4fca4e5 66 txFrame.setSequenceID(seqid);
rba90 1:101cf4fca4e5 67 txFrame.generateCrc();
rba90 1:101cf4fca4e5 68
rba90 1:101cf4fca4e5 69
rba90 1:101cf4fca4e5 70 uint8_t buffer[20];
rba90 1:101cf4fca4e5 71 memset(buffer, 0x0, sizeof(buffer));
rba90 1:101cf4fca4e5 72 txFrame.serialize(buffer);
rba90 1:101cf4fca4e5 73
rba90 1:101cf4fca4e5 74
rba90 1:101cf4fca4e5 75 aloha.send(buffer, 20);
rba90 1:101cf4fca4e5 76
rba90 1:101cf4fca4e5 77 // start the timer to measure round trip time
rba90 1:101cf4fca4e5 78 timer.reset();
rba90 1:101cf4fca4e5 79 timer.start();
rba90 1:101cf4fca4e5 80
rba90 1:101cf4fca4e5 81 seqid += 1;
rba90 1:101cf4fca4e5 82
rba90 1:101cf4fca4e5 83 return 0;
rba90 1:101cf4fca4e5 84 }
rba90 1:101cf4fca4e5 85
rba90 1:101cf4fca4e5 86 void AlohaDataHandler(AlohaFrame *frame)
rba90 1:101cf4fca4e5 87 {
rba90 1:101cf4fca4e5 88 // stop the timer to measure round trip time
rba90 1:101cf4fca4e5 89 timer.stop();
rba90 1:101cf4fca4e5 90
rba90 1:101cf4fca4e5 91 printf("Received Frame\r\n");
rba90 0:7d8e24cb62c1 92 printf(" Type: 0x%x, PayloadLength: 0x%x\r\n", frame->getType(), frame->getPayloadLength());
rba90 0:7d8e24cb62c1 93 printf(" SrcAddr: 0x%x, DestAddr: 0x%x\r\n", frame->getSourceAddress(), frame->getDestinationAddress());
rba90 0:7d8e24cb62c1 94 printf(" FMF: 0x%x, SequenceID: 0x%x\r\n", frame->getFullMessageFlag(), frame->getSequenceID());
rba90 0:7d8e24cb62c1 95 for (uint8_t i = 0; i < frame->getPayloadLength(); i++)
rba90 0:7d8e24cb62c1 96 {
rba90 0:7d8e24cb62c1 97 printf(" Payload[%d]: 0x%x\r\n", i, frame->getPayload(i));
rba90 0:7d8e24cb62c1 98 }
rba90 0:7d8e24cb62c1 99 printf(" CRC: 0x%x\r\n", frame->getCrc());
rba90 0:7d8e24cb62c1 100
rba90 1:101cf4fca4e5 101 // decode payload (range test only)
rba90 1:101cf4fca4e5 102 int8_t snr = (int8_t) frame->getPayload(0);
rba90 1:101cf4fca4e5 103
rba90 1:101cf4fca4e5 104 uint16_t rssi_h = frame->getPayload(1);
rba90 1:101cf4fca4e5 105 uint8_t rssi_l = frame->getPayload(2);
rba90 1:101cf4fca4e5 106 int16_t rssi = (int16_t) (rssi_h << 8 | rssi_l);
rba90 0:7d8e24cb62c1 107
rba90 0:7d8e24cb62c1 108
rba90 1:101cf4fca4e5 109 printf("Base Station respond:\r\n");
rba90 1:101cf4fca4e5 110 printf("Rssi: %d, Snr: %d\r\n", rssi, snr);
rba90 1:101cf4fca4e5 111 printf("Round trip time: %d ms\r\n", timer.read_ms());
rba90 0:7d8e24cb62c1 112
rba90 1:101cf4fca4e5 113
rba90 0:7d8e24cb62c1 114 }
rba90 0:7d8e24cb62c1 115
rba90 0:7d8e24cb62c1 116 int main() {
rba90 0:7d8e24cb62c1 117 // initialize radio module
rba90 0:7d8e24cb62c1 118 aloha.BoardInit();
rba90 0:7d8e24cb62c1 119
rba90 0:7d8e24cb62c1 120 // attach serial interrupt handler
rba90 0:7d8e24cb62c1 121 pc.attach(&serialInterruptHandler);
rba90 0:7d8e24cb62c1 122
rba90 0:7d8e24cb62c1 123 // register callback functions for SIP
rba90 0:7d8e24cb62c1 124 SIP.registerCommand(0x00, toggleChecksum);
rba90 1:101cf4fca4e5 125 SIP.registerCommand(0x01, sendMessage);
rba90 0:7d8e24cb62c1 126
rba90 0:7d8e24cb62c1 127 // register callback functions for aloha transceiver
rba90 1:101cf4fca4e5 128 aloha.registerType(AlohaFrame::Aloha_Data, AlohaDataHandler);
rba90 0:7d8e24cb62c1 129
rba90 0:7d8e24cb62c1 130 while(1) {
rba90 0:7d8e24cb62c1 131 SIP.poll();
rba90 0:7d8e24cb62c1 132 aloha.poll();
rba90 0:7d8e24cb62c1 133
rba90 0:7d8e24cb62c1 134 while (SerialOutputBuffer.getCounter() > 0)
rba90 0:7d8e24cb62c1 135 {
rba90 0:7d8e24cb62c1 136 uint8_t ch;
rba90 0:7d8e24cb62c1 137 ch = SerialOutputBuffer.dequeue();
rba90 0:7d8e24cb62c1 138 pc.putc(ch);
rba90 0:7d8e24cb62c1 139 }
rba90 0:7d8e24cb62c1 140 }
rba90 0:7d8e24cb62c1 141 }