Koncentrator
Dependencies: SX127x mbed-rtos mbed
comm.cpp@0:dd55179403eb, 2015-06-03 (annotated)
- Committer:
- MrSteel
- Date:
- Wed Jun 03 13:50:55 2015 +0000
- Revision:
- 0:dd55179403eb
Koncentrator
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MrSteel | 0:dd55179403eb | 1 | #include "mbed.h" |
MrSteel | 0:dd55179403eb | 2 | #include "stdlib.h" |
MrSteel | 0:dd55179403eb | 3 | #include "rtos.h" |
MrSteel | 0:dd55179403eb | 4 | #include "sx127x_lora.h" |
MrSteel | 0:dd55179403eb | 5 | #include "comm.h" |
MrSteel | 0:dd55179403eb | 6 | #include "fun.h" |
MrSteel | 0:dd55179403eb | 7 | #include "application.h" |
MrSteel | 0:dd55179403eb | 8 | |
MrSteel | 0:dd55179403eb | 9 | queueStruct queue[5]; |
MrSteel | 0:dd55179403eb | 10 | uartBufferStructure pcBuffer; |
MrSteel | 0:dd55179403eb | 11 | uartBufferStructure fiberOpticBuffer; |
MrSteel | 0:dd55179403eb | 12 | uartBufferStructure loraBuffer; |
MrSteel | 0:dd55179403eb | 13 | |
MrSteel | 0:dd55179403eb | 14 | Mutex pc_mutex; // Mutex for RTOS system - USB serial port |
MrSteel | 0:dd55179403eb | 15 | Mutex fiberOptic_mutex; // Mutex for RTOS system - Fiber optic port |
MrSteel | 0:dd55179403eb | 16 | Mutex lora_mutex; |
MrSteel | 0:dd55179403eb | 17 | |
MrSteel | 0:dd55179403eb | 18 | Timer txFiberOpticTmr; |
MrSteel | 0:dd55179403eb | 19 | Timer rxFiberOpticTmr; |
MrSteel | 0:dd55179403eb | 20 | Timer pcTmr; |
MrSteel | 0:dd55179403eb | 21 | |
MrSteel | 0:dd55179403eb | 22 | void pc_thread(void const *argument) { |
MrSteel | 0:dd55179403eb | 23 | pcBuffer.buf = (unsigned char *)malloc(sizeof(char)*PC_RX_BUFFER); |
MrSteel | 0:dd55179403eb | 24 | pc.baud(PC_BAUD); |
MrSteel | 0:dd55179403eb | 25 | pc.attach(&pc_handle); |
MrSteel | 0:dd55179403eb | 26 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 27 | pc.printf("\n#: Application %s \n#: Source ID: %d \n#: Destination ID: %d \n#: PC thread Started with BAUD(%d)", APP,SOURCE_ID,DESTINATION_ID,PC_BAUD); |
MrSteel | 0:dd55179403eb | 28 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 29 | while(true){ |
MrSteel | 0:dd55179403eb | 30 | wait_ms(1); |
MrSteel | 0:dd55179403eb | 31 | } |
MrSteel | 0:dd55179403eb | 32 | } |
MrSteel | 0:dd55179403eb | 33 | |
MrSteel | 0:dd55179403eb | 34 | void lora_thread(void const *argument){ |
MrSteel | 0:dd55179403eb | 35 | Timer txLoraTmr; |
MrSteel | 0:dd55179403eb | 36 | |
MrSteel | 0:dd55179403eb | 37 | // Initialize lora |
MrSteel | 0:dd55179403eb | 38 | kom.init(); |
MrSteel | 0:dd55179403eb | 39 | Lora.enable(); |
MrSteel | 0:dd55179403eb | 40 | Lora.setSf(8); |
MrSteel | 0:dd55179403eb | 41 | Lora.setBw(250); |
MrSteel | 0:dd55179403eb | 42 | |
MrSteel | 0:dd55179403eb | 43 | kom.set_frf_MHz(868); |
MrSteel | 0:dd55179403eb | 44 | Lora.start_rx(); |
MrSteel | 0:dd55179403eb | 45 | |
MrSteel | 0:dd55179403eb | 46 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 47 | pc.printf("\n#: LoRa thread started"); |
MrSteel | 0:dd55179403eb | 48 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 49 | loraBuffer.buf = (unsigned char *)malloc(sizeof(char)*LORA_RX_BUFFER); |
MrSteel | 0:dd55179403eb | 50 | |
MrSteel | 0:dd55179403eb | 51 | txLoraTmr.stop(); |
MrSteel | 0:dd55179403eb | 52 | txLoraTmr.reset(); |
MrSteel | 0:dd55179403eb | 53 | txLoraTmr.start(); |
MrSteel | 0:dd55179403eb | 54 | |
MrSteel | 0:dd55179403eb | 55 | int step = 0; |
MrSteel | 0:dd55179403eb | 56 | while(true){ |
MrSteel | 0:dd55179403eb | 57 | // PING rutine |
MrSteel | 0:dd55179403eb | 58 | |
MrSteel | 0:dd55179403eb | 59 | if(txLoraTmr.read_ms()>=500 && step==0) { |
MrSteel | 0:dd55179403eb | 60 | unsigned char tmpStr[] = {pSTX, sys.last_ppe_id[0], 0, SOURCE_ID, 0, 1, 0, 1, pBEL, pETX}; |
MrSteel | 0:dd55179403eb | 61 | //lora_mutex.lock(); |
MrSteel | 0:dd55179403eb | 62 | printStr(LORA_TARGET,tmpStr,sizeof(tmpStr)); |
MrSteel | 0:dd55179403eb | 63 | //lora_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 64 | sys.last_ppe_id[0] = sys.last_ppe_id[0] + 1; |
MrSteel | 0:dd55179403eb | 65 | txLoraTmr.reset(); |
MrSteel | 0:dd55179403eb | 66 | step++; |
MrSteel | 0:dd55179403eb | 67 | |
MrSteel | 0:dd55179403eb | 68 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 69 | pc.printf("\n<:"); |
MrSteel | 0:dd55179403eb | 70 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 71 | TX_LED = SetLed; |
MrSteel | 0:dd55179403eb | 72 | } |
MrSteel | 0:dd55179403eb | 73 | if(txLoraTmr.read_ms()>=500 && step==1) { |
MrSteel | 0:dd55179403eb | 74 | unsigned char tmpStr[] = {pSTX, sys.last_ppe_id[1], 0, SOURCE_ID, 0, 2, 0, 1, pBEL, pETX}; |
MrSteel | 0:dd55179403eb | 75 | //lora_mutex.lock(); |
MrSteel | 0:dd55179403eb | 76 | printStr(LORA_TARGET,tmpStr,sizeof(tmpStr)); |
MrSteel | 0:dd55179403eb | 77 | //lora_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 78 | sys.last_ppe_id[1] = sys.last_ppe_id[1] + 1; |
MrSteel | 0:dd55179403eb | 79 | txLoraTmr.reset(); |
MrSteel | 0:dd55179403eb | 80 | step++; |
MrSteel | 0:dd55179403eb | 81 | TX_LED = SetLed; |
MrSteel | 0:dd55179403eb | 82 | } |
MrSteel | 0:dd55179403eb | 83 | if(txLoraTmr.read_ms()>=500 && step==2) { |
MrSteel | 0:dd55179403eb | 84 | unsigned char tmpStr[] = {pSTX, sys.last_ppe_id[2], 0, SOURCE_ID, 0, 3, 0, 1, pBEL, pETX}; |
MrSteel | 0:dd55179403eb | 85 | //lora_mutex.lock(); |
MrSteel | 0:dd55179403eb | 86 | printStr(LORA_TARGET,tmpStr,sizeof(tmpStr)); |
MrSteel | 0:dd55179403eb | 87 | //lora_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 88 | sys.last_ppe_id[2] = sys.last_ppe_id[2] + 1; |
MrSteel | 0:dd55179403eb | 89 | txLoraTmr.reset(); |
MrSteel | 0:dd55179403eb | 90 | step=0; |
MrSteel | 0:dd55179403eb | 91 | TX_LED = SetLed; |
MrSteel | 0:dd55179403eb | 92 | } |
MrSteel | 0:dd55179403eb | 93 | if(Lora.service() == SERVICE_READ_FIFO) { |
MrSteel | 0:dd55179403eb | 94 | unsigned int pyloadSize = kom.read_reg(REG_LR_RXNBBYTES); |
MrSteel | 0:dd55179403eb | 95 | float rssi = Lora.get_pkt_rssi(); |
MrSteel | 0:dd55179403eb | 96 | unsigned int i; |
MrSteel | 0:dd55179403eb | 97 | for(i=0;i<pyloadSize;i++){ |
MrSteel | 0:dd55179403eb | 98 | loraBuffer.buf[i] = kom.rx_buf[i]; |
MrSteel | 0:dd55179403eb | 99 | loraBuffer.lenght = loraBuffer.lenght++; |
MrSteel | 0:dd55179403eb | 100 | } |
MrSteel | 0:dd55179403eb | 101 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 102 | pc.printf("[%d,%2.1f]",loraBuffer.buf[3],rssi); |
MrSteel | 0:dd55179403eb | 103 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 104 | } |
MrSteel | 0:dd55179403eb | 105 | |
MrSteel | 0:dd55179403eb | 106 | } |
MrSteel | 0:dd55179403eb | 107 | } |
MrSteel | 0:dd55179403eb | 108 | |
MrSteel | 0:dd55179403eb | 109 | void fiberOptic_thread(void const *argument){ |
MrSteel | 0:dd55179403eb | 110 | OperationMode.mode(PullUp); |
MrSteel | 0:dd55179403eb | 111 | fiberOpticBuffer.buf = (unsigned char *)malloc(sizeof(char)*FIBER_OPTIC_RX_BUFFER); |
MrSteel | 0:dd55179403eb | 112 | fiberOptic.baud(FIBER_OPTIC_BAUD); |
MrSteel | 0:dd55179403eb | 113 | fiberOptic.attach(&fiberOptic_handle); |
MrSteel | 0:dd55179403eb | 114 | if(!OperationMode.read()) { |
MrSteel | 0:dd55179403eb | 115 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 116 | pc.printf("\n#: Fiber Optic thread started with BAUD(%d)",FIBER_OPTIC_BAUD); |
MrSteel | 0:dd55179403eb | 117 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 118 | //FIBER_OPTIC_TX = 1; |
MrSteel | 0:dd55179403eb | 119 | sys.fiberOpticEnable = true; |
MrSteel | 0:dd55179403eb | 120 | FIBER_OPTIC_TX_PWR = 0; |
MrSteel | 0:dd55179403eb | 121 | FIBER_OPTIC_RX_PWR = 0; |
MrSteel | 0:dd55179403eb | 122 | |
MrSteel | 0:dd55179403eb | 123 | txFiberOpticTmr.start(); |
MrSteel | 0:dd55179403eb | 124 | |
MrSteel | 0:dd55179403eb | 125 | while(true) { |
MrSteel | 0:dd55179403eb | 126 | // PING rutine |
MrSteel | 0:dd55179403eb | 127 | if(txFiberOpticTmr.read()>FIBER_OPTIC_INTERVAL) { |
MrSteel | 0:dd55179403eb | 128 | if(sys.last_ppe_id_fo==0) |
MrSteel | 0:dd55179403eb | 129 | sys.last_ppe_id_fo = 1; |
MrSteel | 0:dd55179403eb | 130 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 131 | pc.printf("\n>: PPE_ID_FO: %d, NODE: 1", sys.last_ppe_id_fo); |
MrSteel | 0:dd55179403eb | 132 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 133 | fiberOptic_mutex.lock(); |
MrSteel | 0:dd55179403eb | 134 | fiberOptic.printf("%c%c%c%c%c%c%c%c%c%c",pSTX,sys.last_ppe_id_fo,0,SOURCE_ID,0,1,0,1,pACK,pETX); |
MrSteel | 0:dd55179403eb | 135 | fiberOptic_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 136 | sys.last_ppe_id_fo = sys.last_ppe_id_fo + 1; |
MrSteel | 0:dd55179403eb | 137 | txFiberOpticTmr.reset(); |
MrSteel | 0:dd55179403eb | 138 | } |
MrSteel | 0:dd55179403eb | 139 | if(fiberOpticBuffer.flg) { |
MrSteel | 0:dd55179403eb | 140 | if(fiberOpticBuffer.lenght >= 5){ |
MrSteel | 0:dd55179403eb | 141 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 142 | pc.printf("\n>: Received shitty payload"); |
MrSteel | 0:dd55179403eb | 143 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 144 | fiberOpticBuffer.flg = false; |
MrSteel | 0:dd55179403eb | 145 | fiberOpticBuffer.lenght = false; |
MrSteel | 0:dd55179403eb | 146 | } |
MrSteel | 0:dd55179403eb | 147 | if(fiberOpticBuffer.buf[0]==pSTX && fiberOpticBuffer.buf[fiberOpticBuffer.lenght-1]==pETX ) { |
MrSteel | 0:dd55179403eb | 148 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 149 | pc.printf("\n>: Received shitty payload"); |
MrSteel | 0:dd55179403eb | 150 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 151 | fiberOpticBuffer.flg = false; |
MrSteel | 0:dd55179403eb | 152 | fiberOpticBuffer.lenght = false; |
MrSteel | 0:dd55179403eb | 153 | } |
MrSteel | 0:dd55179403eb | 154 | |
MrSteel | 0:dd55179403eb | 155 | } |
MrSteel | 0:dd55179403eb | 156 | } |
MrSteel | 0:dd55179403eb | 157 | } |
MrSteel | 0:dd55179403eb | 158 | else { |
MrSteel | 0:dd55179403eb | 159 | sys.fiberOpticEnable = false; |
MrSteel | 0:dd55179403eb | 160 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 161 | pc.printf("\n#: Fiber Optic thread disabled!\n"); |
MrSteel | 0:dd55179403eb | 162 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 163 | //FIBER_OPTIC_TX = 0; |
MrSteel | 0:dd55179403eb | 164 | FIBER_OPTIC_TX_PWR = 1; |
MrSteel | 0:dd55179403eb | 165 | FIBER_OPTIC_RX_PWR = 1; |
MrSteel | 0:dd55179403eb | 166 | } |
MrSteel | 0:dd55179403eb | 167 | } |
MrSteel | 0:dd55179403eb | 168 | |
MrSteel | 0:dd55179403eb | 169 | void pc_handle(void) { |
MrSteel | 0:dd55179403eb | 170 | //LEDG = SetLed; |
MrSteel | 0:dd55179403eb | 171 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 172 | unsigned char c = pc.getc(); |
MrSteel | 0:dd55179403eb | 173 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 174 | sys.RXCharCounter[pc_com] = sys.RXCharCounter[pc_com]+1; |
MrSteel | 0:dd55179403eb | 175 | if(pcBuffer.lenght < PC_RX_BUFFER) { |
MrSteel | 0:dd55179403eb | 176 | pcBuffer.buf[pcBuffer.lenght] = c; |
MrSteel | 0:dd55179403eb | 177 | pcBuffer.lenght = pcBuffer.lenght + 1; |
MrSteel | 0:dd55179403eb | 178 | pcBuffer.flg = true; |
MrSteel | 0:dd55179403eb | 179 | } |
MrSteel | 0:dd55179403eb | 180 | } |
MrSteel | 0:dd55179403eb | 181 | |
MrSteel | 0:dd55179403eb | 182 | void fiberOptic_handle(void) { |
MrSteel | 0:dd55179403eb | 183 | //LEDB = SetLed; |
MrSteel | 0:dd55179403eb | 184 | fiberOptic_mutex.lock(); |
MrSteel | 0:dd55179403eb | 185 | unsigned char c = fiberOptic.getc(); |
MrSteel | 0:dd55179403eb | 186 | fiberOptic_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 187 | |
MrSteel | 0:dd55179403eb | 188 | if(fiberOpticBuffer.lenght < FIBER_OPTIC_RX_BUFFER) { |
MrSteel | 0:dd55179403eb | 189 | fiberOpticBuffer.buf[fiberOpticBuffer.lenght] = c; |
MrSteel | 0:dd55179403eb | 190 | fiberOpticBuffer.lenght = fiberOpticBuffer.lenght + 1; |
MrSteel | 0:dd55179403eb | 191 | fiberOpticBuffer.flg = true; |
MrSteel | 0:dd55179403eb | 192 | } |
MrSteel | 0:dd55179403eb | 193 | } |
MrSteel | 0:dd55179403eb | 194 | |
MrSteel | 0:dd55179403eb | 195 | void printBuffer(uartBufferStructure buffer) { |
MrSteel | 0:dd55179403eb | 196 | if(buffer.flg) { |
MrSteel | 0:dd55179403eb | 197 | unsigned int i; |
MrSteel | 0:dd55179403eb | 198 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 199 | pc.printf("\n<: "); |
MrSteel | 0:dd55179403eb | 200 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 201 | for(i=0;i<buffer.lenght-1;i++){ |
MrSteel | 0:dd55179403eb | 202 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 203 | pc.printf("%02x ",buffer.buf[i]); |
MrSteel | 0:dd55179403eb | 204 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 205 | } |
MrSteel | 0:dd55179403eb | 206 | } |
MrSteel | 0:dd55179403eb | 207 | |
MrSteel | 0:dd55179403eb | 208 | } |
MrSteel | 0:dd55179403eb | 209 | |
MrSteel | 0:dd55179403eb | 210 | |
MrSteel | 0:dd55179403eb | 211 | |
MrSteel | 0:dd55179403eb | 212 | void lora_rx_thread(void const *argument) { |
MrSteel | 0:dd55179403eb | 213 | /* |
MrSteel | 0:dd55179403eb | 214 | unsigned int i; |
MrSteel | 0:dd55179403eb | 215 | while(true) { |
MrSteel | 0:dd55179403eb | 216 | lora_mutex.lock(); |
MrSteel | 0:dd55179403eb | 217 | if(Lora.service() == SERVICE_READ_FIFO) { |
MrSteel | 0:dd55179403eb | 218 | lora_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 219 | |
MrSteel | 0:dd55179403eb | 220 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 221 | pc.printf("."); |
MrSteel | 0:dd55179403eb | 222 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 223 | unsigned int pyloadSize = kom.read_reg(REG_LR_RXNBBYTES); |
MrSteel | 0:dd55179403eb | 224 | float rssi = Lora.get_pkt_rssi(); |
MrSteel | 0:dd55179403eb | 225 | |
MrSteel | 0:dd55179403eb | 226 | while(Lora.service() == SERVICE_READ_FIFO) { |
MrSteel | 0:dd55179403eb | 227 | loraBuffer.buf[i] = kom.rx_buf[i]; |
MrSteel | 0:dd55179403eb | 228 | loraBuffer.lenght = loraBuffer.lenght++; |
MrSteel | 0:dd55179403eb | 229 | } |
MrSteel | 0:dd55179403eb | 230 | |
MrSteel | 0:dd55179403eb | 231 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 232 | pc.printf("."); |
MrSteel | 0:dd55179403eb | 233 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 234 | while(Lora.service() == SERVICE_READ_FIFO) { |
MrSteel | 0:dd55179403eb | 235 | loraBuffer.buf[i] = kom.rx_buf[i]; |
MrSteel | 0:dd55179403eb | 236 | loraBuffer.lenght = loraBuffer.lenght++; |
MrSteel | 0:dd55179403eb | 237 | pc_mutex.lock(); |
MrSteel | 0:dd55179403eb | 238 | pc.printf("Tukaj"); |
MrSteel | 0:dd55179403eb | 239 | pc_mutex.unlock(); |
MrSteel | 0:dd55179403eb | 240 | // } |
MrSteel | 0:dd55179403eb | 241 | } |
MrSteel | 0:dd55179403eb | 242 | } |
MrSteel | 0:dd55179403eb | 243 | */ |
MrSteel | 0:dd55179403eb | 244 | } |