Lora Transceiver Firmware with serial interface

Dependencies:   LoraTransport SX1272Lib XRange_mbed_src

Fork of XRangePingPong by Milen Pavlov

Committer:
trusch
Date:
Thu Oct 13 09:41:23 2016 +0000
Revision:
1:b7fc10b595f3
Parent:
0:5ff027a21ffb
initial commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
netblocks 0:5ff027a21ffb 1 #include "mbed.h"
trusch 1:b7fc10b595f3 2 #include "LoraTransport.h"
netblocks 0:5ff027a21ffb 3
trusch 1:b7fc10b595f3 4 Serial pc(PA_2, PA_3);
netblocks 0:5ff027a21ffb 5
trusch 1:b7fc10b595f3 6 uint8_t responsePackage[MAX_PAYLOAD_SIZE + 4] = {0};
netblocks 0:5ff027a21ffb 7
trusch 1:b7fc10b595f3 8 uint8_t buf[MAX_PAYLOAD_SIZE] = {0};
trusch 1:b7fc10b595f3 9 uint8_t counter = 0;
trusch 1:b7fc10b595f3 10 uint16_t addr = 0;
trusch 1:b7fc10b595f3 11 uint8_t length = 0;
netblocks 0:5ff027a21ffb 12
trusch 1:b7fc10b595f3 13 enum Command {
trusch 1:b7fc10b595f3 14 SETADDR = 0,
trusch 1:b7fc10b595f3 15 SENDTO = 1
trusch 1:b7fc10b595f3 16 };
netblocks 0:5ff027a21ffb 17
trusch 1:b7fc10b595f3 18 enum State {
trusch 1:b7fc10b595f3 19 NO_CMD = -1,
netblocks 0:5ff027a21ffb 20
trusch 1:b7fc10b595f3 21 GOT_CMD_SETADDR,
trusch 1:b7fc10b595f3 22 GOT_SETADDR_B1,
netblocks 0:5ff027a21ffb 23
trusch 1:b7fc10b595f3 24 GOT_CMD_SENDTO,
trusch 1:b7fc10b595f3 25 GOT_SENDTO_ADDR_B1,
trusch 1:b7fc10b595f3 26 GOT_SENDTO_ADDR_B2,
trusch 1:b7fc10b595f3 27 GOT_SENDTO_LEN,
trusch 1:b7fc10b595f3 28 GOT_SENDTO_MSG
trusch 1:b7fc10b595f3 29 } state = NO_CMD;
trusch 1:b7fc10b595f3 30
trusch 1:b7fc10b595f3 31 void setCmd(char byte) {
trusch 1:b7fc10b595f3 32 switch (byte) {
trusch 1:b7fc10b595f3 33 case SETADDR: {
trusch 1:b7fc10b595f3 34 state = GOT_CMD_SETADDR;
netblocks 0:5ff027a21ffb 35 break;
trusch 1:b7fc10b595f3 36 }
trusch 1:b7fc10b595f3 37 case SENDTO: {
trusch 1:b7fc10b595f3 38 state = GOT_CMD_SENDTO;
netblocks 0:5ff027a21ffb 39 break;
trusch 1:b7fc10b595f3 40 }
trusch 1:b7fc10b595f3 41 }
trusch 1:b7fc10b595f3 42 }
trusch 1:b7fc10b595f3 43
trusch 1:b7fc10b595f3 44 void writeToSerial(const char* msg, const size_t length) {
trusch 1:b7fc10b595f3 45 for (size_t i = 0; i < length; i++) {
trusch 1:b7fc10b595f3 46 pc.putc(msg[i]);
netblocks 0:5ff027a21ffb 47 }
netblocks 0:5ff027a21ffb 48 }
netblocks 0:5ff027a21ffb 49
trusch 1:b7fc10b595f3 50 void RXHandler() {
trusch 1:b7fc10b595f3 51 while (pc.readable()) {
trusch 1:b7fc10b595f3 52 char byte = pc.getc();
trusch 1:b7fc10b595f3 53 switch (state) {
trusch 1:b7fc10b595f3 54 case NO_CMD: {
trusch 1:b7fc10b595f3 55 setCmd(byte);
trusch 1:b7fc10b595f3 56 break;
trusch 1:b7fc10b595f3 57 }
trusch 1:b7fc10b595f3 58
trusch 1:b7fc10b595f3 59 case GOT_CMD_SETADDR: {
trusch 1:b7fc10b595f3 60 addr = byte << 8;
trusch 1:b7fc10b595f3 61 state = GOT_SETADDR_B1;
trusch 1:b7fc10b595f3 62 break;
trusch 1:b7fc10b595f3 63 }
trusch 1:b7fc10b595f3 64 case GOT_SETADDR_B1: {
trusch 1:b7fc10b595f3 65 addr += byte;
trusch 1:b7fc10b595f3 66 LoraTransport::setAddress(addr);
trusch 1:b7fc10b595f3 67 writeToSerial("\x80\x01", 2);
trusch 1:b7fc10b595f3 68 state = NO_CMD;
trusch 1:b7fc10b595f3 69 break;
trusch 1:b7fc10b595f3 70 }
netblocks 0:5ff027a21ffb 71
trusch 1:b7fc10b595f3 72 case GOT_CMD_SENDTO: {
trusch 1:b7fc10b595f3 73 addr = byte << 8;
trusch 1:b7fc10b595f3 74 state = GOT_SENDTO_ADDR_B1;
trusch 1:b7fc10b595f3 75 break;
trusch 1:b7fc10b595f3 76 }
trusch 1:b7fc10b595f3 77 case GOT_SENDTO_ADDR_B1: {
trusch 1:b7fc10b595f3 78 addr += byte;
trusch 1:b7fc10b595f3 79 state = GOT_SENDTO_ADDR_B2;
trusch 1:b7fc10b595f3 80 break;
trusch 1:b7fc10b595f3 81 }
trusch 1:b7fc10b595f3 82 case GOT_SENDTO_ADDR_B2: {
trusch 1:b7fc10b595f3 83 length = byte;
trusch 1:b7fc10b595f3 84 state = GOT_SENDTO_LEN;
trusch 1:b7fc10b595f3 85 counter = 0;
trusch 1:b7fc10b595f3 86 break;
trusch 1:b7fc10b595f3 87 }
trusch 1:b7fc10b595f3 88 case GOT_SENDTO_LEN: {
trusch 1:b7fc10b595f3 89 buf[counter++] = byte;
trusch 1:b7fc10b595f3 90
trusch 1:b7fc10b595f3 91 if (counter == length) {
trusch 1:b7fc10b595f3 92 counter = 0;
trusch 1:b7fc10b595f3 93 state = GOT_SENDTO_MSG;
trusch 1:b7fc10b595f3 94 }
trusch 1:b7fc10b595f3 95 break;
trusch 1:b7fc10b595f3 96 }
trusch 1:b7fc10b595f3 97 }
trusch 1:b7fc10b595f3 98 }
netblocks 0:5ff027a21ffb 99 }
netblocks 0:5ff027a21ffb 100
trusch 1:b7fc10b595f3 101 int main() {
trusch 1:b7fc10b595f3 102 LoraTransport::init();
trusch 1:b7fc10b595f3 103 pc.attach(&RXHandler);
trusch 1:b7fc10b595f3 104
trusch 1:b7fc10b595f3 105 while (1) {
trusch 1:b7fc10b595f3 106 if (state == GOT_SENDTO_MSG) {
trusch 1:b7fc10b595f3 107 LoraTransport::send(addr, buf, length);
trusch 1:b7fc10b595f3 108 for (int i = 0; i < MAX_PAYLOAD_SIZE; i++) {
trusch 1:b7fc10b595f3 109 buf[i] = 0;
trusch 1:b7fc10b595f3 110 }
trusch 1:b7fc10b595f3 111
trusch 1:b7fc10b595f3 112 while (!LoraTransport::done()) {
trusch 1:b7fc10b595f3 113 wait_ms(10);
trusch 1:b7fc10b595f3 114 }
netblocks 0:5ff027a21ffb 115
trusch 1:b7fc10b595f3 116 if (LoraTransport::success()) {
trusch 1:b7fc10b595f3 117 writeToSerial("\x81\x01", 2);
trusch 1:b7fc10b595f3 118 } else {
trusch 1:b7fc10b595f3 119 writeToSerial("\x81\x00", 2);
trusch 1:b7fc10b595f3 120 }
trusch 1:b7fc10b595f3 121 state = NO_CMD;
trusch 1:b7fc10b595f3 122 } else {
trusch 1:b7fc10b595f3 123 LoraTransport::recv();
trusch 1:b7fc10b595f3 124
trusch 1:b7fc10b595f3 125 while (!LoraTransport::done()) {
trusch 1:b7fc10b595f3 126 wait_ms(10);
trusch 1:b7fc10b595f3 127 }
trusch 1:b7fc10b595f3 128
trusch 1:b7fc10b595f3 129 if (LoraTransport::success()) {
trusch 1:b7fc10b595f3 130 LoraTransport::Packet &pkg = LoraTransport::getPacket();
trusch 1:b7fc10b595f3 131 responsePackage[0] = 255;
trusch 1:b7fc10b595f3 132 responsePackage[1] = pkg.from_addr >> 8;
trusch 1:b7fc10b595f3 133 responsePackage[2] = pkg.from_addr & 0x0f;
trusch 1:b7fc10b595f3 134 responsePackage[3] = pkg.payload_size;
trusch 1:b7fc10b595f3 135 memcpy(responsePackage + 4, pkg.payload, pkg.payload_size);
trusch 1:b7fc10b595f3 136 writeToSerial((const char*) responsePackage, pkg.payload_size + 4);
trusch 1:b7fc10b595f3 137 }
trusch 1:b7fc10b595f3 138 }
trusch 1:b7fc10b595f3 139 }
netblocks 0:5ff027a21ffb 140 }