Wireless interface using LoRa technology

Dependencies:   AlohaTransceiver RingBuffer SX1276Lib_inAir SerialInterfaceProtocol mbed L3PDU

Committer:
rba90
Date:
Thu Jul 14 05:00:13 2016 +0000
Revision:
0:7d8e24cb62c1
Child:
1:101cf4fca4e5
prepared for range test

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 0:7d8e24cb62c1 17
rba90 0:7d8e24cb62c1 18 void serialInterruptHandler() {
rba90 0:7d8e24cb62c1 19 // Note: you need to actually read from the serial to clear the RX interrupt
rba90 0:7d8e24cb62c1 20 int c = pc.getc();
rba90 0:7d8e24cb62c1 21
rba90 0:7d8e24cb62c1 22 // add to buffer
rba90 0:7d8e24cb62c1 23 if (SerialInputBuffer.isLocked())
rba90 0:7d8e24cb62c1 24 {
rba90 0:7d8e24cb62c1 25 printf("Mutex Locked\r\n");
rba90 0:7d8e24cb62c1 26 }
rba90 0:7d8e24cb62c1 27 else
rba90 0:7d8e24cb62c1 28 {
rba90 0:7d8e24cb62c1 29 SerialInputBuffer.enqueue((uint8_t) c);
rba90 0:7d8e24cb62c1 30 }
rba90 0:7d8e24cb62c1 31 }
rba90 0:7d8e24cb62c1 32
rba90 0:7d8e24cb62c1 33 int toggleChecksum(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 0:7d8e24cb62c1 34 {
rba90 0:7d8e24cb62c1 35 // one payload
rba90 0:7d8e24cb62c1 36 if (payload_length != 1)
rba90 0:7d8e24cb62c1 37 {
rba90 0:7d8e24cb62c1 38 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 0:7d8e24cb62c1 39 *response_length = 22;
rba90 0:7d8e24cb62c1 40 return 1;
rba90 0:7d8e24cb62c1 41 }
rba90 0:7d8e24cb62c1 42
rba90 0:7d8e24cb62c1 43 if ((bool) payload[0])
rba90 0:7d8e24cb62c1 44 {
rba90 0:7d8e24cb62c1 45 SIP.enableChecksum();
rba90 0:7d8e24cb62c1 46 }
rba90 0:7d8e24cb62c1 47 else
rba90 0:7d8e24cb62c1 48 {
rba90 0:7d8e24cb62c1 49 SIP.disableChecksum();
rba90 0:7d8e24cb62c1 50 }
rba90 0:7d8e24cb62c1 51
rba90 0:7d8e24cb62c1 52 return 0;
rba90 0:7d8e24cb62c1 53 }
rba90 0:7d8e24cb62c1 54
rba90 0:7d8e24cb62c1 55 void AlohaDataEcho(AlohaFrame *frame)
rba90 0:7d8e24cb62c1 56 {
rba90 0:7d8e24cb62c1 57 // print received message
rba90 0:7d8e24cb62c1 58 printf("AlohaDataHandler invoked\r\n");
rba90 0:7d8e24cb62c1 59 printf(" Type: 0x%x, PayloadLength: 0x%x\r\n", frame->getType(), frame->getPayloadLength());
rba90 0:7d8e24cb62c1 60 printf(" SrcAddr: 0x%x, DestAddr: 0x%x\r\n", frame->getSourceAddress(), frame->getDestinationAddress());
rba90 0:7d8e24cb62c1 61 printf(" FMF: 0x%x, SequenceID: 0x%x\r\n", frame->getFullMessageFlag(), frame->getSequenceID());
rba90 0:7d8e24cb62c1 62 for (uint8_t i = 0; i < frame->getPayloadLength(); i++)
rba90 0:7d8e24cb62c1 63 {
rba90 0:7d8e24cb62c1 64 printf(" Payload[%d]: 0x%x\r\n", i, frame->getPayload(i));
rba90 0:7d8e24cb62c1 65 }
rba90 0:7d8e24cb62c1 66 printf(" CRC: 0x%x\r\n", frame->getCrc());
rba90 0:7d8e24cb62c1 67
rba90 0:7d8e24cb62c1 68 // echo back to the sender
rba90 0:7d8e24cb62c1 69 txFrame.setType(frame->getType());
rba90 0:7d8e24cb62c1 70 txFrame.setPayloadLength(frame->getPayloadLength());
rba90 0:7d8e24cb62c1 71 txFrame.setSourceAddress(frame->getDestinationAddress());
rba90 0:7d8e24cb62c1 72 txFrame.setDestinationAddress(frame->getSourceAddress());
rba90 0:7d8e24cb62c1 73 txFrame.setFullMessageFlag(frame->getFullMessageFlag());
rba90 0:7d8e24cb62c1 74 txFrame.setSequenceID(frame->getSequenceID() + 1);
rba90 0:7d8e24cb62c1 75 for (uint8_t i = 0; i < frame->getPayloadLength(); i++)
rba90 0:7d8e24cb62c1 76 {
rba90 0:7d8e24cb62c1 77 txFrame.setPayload(frame->getPayload(i), i);
rba90 0:7d8e24cb62c1 78 }
rba90 0:7d8e24cb62c1 79 txFrame.generateCrc();
rba90 0:7d8e24cb62c1 80
rba90 0:7d8e24cb62c1 81
rba90 0:7d8e24cb62c1 82 uint8_t buffer[20];
rba90 0:7d8e24cb62c1 83 memset(buffer, 0x0, sizeof(buffer));
rba90 0:7d8e24cb62c1 84 txFrame.serialize(buffer);
rba90 0:7d8e24cb62c1 85
rba90 0:7d8e24cb62c1 86 aloha.send(buffer, 20);
rba90 0:7d8e24cb62c1 87 }
rba90 0:7d8e24cb62c1 88
rba90 0:7d8e24cb62c1 89 int main() {
rba90 0:7d8e24cb62c1 90 // initialize radio module
rba90 0:7d8e24cb62c1 91 aloha.BoardInit();
rba90 0:7d8e24cb62c1 92
rba90 0:7d8e24cb62c1 93 // attach serial interrupt handler
rba90 0:7d8e24cb62c1 94 pc.attach(&serialInterruptHandler);
rba90 0:7d8e24cb62c1 95
rba90 0:7d8e24cb62c1 96 // register callback functions for SIP
rba90 0:7d8e24cb62c1 97 SIP.registerCommand(0x00, toggleChecksum);
rba90 0:7d8e24cb62c1 98
rba90 0:7d8e24cb62c1 99 // register callback functions for aloha transceiver
rba90 0:7d8e24cb62c1 100 aloha.registerType(AlohaFrame::Aloha_Data, AlohaDataEcho);
rba90 0:7d8e24cb62c1 101
rba90 0:7d8e24cb62c1 102 while(1) {
rba90 0:7d8e24cb62c1 103 SIP.poll();
rba90 0:7d8e24cb62c1 104 aloha.poll();
rba90 0:7d8e24cb62c1 105
rba90 0:7d8e24cb62c1 106 while (SerialOutputBuffer.getCounter() > 0)
rba90 0:7d8e24cb62c1 107 {
rba90 0:7d8e24cb62c1 108 uint8_t ch;
rba90 0:7d8e24cb62c1 109 ch = SerialOutputBuffer.dequeue();
rba90 0:7d8e24cb62c1 110 pc.putc(ch);
rba90 0:7d8e24cb62c1 111 }
rba90 0:7d8e24cb62c1 112 }
rba90 0:7d8e24cb62c1 113 }