JongYong Park / Mbed 2 deprecated NUCLEO-F767_LIFI_4CH_os2_v2

Dependencies:   mbed

Committer:
JongYongPark
Date:
Tue Apr 09 10:21:34 2019 +0000
Revision:
22:1b6e6d26273e
Parent:
21:82b5759f5047
Child:
23:45461af5efc5
111

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JongYongPark 0:488aa8153e15 1 #include "app.h"
JongYongPark 0:488aa8153e15 2 //#include "../arduino.h"
JongYongPark 0:488aa8153e15 3 //#include "mbed.h"
JongYongPark 0:488aa8153e15 4 //#include <string>
JongYongPark 0:488aa8153e15 5
JongYongPark 0:488aa8153e15 6 #include "lifiTranceiver.h"
JongYongPark 0:488aa8153e15 7 #include "lifiTranceiverLocal.h"
JongYongPark 0:488aa8153e15 8
JongYongPark 0:488aa8153e15 9 //#define USE_SLOW_TXRX_DEMO
JongYongPark 0:488aa8153e15 10 //#define USE_SERIAL_COMMAND
JongYongPark 0:488aa8153e15 11
JongYongPark 0:488aa8153e15 12 //// OLED를 활성화 시키면 FreeRTOS가 정상 동작 안한다. 이문제는 다음에 해결하기로 하자.
JongYongPark 0:488aa8153e15 13 //// 한글 입력이 잘 되네.
JongYongPark 0:488aa8153e15 14
JongYongPark 0:488aa8153e15 15 // TODO 1 : ADCREF 3.3 Volt - Done
JongYongPark 0:488aa8153e15 16 // TODO 2 : Check Max/Max ADC
JongYongPark 0:488aa8153e15 17 ///////////////////////////////////////////////////////
JongYongPark 0:488aa8153e15 18 ///////// HEADER //////////////////////////////////////
JongYongPark 0:488aa8153e15 19
JongYongPark 0:488aa8153e15 20 enum op_mode {
JongYongPark 21:82b5759f5047 21 OP_HF, OP_LF, OP_PLOT_ADC, OP_RESERVED
JongYongPark 0:488aa8153e15 22 };
JongYongPark 0:488aa8153e15 23
JongYongPark 0:488aa8153e15 24 enum receiver_state {
JongYongPark 21:82b5759f5047 25 IDLE_STATE = 0, //waiting for sync
JongYongPark 21:82b5759f5047 26 SYNC_STATE, //synced, waiting for STX
JongYongPark 21:82b5759f5047 27 START_STATE, //STX received
JongYongPark 21:82b5759f5047 28 LENGTH_LSB_STATE,
JongYongPark 21:82b5759f5047 29 LENGTH_MSB_STATE,
JongYongPark 21:82b5759f5047 30 DATA_STATE, //receiving DATA
JongYongPark 21:82b5759f5047 31 END_STATE
JongYongPark 0:488aa8153e15 32 };
JongYongPark 0:488aa8153e15 33
JongYongPark 0:488aa8153e15 34 ///////////////////////////////////////////////////////
JongYongPark 0:488aa8153e15 35 //////////// GLOBAL VARIABLES //////////////////////
JongYongPark 21:82b5759f5047 36 int waiting_count_for_all_channel_finished =0 ;
JongYongPark 0:488aa8153e15 37 unsigned char incomingByte;
JongYongPark 0:488aa8153e15 38 int lines = 0;
JongYongPark 0:488aa8153e15 39 int chars = 0;
JongYongPark 0:488aa8153e15 40
JongYongPark 0:488aa8153e15 41 ////////////
JongYongPark 0:488aa8153e15 42
JongYongPark 0:488aa8153e15 43 //manechester decoder state variable
JongYongPark 0:488aa8153e15 44 //long shift_reg = 0;
JongYongPark 0:488aa8153e15 45 //
JongYongPark 0:488aa8153e15 46 //int oldValue = 0 ;
JongYongPark 0:488aa8153e15 47 //int steady_count = 0 ;
JongYongPark 0:488aa8153e15 48 //int dist_last_sync = 0 ;
JongYongPark 0:488aa8153e15 49 //unsigned int detected_word = 0;
JongYongPark 0:488aa8153e15 50 //int new_word = 0;
JongYongPark 0:488aa8153e15 51 //int old_edge_val = 0 ;
JongYongPark 0:488aa8153e15 52 //int probe_adc_high = 0;
JongYongPark 0:488aa8153e15 53 //int probe_adc_low = 0;
JongYongPark 0:488aa8153e15 54 //int probe_adc_gap = 0;
JongYongPark 0:488aa8153e15 55
JongYongPark 0:488aa8153e15 56 struct RX_VARS {
JongYongPark 21:82b5759f5047 57 int sensorValue;
JongYongPark 21:82b5759f5047 58 int oldValue;
JongYongPark 21:82b5759f5047 59 int edge_val;
JongYongPark 21:82b5759f5047 60 int steady_count;
JongYongPark 21:82b5759f5047 61 int dist_last_sync;
JongYongPark 21:82b5759f5047 62 unsigned int detected_word;
JongYongPark 21:82b5759f5047 63 int new_word;
JongYongPark 21:82b5759f5047 64 long shift_reg;
JongYongPark 21:82b5759f5047 65 int old_edge_val;
JongYongPark 21:82b5759f5047 66 int probe_adc_high;
JongYongPark 21:82b5759f5047 67 int probe_adc_low;
JongYongPark 21:82b5759f5047 68 int probe_adc_gap;
JongYongPark 21:82b5759f5047 69 enum receiver_state frame_state;
JongYongPark 21:82b5759f5047 70 uint8_t rx_frame_buffer[FRAME_BUFFER_SIZE];
JongYongPark 21:82b5759f5047 71 //////////// keep received message
JongYongPark 21:82b5759f5047 72 bool is_valid;
JongYongPark 21:82b5759f5047 73 bool is_received;
JongYongPark 21:82b5759f5047 74 uint8_t rx_frame_buffer_save[FRAME_BUFFER_SIZE];
JongYongPark 21:82b5759f5047 75 int probe_adc_high_received;
JongYongPark 21:82b5759f5047 76 int probe_adc_low_received;
JongYongPark 21:82b5759f5047 77 int probe_adc_gap_received;
JongYongPark 21:82b5759f5047 78 ///////////
JongYongPark 21:82b5759f5047 79 // no auxiliary security header
JongYongPark 21:82b5759f5047 80 int rx_frame_index;
JongYongPark 21:82b5759f5047 81 int rx_frame_size;
JongYongPark 21:82b5759f5047 82 uint16_t pdu_length;
JongYongPark 21:82b5759f5047 83 uint16_t pdu_length_count;
JongYongPark 21:82b5759f5047 84 uint16_t pdu_length_save;
JongYongPark 21:82b5759f5047 85 uint16_t pdu_length_count_save;
JongYongPark 21:82b5759f5047 86 uint16_t frame_length;
JongYongPark 21:82b5759f5047 87 uint16_t frame_length_save;
JongYongPark 14:07669aafe0e4 88 };
JongYongPark 14:07669aafe0e4 89 // __attribute__((packed));
JongYongPark 0:488aa8153e15 90
JongYongPark 22:1b6e6d26273e 91 struct RX_VARS_RECEIVED {
JongYongPark 22:1b6e6d26273e 92 int probe_adc_high;
JongYongPark 22:1b6e6d26273e 93 int probe_adc_low;
JongYongPark 22:1b6e6d26273e 94 int probe_adc_gap;
JongYongPark 22:1b6e6d26273e 95 uint8_t rx_frame_buffer[FRAME_BUFFER_SIZE];
JongYongPark 22:1b6e6d26273e 96 //////////// keep received message
JongYongPark 22:1b6e6d26273e 97 bool is_valid;
JongYongPark 22:1b6e6d26273e 98 bool is_received;
JongYongPark 22:1b6e6d26273e 99 ///////////
JongYongPark 22:1b6e6d26273e 100 int rx_frame_size;
JongYongPark 22:1b6e6d26273e 101 uint16_t pdu_length;
JongYongPark 22:1b6e6d26273e 102 uint16_t pdu_length_count;
JongYongPark 22:1b6e6d26273e 103 uint16_t frame_length;
JongYongPark 22:1b6e6d26273e 104 };
JongYongPark 22:1b6e6d26273e 105
JongYongPark 14:07669aafe0e4 106 static RX_VARS rx_vars[LIFI_MIMO_CHANNEL_NUM];
JongYongPark 22:1b6e6d26273e 107 static RX_VARS_RECEIVED rx_vars_received[LIFI_MIMO_CHANNEL_NUM];
JongYongPark 22:1b6e6d26273e 108
JongYongPark 22:1b6e6d26273e 109 void LifiRx_CopyAdcInfo_FromReceivedFrame(int channel, int high, int low)
JongYongPark 22:1b6e6d26273e 110 {
JongYongPark 22:1b6e6d26273e 111 rx_vars_received[channel].probe_adc_high = high ;
JongYongPark 22:1b6e6d26273e 112 rx_vars_received[channel].probe_adc_low = low ;
JongYongPark 22:1b6e6d26273e 113 rx_vars_received[channel].probe_adc_gap = high - low ;
JongYongPark 22:1b6e6d26273e 114 }
JongYongPark 22:1b6e6d26273e 115
JongYongPark 22:1b6e6d26273e 116 void LifiRx_CopyData_FromReceivedFrame(int channel)
JongYongPark 22:1b6e6d26273e 117 {
JongYongPark 22:1b6e6d26273e 118 rx_vars_received[channel].is_received = rx_vars[channel].is_received ;
JongYongPark 22:1b6e6d26273e 119 rx_vars_received[channel].is_valid = rx_vars[channel].is_valid ;
JongYongPark 22:1b6e6d26273e 120
JongYongPark 22:1b6e6d26273e 121 rx_vars_received[channel].rx_frame_size = rx_vars[channel].rx_frame_size ;
JongYongPark 22:1b6e6d26273e 122 rx_vars_received[channel].pdu_length = rx_vars[channel].pdu_length ;
JongYongPark 22:1b6e6d26273e 123 rx_vars_received[channel].pdu_length_count = rx_vars[channel].pdu_length_count ;
JongYongPark 22:1b6e6d26273e 124 rx_vars_received[channel].frame_length = rx_vars[channel].frame_length ;
JongYongPark 22:1b6e6d26273e 125
JongYongPark 22:1b6e6d26273e 126 memcpy( rx_vars_received[channel].rx_frame_buffer, rx_vars[channel].rx_frame_buffer, FRAME_BUFFER_SIZE) ;
JongYongPark 22:1b6e6d26273e 127 }
JongYongPark 22:1b6e6d26273e 128
JongYongPark 22:1b6e6d26273e 129 void LifiRx_CopyAll_FromReceivedFrame(int channel)
JongYongPark 22:1b6e6d26273e 130 {
JongYongPark 22:1b6e6d26273e 131 LifiRx_CopyAdcInfo_FromReceivedFrame(channel, rx_vars[channel].probe_adc_high, rx_vars[channel].probe_adc_low );
JongYongPark 22:1b6e6d26273e 132 LifiRx_CopyData_FromReceivedFrame(channel);
JongYongPark 22:1b6e6d26273e 133 }
JongYongPark 0:488aa8153e15 134
JongYongPark 21:82b5759f5047 135 void print_frame_data(uint8_t* frame, int length)
JongYongPark 21:82b5759f5047 136 {
JongYongPark 21:82b5759f5047 137 printf(" frame (%d) = ",length);
JongYongPark 21:82b5759f5047 138 for(int i=0; i < length; i++) {
JongYongPark 21:82b5759f5047 139 // https://simple.wikipedia.org/wiki/ASCII
JongYongPark 21:82b5759f5047 140 if(frame[i] >= 0x20 && frame[i] <= 0x7E ) {
JongYongPark 21:82b5759f5047 141 //printf("[%d]%c_%02x ",i,frame[i],frame[i]);
JongYongPark 21:82b5759f5047 142 printf("%c",frame[i]);
JongYongPark 21:82b5759f5047 143 } else {
JongYongPark 21:82b5759f5047 144 //printf("[%d]_%02x ",i,frame[i]);
JongYongPark 21:82b5759f5047 145 printf(" x%02x ",frame[i]);
JongYongPark 21:82b5759f5047 146 }
JongYongPark 21:82b5759f5047 147 }
JongYongPark 21:82b5759f5047 148 }
JongYongPark 0:488aa8153e15 149
JongYongPark 21:82b5759f5047 150 void print_pdu_data(uint8_t* frame, int length)
JongYongPark 21:82b5759f5047 151 {
JongYongPark 21:82b5759f5047 152 printf(" pdu (%d) = ",length);
JongYongPark 21:82b5759f5047 153 for(int i=0; i < length; i++) {
JongYongPark 21:82b5759f5047 154 // https://simple.wikipedia.org/wiki/ASCII
JongYongPark 21:82b5759f5047 155 if(frame[i] >= 0x20 && frame[i] <= 0x7E ) {
JongYongPark 21:82b5759f5047 156 printf("%c",frame[i]);
JongYongPark 21:82b5759f5047 157 } else {
JongYongPark 21:82b5759f5047 158 printf(" ",frame[i]);
JongYongPark 21:82b5759f5047 159 }
JongYongPark 21:82b5759f5047 160 }
JongYongPark 21:82b5759f5047 161 }
JongYongPark 21:82b5759f5047 162
JongYongPark 21:82b5759f5047 163 inline int is_a_word_4ch(int channel, long * manchester_word,
JongYongPark 21:82b5759f5047 164 int time_from_last_sync, unsigned int * detected_word)
JongYongPark 21:82b5759f5047 165 {
JongYongPark 21:82b5759f5047 166 #if RX_DEBUG_BIN
JongYongPark 21:82b5759f5047 167 printf("\t %d[%4x] ",channel+1, *detected_word );
JongYongPark 21:82b5759f5047 168 #endif
JongYongPark 21:82b5759f5047 169 if (time_from_last_sync >= 20
JongYongPark 21:82b5759f5047 170 || rx_vars[channel].frame_state == IDLE_STATE) { // we received enough bits to test the sync
JongYongPark 21:82b5759f5047 171 if (((*manchester_word) & START_STOP_MASK) == (START_STOP_MASK)) { // testing first position
JongYongPark 21:82b5759f5047 172 (*detected_word) = ((*manchester_word) >> 2) & 0xFFFF;
JongYongPark 21:82b5759f5047 173
JongYongPark 21:82b5759f5047 174 if (rx_vars[channel].frame_state == IDLE_STATE) {
JongYongPark 21:82b5759f5047 175 if ((*detected_word) == SYNC_SYMBOL_MANCHESTER) {
JongYongPark 21:82b5759f5047 176 return 2;
JongYongPark 21:82b5759f5047 177 }
JongYongPark 21:82b5759f5047 178 }
JongYongPark 21:82b5759f5047 179 return 1;
JongYongPark 21:82b5759f5047 180 // byte with correct framing
JongYongPark 21:82b5759f5047 181 } else if (rx_vars[channel].frame_state != IDLE_STATE
JongYongPark 21:82b5759f5047 182 && time_from_last_sync == 20) {
JongYongPark 21:82b5759f5047 183 (*detected_word) = ((*manchester_word) >> 2) & 0xFFFF;
JongYongPark 21:82b5759f5047 184 return 1;
JongYongPark 21:82b5759f5047 185 }
JongYongPark 21:82b5759f5047 186 }
JongYongPark 21:82b5759f5047 187 return 0;
JongYongPark 0:488aa8153e15 188 }
JongYongPark 0:488aa8153e15 189
JongYongPark 14:07669aafe0e4 190 inline int insert_edge_4ch(int channel, long * manchester_word, int edge,
JongYongPark 21:82b5759f5047 191 int edge_period, int * time_from_last_sync,
JongYongPark 21:82b5759f5047 192 unsigned int * detected_word)
JongYongPark 21:82b5759f5047 193 {
JongYongPark 21:82b5759f5047 194 int new_word = 0;
JongYongPark 21:82b5759f5047 195 int is_a_word_value = 0;
JongYongPark 21:82b5759f5047 196 int sync_word_detect = 0;
JongYongPark 21:82b5759f5047 197 if (((*manchester_word) & 0x01) != edge) { //mak sure we don't have same edge ...
JongYongPark 21:82b5759f5047 198 if (edge_period > (LIFI_RX_SAMPLE_PER_SYMBOL + 1)) {
JongYongPark 21:82b5759f5047 199 unsigned char last_bit = (*manchester_word) & 0x01;
JongYongPark 21:82b5759f5047 200 (*manchester_word) = ((*manchester_word) << 1) | last_bit; // signal was steady for longer than a single symbol,
JongYongPark 21:82b5759f5047 201 (*time_from_last_sync) += 1;
JongYongPark 21:82b5759f5047 202 is_a_word_value = is_a_word_4ch(channel, manchester_word,
JongYongPark 21:82b5759f5047 203 (*time_from_last_sync), detected_word);
JongYongPark 21:82b5759f5047 204 if (is_a_word_value > 0) { //found start stop framing
JongYongPark 21:82b5759f5047 205 new_word = 1;
JongYongPark 21:82b5759f5047 206 (*time_from_last_sync) = 0;
JongYongPark 21:82b5759f5047 207 if (is_a_word_value > 1) {
JongYongPark 21:82b5759f5047 208 sync_word_detect = 1; //we detected framing and sync word in manchester format
JongYongPark 0:488aa8153e15 209 #if RX_DEBUG_BIN
JongYongPark 21:82b5759f5047 210 printf("\n%dS",channel+1);
JongYongPark 0:488aa8153e15 211 #endif
JongYongPark 21:82b5759f5047 212 }
JongYongPark 21:82b5759f5047 213 }
JongYongPark 21:82b5759f5047 214 }
JongYongPark 21:82b5759f5047 215 /////////////////////////////
JongYongPark 21:82b5759f5047 216 //storing edge value in word
JongYongPark 21:82b5759f5047 217 if (edge < 0) {
JongYongPark 21:82b5759f5047 218 (*manchester_word) = ((*manchester_word) << 1) | 0x00; // signal goes down
JongYongPark 0:488aa8153e15 219 #if RX_DEBUG_BIN
JongYongPark 21:82b5759f5047 220 printf("%d[0]",channel+1);
JongYongPark 0:488aa8153e15 221 #endif
JongYongPark 21:82b5759f5047 222 } else {
JongYongPark 21:82b5759f5047 223 (*manchester_word) = ((*manchester_word) << 1) | 0x01; // signal goes up
JongYongPark 0:488aa8153e15 224 #if RX_DEBUG_BIN
JongYongPark 21:82b5759f5047 225 printf("%d[1]",channel+1);
JongYongPark 0:488aa8153e15 226 #endif
JongYongPark 21:82b5759f5047 227 }
JongYongPark 21:82b5759f5047 228 /////////////////////////////////////
JongYongPark 21:82b5759f5047 229 (*time_from_last_sync) += 1;
JongYongPark 21:82b5759f5047 230 is_a_word_value = is_a_word_4ch(channel, manchester_word,
JongYongPark 21:82b5759f5047 231 (*time_from_last_sync), detected_word);
JongYongPark 21:82b5759f5047 232 if (sync_word_detect == 0 && is_a_word_value > 0) { //if sync word was detected at previous position, don't take word detection into account
JongYongPark 21:82b5759f5047 233 new_word = 1;
JongYongPark 21:82b5759f5047 234 (*time_from_last_sync) = 0;
JongYongPark 0:488aa8153e15 235 #if RX_DEBUG_BIN
JongYongPark 21:82b5759f5047 236 printf("%dD",channel+1);
JongYongPark 0:488aa8153e15 237 #endif
JongYongPark 21:82b5759f5047 238 }
JongYongPark 21:82b5759f5047 239 } else {
JongYongPark 21:82b5759f5047 240 new_word = -1;
JongYongPark 0:488aa8153e15 241 #if RX_DEBUG_BIN
JongYongPark 21:82b5759f5047 242 printf("%d_",channel+1);
JongYongPark 0:488aa8153e15 243 #endif
JongYongPark 21:82b5759f5047 244 }
JongYongPark 21:82b5759f5047 245 return new_word;
JongYongPark 0:488aa8153e15 246 }
JongYongPark 0:488aa8153e15 247
JongYongPark 21:82b5759f5047 248 void sample_signal_edge_4ch(int channel, int sensorValue)
JongYongPark 21:82b5759f5047 249 {
JongYongPark 21:82b5759f5047 250 rx_vars[channel].sensorValue = sensorValue;
JongYongPark 21:82b5759f5047 251 //int sensorValue = analogRead(SENSOR_PIN_PORT); // this is too slow and should be replaced with interrupt-driven ADC
JongYongPark 21:82b5759f5047 252 //t sensorValue = LifiRx_AdcRead(0); // read result of previously triggered conversion
JongYongPark 21:82b5759f5047 253 //ADC_start_conversion(SENSOR_PIN); // start a conversion for next loop
JongYongPark 0:488aa8153e15 254
JongYongPark 0:488aa8153e15 255 #if RX_DEBUG_ANALOG_SENSOR_VALUE
JongYongPark 21:82b5759f5047 256 printf(" adc:%d ",rx_vars[channel].sensorValue);
JongYongPark 0:488aa8153e15 257 #endif
JongYongPark 21:82b5759f5047 258 if ((rx_vars[channel].sensorValue - rx_vars[channel].oldValue)
JongYongPark 21:82b5759f5047 259 > LIFI_RX_EDGE_THRESHOLD) {
JongYongPark 21:82b5759f5047 260 rx_vars[channel].edge_val = 1;
JongYongPark 22:1b6e6d26273e 261
JongYongPark 21:82b5759f5047 262 #if CHECK_EDGE_WITH_DEBUG_LED
JongYongPark 22:1b6e6d26273e 263 if( int LifiRx_GetDebugLed() == 0 ) printf("\n Edge Detect Fail (Up / 0) !!!");
JongYongPark 21:82b5759f5047 264 #endif
JongYongPark 22:1b6e6d26273e 265
JongYongPark 0:488aa8153e15 266 #if RX_DEBUG_EDGE
JongYongPark 21:82b5759f5047 267 printf("%d/ %d-%d",channel+1,rx_vars[channel].sensorValue,rx_vars[channel].oldValue);
JongYongPark 0:488aa8153e15 268 #endif
JongYongPark 21:82b5759f5047 269 if (rx_vars[channel].probe_adc_high < rx_vars[channel].sensorValue)
JongYongPark 21:82b5759f5047 270 rx_vars[channel].probe_adc_high = rx_vars[channel].sensorValue;
JongYongPark 21:82b5759f5047 271 } else if ((rx_vars[channel].oldValue - rx_vars[channel].sensorValue)
JongYongPark 21:82b5759f5047 272 > LIFI_RX_EDGE_THRESHOLD) {
JongYongPark 21:82b5759f5047 273 rx_vars[channel].edge_val = -1;
JongYongPark 22:1b6e6d26273e 274
JongYongPark 21:82b5759f5047 275 #if CHECK_EDGE_WITH_DEBUG_LED
JongYongPark 22:1b6e6d26273e 276 if( int LifiRx_GetDebugLed() == 1 ) printf("\n Edge Detect Fail (Down / 1) !!!");
JongYongPark 22:1b6e6d26273e 277 #endif
JongYongPark 22:1b6e6d26273e 278
JongYongPark 14:07669aafe0e4 279 #if RX_DEBUG_EDGE
JongYongPark 21:82b5759f5047 280 printf("%d| %d-%d",channel+1,rx_vars[channel].oldValue,rx_vars[channel].sensorValue);
JongYongPark 14:07669aafe0e4 281 #endif
JongYongPark 21:82b5759f5047 282 if (rx_vars[channel].probe_adc_low > rx_vars[channel].sensorValue)
JongYongPark 21:82b5759f5047 283 rx_vars[channel].probe_adc_low = rx_vars[channel].sensorValue;
JongYongPark 21:82b5759f5047 284 } else {
JongYongPark 21:82b5759f5047 285 #if RX_DEBUG_EDGE
JongYongPark 21:82b5759f5047 286 printf("%d=",channel+1);
JongYongPark 21:82b5759f5047 287 #endif
JongYongPark 21:82b5759f5047 288 rx_vars[channel].edge_val = 0;
JongYongPark 21:82b5759f5047 289 }
JongYongPark 0:488aa8153e15 290
JongYongPark 21:82b5759f5047 291 /////////////
JongYongPark 21:82b5759f5047 292 rx_vars[channel].oldValue = rx_vars[channel].sensorValue;
JongYongPark 21:82b5759f5047 293 if (rx_vars[channel].edge_val == 0
JongYongPark 21:82b5759f5047 294 || rx_vars[channel].edge_val == rx_vars[channel].old_edge_val
JongYongPark 21:82b5759f5047 295 || (rx_vars[channel].edge_val != rx_vars[channel].old_edge_val
JongYongPark 21:82b5759f5047 296 && rx_vars[channel].steady_count < 2)) {
JongYongPark 21:82b5759f5047 297 if (rx_vars[channel].steady_count < (4 * LIFI_RX_SAMPLE_PER_SYMBOL)) {
JongYongPark 0:488aa8153e15 298 #if RX_DEBUG_EDGE
JongYongPark 21:82b5759f5047 299 printf("%d+",channel+1);
JongYongPark 0:488aa8153e15 300 #endif
JongYongPark 21:82b5759f5047 301 rx_vars[channel].steady_count++;
JongYongPark 21:82b5759f5047 302 }
JongYongPark 21:82b5759f5047 303 } else {
JongYongPark 0:488aa8153e15 304
JongYongPark 0:488aa8153e15 305 #if RX_DEBUG_EDGE
JongYongPark 21:82b5759f5047 306 if(rx_vars[channel].edge_val == 1) printf("%dH",channel+1);
JongYongPark 21:82b5759f5047 307 else if(rx_vars[channel].edge_val == -1) printf("%dL",channel+1);
JongYongPark 0:488aa8153e15 308 #endif
JongYongPark 21:82b5759f5047 309 //inline int insert_edge_4ch(int channel, long * manchester_word, int edge, int edge_period, int * time_from_last_sync, unsigned int * detected_word)
JongYongPark 21:82b5759f5047 310 rx_vars[channel].new_word = insert_edge_4ch(channel,
JongYongPark 21:82b5759f5047 311 &rx_vars[channel].shift_reg, rx_vars[channel].edge_val,
JongYongPark 21:82b5759f5047 312 rx_vars[channel].steady_count,
JongYongPark 21:82b5759f5047 313 &(rx_vars[channel].dist_last_sync),
JongYongPark 21:82b5759f5047 314 &rx_vars[channel].detected_word);
JongYongPark 21:82b5759f5047 315 if (rx_vars[channel].dist_last_sync > (8 * LIFI_RX_SAMPLE_PER_SYMBOL)) { // limit dist_last_sync to avoid overflow problems
JongYongPark 21:82b5759f5047 316 rx_vars[channel].dist_last_sync = 32;
JongYongPark 0:488aa8153e15 317 #if RX_DEBUG_FRAME
JongYongPark 0:488aa8153e15 318 // println("\t %dRESET avoid overlow ",channel+1);
JongYongPark 0:488aa8153e15 319 #endif
JongYongPark 21:82b5759f5047 320 }
JongYongPark 14:07669aafe0e4 321
JongYongPark 0:488aa8153e15 322 // if(new_word >= 0) {
JongYongPark 0:488aa8153e15 323 #if RX_DEBUG_FRAME
JongYongPark 0:488aa8153e15 324 // println("\t %dRESET COUNTER ",channel+1);
JongYongPark 0:488aa8153e15 325 #endif
JongYongPark 21:82b5759f5047 326 rx_vars[channel].steady_count = 0;
JongYongPark 0:488aa8153e15 327 // }
JongYongPark 21:82b5759f5047 328 }
JongYongPark 21:82b5759f5047 329 rx_vars[channel].old_edge_val = rx_vars[channel].edge_val;
JongYongPark 14:07669aafe0e4 330
JongYongPark 21:82b5759f5047 331 #if (USE_MBED_OS5 && USE_LIFI_RX_CHECK_QUEUE)
JongYongPark 21:82b5759f5047 332 if((rx_vars[channel].new_word == 1) && (channel == LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX)) {
JongYongPark 21:82b5759f5047 333 //printf("!");
JongYongPark 21:82b5759f5047 334 // https://os.mbed.com/forum/bugs-suggestions/topic/28244/?page=1#comment-53612
JongYongPark 21:82b5759f5047 335 lifi_tx_check_queue.call(LifiRx_LoopOOK);
JongYongPark 21:82b5759f5047 336 }
JongYongPark 21:82b5759f5047 337 #endif
JongYongPark 0:488aa8153e15 338 }
JongYongPark 0:488aa8153e15 339
JongYongPark 18:2f7b820324c3 340 int add_byte_to_frame_v1(int channel,uint8_t * rx_frame_buffer, int * rx_frame_index, int * rx_frame_size, enum receiver_state * frame_state,unsigned char data)
JongYongPark 16:c551ee1092f5 341 {
JongYongPark 16:c551ee1092f5 342 if(data == SYNC_SYMBOL/* && (*rx_frame_index) < 0*/) {
JongYongPark 16:c551ee1092f5 343 (*rx_frame_index) = 0 ;
JongYongPark 16:c551ee1092f5 344 (*rx_frame_size) = 0 ;
JongYongPark 16:c551ee1092f5 345 (*frame_state) = SYNC_STATE ;
JongYongPark 16:c551ee1092f5 346 #if RX_DEBUG_FRAME
JongYongPark 16:c551ee1092f5 347 printf("\n%dSYNC ",channel+1);
JongYongPark 16:c551ee1092f5 348 #endif
JongYongPark 16:c551ee1092f5 349 return 0 ;
JongYongPark 16:c551ee1092f5 350 }
JongYongPark 16:c551ee1092f5 351 if((*frame_state) != IDLE_STATE) { // we are synced
JongYongPark 16:c551ee1092f5 352 rx_frame_buffer[*rx_frame_index] = data ;
JongYongPark 16:c551ee1092f5 353 (*rx_frame_index) ++ ;
JongYongPark 16:c551ee1092f5 354 if(data == STX) {
JongYongPark 16:c551ee1092f5 355 #if RX_DEBUG_FRAME
JongYongPark 16:c551ee1092f5 356 printf("%dSTART ",channel+1);
JongYongPark 16:c551ee1092f5 357 #endif
JongYongPark 16:c551ee1092f5 358 (*frame_state) = START_STATE ;
JongYongPark 16:c551ee1092f5 359 return 0 ;
JongYongPark 16:c551ee1092f5 360 } else if(data == ETX) {
JongYongPark 16:c551ee1092f5 361 #if RX_DEBUG_FRAME
JongYongPark 16:c551ee1092f5 362 printf("%dEND IDLE ",channel+1);
JongYongPark 16:c551ee1092f5 363 #endif
JongYongPark 16:c551ee1092f5 364 (*rx_frame_size) = (*rx_frame_index) ;
JongYongPark 16:c551ee1092f5 365 (*rx_frame_index) = -1 ;
JongYongPark 16:c551ee1092f5 366 (*frame_state) = IDLE_STATE ;
JongYongPark 16:c551ee1092f5 367
JongYongPark 16:c551ee1092f5 368 return 1 ;
JongYongPark 16:c551ee1092f5 369 } else if((*rx_frame_index) >= FRAME_BUFFER_SIZE) { //frame is larger than max size of frame ...
JongYongPark 16:c551ee1092f5 370 #if RX_DEBUG_FRAME
JongYongPark 16:c551ee1092f5 371 printf("%dIDLE - over FRAME_BUFFER_SIZE ",channel+1);
JongYongPark 16:c551ee1092f5 372 #endif
JongYongPark 16:c551ee1092f5 373 (*rx_frame_index) = -1 ;
JongYongPark 16:c551ee1092f5 374 (*rx_frame_size) = -1 ;
JongYongPark 16:c551ee1092f5 375 (*frame_state) = IDLE_STATE ;
JongYongPark 16:c551ee1092f5 376 return -1 ;
JongYongPark 16:c551ee1092f5 377 } else {
JongYongPark 16:c551ee1092f5 378 #if RX_DEBUG_FRAME
JongYongPark 16:c551ee1092f5 379 printf("%dD=%c[%x] ",channel+1,data,data);
JongYongPark 16:c551ee1092f5 380 #endif
JongYongPark 16:c551ee1092f5 381 (*frame_state) = DATA_STATE ;
JongYongPark 16:c551ee1092f5 382 }
JongYongPark 16:c551ee1092f5 383 return 0 ;
JongYongPark 16:c551ee1092f5 384 }
JongYongPark 16:c551ee1092f5 385 return -1 ;
JongYongPark 16:c551ee1092f5 386 }
JongYongPark 16:c551ee1092f5 387
JongYongPark 18:2f7b820324c3 388 int add_byte_to_frame(int channel, uint8_t * rx_frame_buffer,
JongYongPark 21:82b5759f5047 389 int * rx_frame_index, int * rx_frame_size,
JongYongPark 21:82b5759f5047 390 enum receiver_state * frame_state, unsigned char data)
JongYongPark 21:82b5759f5047 391 {
JongYongPark 21:82b5759f5047 392 if (data == SYNC_SYMBOL/* && (*rx_frame_index) < 0*/) {
JongYongPark 21:82b5759f5047 393 (*rx_frame_index) = 0;
JongYongPark 21:82b5759f5047 394 (*rx_frame_size) = 0;
JongYongPark 21:82b5759f5047 395 (*frame_state) = SYNC_STATE;
JongYongPark 0:488aa8153e15 396 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 397 printf("\n%dSYNC ",channel+1);
JongYongPark 0:488aa8153e15 398 #endif
JongYongPark 21:82b5759f5047 399 return 0;
JongYongPark 21:82b5759f5047 400 }
JongYongPark 21:82b5759f5047 401 if ((*frame_state) != IDLE_STATE) { // we are synced
JongYongPark 21:82b5759f5047 402 rx_frame_buffer[*rx_frame_index] = data;
JongYongPark 21:82b5759f5047 403 (*rx_frame_index)++;
JongYongPark 11:8ffa8a36126f 404
JongYongPark 21:82b5759f5047 405 if ((*frame_state) == SYNC_STATE) {
JongYongPark 21:82b5759f5047 406 if (data == STX) {
JongYongPark 0:488aa8153e15 407 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 408 printf("%dSTART ",channel+1);
JongYongPark 0:488aa8153e15 409 #endif
JongYongPark 21:82b5759f5047 410 (*frame_state) = START_STATE;
JongYongPark 21:82b5759f5047 411 return 0;
JongYongPark 21:82b5759f5047 412 } else if (data == SYNC_SYMBOL) {
JongYongPark 21:82b5759f5047 413 // do nothing
JongYongPark 21:82b5759f5047 414 } else {
JongYongPark 21:82b5759f5047 415 printf("\n Error # got wrong data after SYNC. it should be STX");
JongYongPark 21:82b5759f5047 416 (*frame_state) = IDLE_STATE;
JongYongPark 21:82b5759f5047 417 return -1;
JongYongPark 21:82b5759f5047 418 }
JongYongPark 11:8ffa8a36126f 419
JongYongPark 21:82b5759f5047 420 } else if ((*frame_state) == START_STATE) {
JongYongPark 21:82b5759f5047 421 (*frame_state) = LENGTH_LSB_STATE;
JongYongPark 21:82b5759f5047 422 rx_vars[channel].pdu_length = data;
JongYongPark 16:c551ee1092f5 423 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 424 printf("%dLENGTH_LSB(%d) ",channel+1,data);
JongYongPark 16:c551ee1092f5 425 #endif
JongYongPark 21:82b5759f5047 426 } else if ((*frame_state) == LENGTH_LSB_STATE) {
JongYongPark 11:8ffa8a36126f 427
JongYongPark 21:82b5759f5047 428 (*frame_state) = LENGTH_MSB_STATE;
JongYongPark 21:82b5759f5047 429 rx_vars[channel].pdu_length = rx_vars[channel].pdu_length + (data << 8);
JongYongPark 21:82b5759f5047 430 rx_vars[channel].pdu_length_count = 0;
JongYongPark 21:82b5759f5047 431 rx_vars[channel].frame_length = rx_vars[channel].pdu_length + LIFI_FRAME_HEADER_SIZE;
JongYongPark 16:c551ee1092f5 432 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 433 printf("%dLENGTH_MSB(%d) length=%d ",channel+1,data, rx_vars[channel].pdu_length);
JongYongPark 16:c551ee1092f5 434 #endif
JongYongPark 16:c551ee1092f5 435
JongYongPark 21:82b5759f5047 436 } else if ((*frame_state) == LENGTH_MSB_STATE) {
JongYongPark 11:8ffa8a36126f 437
JongYongPark 11:8ffa8a36126f 438 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 439 printf("%dD=%c[%x] ",channel+1,data,data);
JongYongPark 11:8ffa8a36126f 440 #endif
JongYongPark 21:82b5759f5047 441 (*frame_state) = DATA_STATE;
JongYongPark 21:82b5759f5047 442 rx_vars[channel].pdu_length_count++;
JongYongPark 11:8ffa8a36126f 443
JongYongPark 21:82b5759f5047 444 } else if ((*frame_state) == DATA_STATE) {
JongYongPark 21:82b5759f5047 445 rx_vars[channel].pdu_length_count++;
JongYongPark 21:82b5759f5047 446 // when ETX
JongYongPark 21:82b5759f5047 447 if (rx_vars[channel].pdu_length_count
JongYongPark 21:82b5759f5047 448 > rx_vars[channel].pdu_length) {
JongYongPark 21:82b5759f5047 449
JongYongPark 21:82b5759f5047 450 rx_vars[channel].pdu_length_count--; // ETX is not included on data length
JongYongPark 21:82b5759f5047 451 rx_vars[channel].pdu_length_count_save = rx_vars[channel].pdu_length_count;
JongYongPark 21:82b5759f5047 452 rx_vars[channel].pdu_length_save = rx_vars[channel].pdu_length;
JongYongPark 21:82b5759f5047 453 rx_vars[channel].frame_length_save = rx_vars[channel].frame_length;
JongYongPark 18:2f7b820324c3 454
JongYongPark 21:82b5759f5047 455 if (data == ETX) {
JongYongPark 17:847e9b792c72 456 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 457 printf("%dEND IDLE ",channel+1);
JongYongPark 17:847e9b792c72 458 #endif
JongYongPark 21:82b5759f5047 459 (*rx_frame_size) = (*rx_frame_index);
JongYongPark 21:82b5759f5047 460 (*rx_frame_index) = -1;
JongYongPark 21:82b5759f5047 461 (*frame_state) = IDLE_STATE;
JongYongPark 21:82b5759f5047 462 return 1;
JongYongPark 21:82b5759f5047 463 } else {
JongYongPark 21:82b5759f5047 464 printf("\n CH(%d) Error : got wrong data (0x%2x). it should be ETX (0x03)",channel,data);
JongYongPark 21:82b5759f5047 465 print_frame_data(rx_vars[channel].rx_frame_buffer, rx_vars[channel].frame_length);
JongYongPark 21:82b5759f5047 466 (*frame_state) = IDLE_STATE;
JongYongPark 21:82b5759f5047 467 return -1;
JongYongPark 21:82b5759f5047 468 }
JongYongPark 21:82b5759f5047 469 }
JongYongPark 21:82b5759f5047 470 // normal DATA
JongYongPark 21:82b5759f5047 471 else {
JongYongPark 0:488aa8153e15 472 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 473 printf("%dD=%c[%x] ",channel+1,data,data);
JongYongPark 21:82b5759f5047 474 #endif
JongYongPark 21:82b5759f5047 475 }
JongYongPark 21:82b5759f5047 476 } else if ((*rx_frame_index) >= FRAME_BUFFER_SIZE) { //frame is larger than max size of frame ...
JongYongPark 21:82b5759f5047 477 #if RX_DEBUG_FRAME
JongYongPark 21:82b5759f5047 478 printf("%dIDLE - over FRAME_BUFFER_SIZE ",channel+1);
JongYongPark 0:488aa8153e15 479 #endif
JongYongPark 21:82b5759f5047 480 (*rx_frame_index) = -1;
JongYongPark 21:82b5759f5047 481 (*rx_frame_size) = -1;
JongYongPark 21:82b5759f5047 482 (*frame_state) = IDLE_STATE;
JongYongPark 21:82b5759f5047 483 return -1;
JongYongPark 21:82b5759f5047 484 } else {
JongYongPark 21:82b5759f5047 485 printf("\n CH(%d) Error : unknown state (%d)", *frame_state);
JongYongPark 21:82b5759f5047 486 (*frame_state) = IDLE_STATE;
JongYongPark 21:82b5759f5047 487 return 1;
JongYongPark 21:82b5759f5047 488 }
JongYongPark 21:82b5759f5047 489 return 0; // normal
JongYongPark 21:82b5759f5047 490 }
JongYongPark 21:82b5759f5047 491 return -1; // error
JongYongPark 0:488aa8153e15 492 }
JongYongPark 0:488aa8153e15 493
JongYongPark 0:488aa8153e15 494 int counter = 0;
JongYongPark 0:488aa8153e15 495
JongYongPark 21:82b5759f5047 496 void setup_ADC()
JongYongPark 21:82b5759f5047 497 {
JongYongPark 0:488aa8153e15 498 //
JongYongPark 0:488aa8153e15 499 // if( (m_op_mode != OP_HW_TEST) && (m_op_mode != OP_PLOT_ADC))
JongYongPark 0:488aa8153e15 500 // {
JongYongPark 0:488aa8153e15 501 // //analogReference(INTERNAL); // internal reference is 1.1v, should give better accuracy for the mv range of the led output.
JongYongPark 0:488aa8153e15 502 // Timer1.initialize(LIFI_RX_SYMBOL_PERIOD_US/LIFI_RX_SAMPLE_PER_SYMBOL); //1200 bauds oversampled by factor 4
JongYongPark 0:488aa8153e15 503 // Timer1.attachInterrupt(sample_signal_edge);
JongYongPark 0:488aa8153e15 504 // }
JongYongPark 0:488aa8153e15 505 }
JongYongPark 0:488aa8153e15 506
JongYongPark 0:488aa8153e15 507 // the setup routine runs once when you press reset:
JongYongPark 0:488aa8153e15 508
JongYongPark 0:488aa8153e15 509 //bool isValidNumber(string str)
JongYongPark 0:488aa8153e15 510 //{
JongYongPark 0:488aa8153e15 511 // bool isNum=true;
JongYongPark 0:488aa8153e15 512 // for(byte i=0; i<str.length(); i++) {
JongYongPark 0:488aa8153e15 513 // //isNum = isDigit(str.charAt(i)) || str.charAt(i) == '+' || str.charAt(i) == '.' || str.charAt(i) == '-';
JongYongPark 0:488aa8153e15 514 //// isNum = isDigit(str.charAt(i)); // || str.charAt(i) == '+' || str.charAt(i) == '.' || str.charAt(i) == '-';
JongYongPark 0:488aa8153e15 515 // if(!isNum) return false;
JongYongPark 0:488aa8153e15 516 // }
JongYongPark 0:488aa8153e15 517 // return isNum;
JongYongPark 0:488aa8153e15 518 //}
JongYongPark 0:488aa8153e15 519
JongYongPark 21:82b5759f5047 520 bool rx_loop_ook_4ch(int channel)
JongYongPark 21:82b5759f5047 521 {
JongYongPark 21:82b5759f5047 522 int i;
JongYongPark 21:82b5759f5047 523 bool got_all_frame = false;
JongYongPark 21:82b5759f5047 524 unsigned char received_data;
JongYongPark 21:82b5759f5047 525 //unsigned char received_data_print ;
JongYongPark 21:82b5759f5047 526 //int nb_shift ;
JongYongPark 21:82b5759f5047 527 int byte_added = 0;
JongYongPark 21:82b5759f5047 528 bool valid_chars;
JongYongPark 21:82b5759f5047 529 if (rx_vars[channel].new_word == 1) {
JongYongPark 21:82b5759f5047 530 received_data = 0;
JongYongPark 21:82b5759f5047 531 for (i = 0; i < 16; i = i + 2) { //decoding Manchester
JongYongPark 21:82b5759f5047 532 received_data = received_data << 1;
JongYongPark 21:82b5759f5047 533 if (((rx_vars[channel].detected_word >> i) & 0x03) == 0x01) {
JongYongPark 21:82b5759f5047 534 received_data |= 0x01;
JongYongPark 21:82b5759f5047 535 } else {
JongYongPark 21:82b5759f5047 536 received_data &= ~0x01;
JongYongPark 21:82b5759f5047 537 }
JongYongPark 21:82b5759f5047 538 }
JongYongPark 21:82b5759f5047 539 received_data = received_data & 0xFF;
JongYongPark 0:488aa8153e15 540 #if RX_DEBUG_MAIN_LOOP
JongYongPark 21:82b5759f5047 541 // printf("%dRx:%c[%x]",channel+1,(unsigned char) received_data,received_data & 0xFF);
JongYongPark 0:488aa8153e15 542 #endif
JongYongPark 21:82b5759f5047 543 rx_vars[channel].new_word = 0;
JongYongPark 21:82b5759f5047 544
JongYongPark 21:82b5759f5047 545 // return 1 from add_byte_to_frame() means got ETX
JongYongPark 16:c551ee1092f5 546 #if LIFI_PACKET_USE_LENGTH
JongYongPark 21:82b5759f5047 547 if ((byte_added = add_byte_to_frame(channel,
JongYongPark 21:82b5759f5047 548 rx_vars[channel].rx_frame_buffer,
JongYongPark 21:82b5759f5047 549 &rx_vars[channel].rx_frame_index,
JongYongPark 21:82b5759f5047 550 &rx_vars[channel].rx_frame_size, &rx_vars[channel].frame_state,
JongYongPark 21:82b5759f5047 551 received_data)) > 0)
JongYongPark 16:c551ee1092f5 552 #else
JongYongPark 21:82b5759f5047 553 if ((byte_added = add_byte_to_frame_v1(channel,
JongYongPark 21:82b5759f5047 554 rx_vars[channel].rx_frame_buffer,
JongYongPark 21:82b5759f5047 555 &rx_vars[channel].rx_frame_index,
JongYongPark 21:82b5759f5047 556 &rx_vars[channel].rx_frame_size, &rx_vars[channel].frame_state,
JongYongPark 21:82b5759f5047 557 received_data)) > 0)
JongYongPark 16:c551ee1092f5 558 #endif
JongYongPark 21:82b5759f5047 559 {
JongYongPark 21:82b5759f5047 560 valid_chars = true;
JongYongPark 21:82b5759f5047 561 // 여기서 ETX를 0으로 변경해 버린다.
JongYongPark 21:82b5759f5047 562 //rx_vars[channel].rx_frame_buffer[rx_vars[channel].rx_frame_size - 1] = '\0';
JongYongPark 0:488aa8153e15 563 #if RX_DEBUG_MAIN_LOOP
JongYongPark 21:82b5759f5047 564 //printf("%dAdc[Max=%d Min=%d]",channel+1,rx_vars[channel].probe_adc_high,rx_vars[channel].probe_adc_low);
JongYongPark 0:488aa8153e15 565 #endif
JongYongPark 22:1b6e6d26273e 566
JongYongPark 22:1b6e6d26273e 567 LifiRx_CopyAdcInfo_FromReceivedFrame( channel, rx_vars[channel].probe_adc_high , rx_vars[channel].probe_adc_low);
JongYongPark 0:488aa8153e15 568
JongYongPark 21:82b5759f5047 569 rx_vars[channel].probe_adc_high = 0;
JongYongPark 21:82b5759f5047 570 rx_vars[channel].probe_adc_low = 1024;
JongYongPark 18:2f7b820324c3 571 #if 1
JongYongPark 18:2f7b820324c3 572 // for (int i = 1; i < (rx_vars[channel].rx_frame_size - 1); i++) {
JongYongPark 18:2f7b820324c3 573 // if ((rx_vars[channel].rx_frame_buffer[i] < ' ')
JongYongPark 18:2f7b820324c3 574 // || (rx_vars[channel].rx_frame_buffer[i] > '~')) {
JongYongPark 18:2f7b820324c3 575 // valid_chars = false0;
JongYongPark 18:2f7b820324c3 576 // break;
JongYongPark 18:2f7b820324c3 577 // } else {
JongYongPark 18:2f7b820324c3 578 // }
JongYongPark 18:2f7b820324c3 579 // }
JongYongPark 21:82b5759f5047 580 valid_chars = true;
JongYongPark 21:82b5759f5047 581 #else
JongYongPark 21:82b5759f5047 582 // only valid when char is charactor
JongYongPark 21:82b5759f5047 583 for (int i = 1; i < (rx_vars[channel].rx_frame_size - 1); i++) {
JongYongPark 21:82b5759f5047 584 if ((rx_vars[channel].rx_frame_buffer[i] < ' ')
JongYongPark 21:82b5759f5047 585 || (rx_vars[channel].rx_frame_buffer[i] > '~')) {
JongYongPark 21:82b5759f5047 586 valid_chars = false;
JongYongPark 21:82b5759f5047 587 break;
JongYongPark 21:82b5759f5047 588 } else {
JongYongPark 21:82b5759f5047 589 }
JongYongPark 21:82b5759f5047 590 }
JongYongPark 18:2f7b820324c3 591 #endif
JongYongPark 21:82b5759f5047 592 // printf("\n=============");
JongYongPark 21:82b5759f5047 593 // print_frame_data(rx_vars[channel].rx_frame_buffer,rx_vars[channel].frame_length_save);
JongYongPark 14:07669aafe0e4 594
JongYongPark 22:1b6e6d26273e 595 memcpy(rx_vars[channel].rx_frame_buffer_save, rx_vars[channel].rx_frame_buffer, FRAME_BUFFER_SIZE);
JongYongPark 21:82b5759f5047 596 rx_vars[channel].is_received = true;
JongYongPark 22:1b6e6d26273e 597 printf(" *** Channel[%d] Rx Finished !!! *** ", channel +1 );
JongYongPark 21:82b5759f5047 598 if (valid_chars) {
JongYongPark 0:488aa8153e15 599 // //println(&(rx_frame_buffer[1]));
JongYongPark 0:488aa8153e15 600 // //stringReceive = string(&(rx_frame_buffer[1]));
JongYongPark 0:488aa8153e15 601 // //stringReceive = stringReceive.toUpperCase();
JongYongPark 0:488aa8153e15 602 // //println(stringReceive);
JongYongPark 0:488aa8153e15 603 // printf("\nMSG(ch_%d)[%s]",channel, rx_vars[channel].rx_frame_buffer);
JongYongPark 21:82b5759f5047 604 rx_vars[channel].is_valid = true;
JongYongPark 21:82b5759f5047 605 } else {
JongYongPark 0:488aa8153e15 606 // printf("\nMSG_Invalid(ch_%d)[%s]",channel, rx_vars[channel].rx_frame_buffer);
JongYongPark 21:82b5759f5047 607 rx_vars[channel].is_valid = false;
JongYongPark 21:82b5759f5047 608 }
JongYongPark 22:1b6e6d26273e 609 // http://www.java2s.com/Tutorial/Cpp/0160__Structure/Usememcpytoduplicatestructures.htm
JongYongPark 22:1b6e6d26273e 610 //memcpy((void*) &rx_vars_received[channel], (void*) &rx_vars[channel], sizeof( struct RX_VARS));
JongYongPark 22:1b6e6d26273e 611 //memcpy( &rx_vars_received[channel], &rx_vars[channel], sizeof( struct RX_VARS));
JongYongPark 22:1b6e6d26273e 612 //memcpy((void*) & (rx_vars_received[channel]), (void*) &(rx_vars[channel]), sizeof(rx_vars[channel]));
JongYongPark 22:1b6e6d26273e 613
JongYongPark 22:1b6e6d26273e 614 LifiRx_CopyData_FromReceivedFrame(channel);
JongYongPark 21:82b5759f5047 615 got_all_frame = true;
JongYongPark 21:82b5759f5047 616 }
JongYongPark 21:82b5759f5047 617 //if(frame_state != IDLE_STATE) println(received_data, HEX);
JongYongPark 21:82b5759f5047 618 }
JongYongPark 21:82b5759f5047 619 return got_all_frame;
JongYongPark 0:488aa8153e15 620 }
JongYongPark 21:82b5759f5047 621
JongYongPark 21:82b5759f5047 622
JongYongPark 18:2f7b820324c3 623
JongYongPark 18:2f7b820324c3 624 void print_channel_data(int channel)
JongYongPark 18:2f7b820324c3 625 {
JongYongPark 21:82b5759f5047 626 #if RX_DEBUG_MAIN_LOOP
JongYongPark 21:82b5759f5047 627 printf("\nMSG(%d) valid=%d, [len:%d/%d/%d] Adc[Max=%d Min=%d Gap=%d]",
JongYongPark 21:82b5759f5047 628 channel,
JongYongPark 21:82b5759f5047 629 rx_vars[channel].is_valid,
JongYongPark 21:82b5759f5047 630 rx_vars[channel].pdu_length_count_save,
JongYongPark 21:82b5759f5047 631 rx_vars[channel].pdu_length_save,
JongYongPark 21:82b5759f5047 632 rx_vars[channel].frame_length_save,
JongYongPark 22:1b6e6d26273e 633 rx_vars[channel].probe_adc_high,
JongYongPark 22:1b6e6d26273e 634 rx_vars[channel].probe_adc_low,
JongYongPark 22:1b6e6d26273e 635 rx_vars[channel].probe_adc_gap);
JongYongPark 21:82b5759f5047 636 // print_frame_data(rx_vars[channel].rx_frame_buffer_save,rx_vars[channel].pdu_length);
JongYongPark 21:82b5759f5047 637 print_pdu_data(rx_vars[channel].rx_frame_buffer_save + LIFI_RX_FRAME_DATA_OFFSET,rx_vars[channel].pdu_length_save);
JongYongPark 21:82b5759f5047 638 print_frame_data(rx_vars[channel].rx_frame_buffer_save,rx_vars[channel].frame_length_save);
JongYongPark 0:488aa8153e15 639
JongYongPark 14:07669aafe0e4 640 #endif
JongYongPark 0:488aa8153e15 641 }
JongYongPark 0:488aa8153e15 642
JongYongPark 22:1b6e6d26273e 643 void print_channel_received_data(int channel)
JongYongPark 22:1b6e6d26273e 644 {
JongYongPark 22:1b6e6d26273e 645 #if RX_DEBUG_MAIN_LOOP
JongYongPark 22:1b6e6d26273e 646 printf("\nMSG(%d) valid=%d, [len:%d/%d/%d] Adc[Max=%d Min=%d Gap=%d]",
JongYongPark 22:1b6e6d26273e 647 channel,
JongYongPark 22:1b6e6d26273e 648 rx_vars_received[channel].is_valid,
JongYongPark 22:1b6e6d26273e 649 rx_vars_received[channel].pdu_length_count,
JongYongPark 22:1b6e6d26273e 650 rx_vars_received[channel].pdu_length,
JongYongPark 22:1b6e6d26273e 651 rx_vars_received[channel].frame_length,
JongYongPark 22:1b6e6d26273e 652 rx_vars_received[channel].probe_adc_high,
JongYongPark 22:1b6e6d26273e 653 rx_vars_received[channel].probe_adc_low,
JongYongPark 22:1b6e6d26273e 654 rx_vars_received[channel].probe_adc_gap);
JongYongPark 22:1b6e6d26273e 655 // print_frame_data(rx_vars[channel].rx_frame_buffer_save,rx_vars[channel].pdu_length);
JongYongPark 22:1b6e6d26273e 656 print_pdu_data(rx_vars_received[channel].rx_frame_buffer + LIFI_RX_FRAME_DATA_OFFSET,rx_vars_received[channel].pdu_length);
JongYongPark 22:1b6e6d26273e 657 print_frame_data(rx_vars_received[channel].rx_frame_buffer,rx_vars_received[channel].frame_length);
JongYongPark 22:1b6e6d26273e 658
JongYongPark 22:1b6e6d26273e 659 #endif
JongYongPark 22:1b6e6d26273e 660 }
JongYongPark 21:82b5759f5047 661
JongYongPark 21:82b5759f5047 662 void print_4ch_message()
JongYongPark 21:82b5759f5047 663 {
JongYongPark 21:82b5759f5047 664 // int channel = LIFI_CHANNEL_1;
JongYongPark 21:82b5759f5047 665 // for (; channel <= LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX; channel++) {
JongYongPark 21:82b5759f5047 666 // if (rx_vars[channel].is_received == false)
JongYongPark 21:82b5759f5047 667 // return;
JongYongPark 21:82b5759f5047 668 // }
JongYongPark 21:82b5759f5047 669 #if RX_DEBUG_MAIN_LOOP
JongYongPark 21:82b5759f5047 670 printf("\n----------------");
JongYongPark 21:82b5759f5047 671 #endif
JongYongPark 21:82b5759f5047 672 print_channel_data(LIFI_CHANNEL_1);
JongYongPark 21:82b5759f5047 673
JongYongPark 21:82b5759f5047 674 rx_vars[LIFI_CHANNEL_1].is_received = false;
JongYongPark 21:82b5759f5047 675
JongYongPark 21:82b5759f5047 676 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_2)) {
JongYongPark 21:82b5759f5047 677 print_channel_data(LIFI_CHANNEL_2);
JongYongPark 21:82b5759f5047 678 rx_vars[LIFI_CHANNEL_2].is_received = false;
JongYongPark 21:82b5759f5047 679 }
JongYongPark 21:82b5759f5047 680 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_3)) {
JongYongPark 21:82b5759f5047 681 print_channel_data(LIFI_CHANNEL_3);
JongYongPark 21:82b5759f5047 682 rx_vars[LIFI_CHANNEL_3].is_received = false;
JongYongPark 21:82b5759f5047 683 }
JongYongPark 21:82b5759f5047 684 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_4)) {
JongYongPark 21:82b5759f5047 685 print_channel_data(LIFI_CHANNEL_4);
JongYongPark 21:82b5759f5047 686 rx_vars[LIFI_CHANNEL_4].is_received = false;
JongYongPark 21:82b5759f5047 687 }
JongYongPark 21:82b5759f5047 688 }
JongYongPark 21:82b5759f5047 689 int LifixRx_FinishedChannlCount()
JongYongPark 21:82b5759f5047 690 {
JongYongPark 21:82b5759f5047 691 int channel = LIFI_CHANNEL_1;
JongYongPark 21:82b5759f5047 692 int got_frame_count = 0;
JongYongPark 21:82b5759f5047 693 for (; channel <= LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX; channel++) {
JongYongPark 21:82b5759f5047 694 if (rx_vars[channel].is_received == true) got_frame_count++;
JongYongPark 21:82b5759f5047 695 }
JongYongPark 21:82b5759f5047 696 return got_frame_count;
JongYongPark 21:82b5759f5047 697 }
JongYongPark 21:82b5759f5047 698
JongYongPark 21:82b5759f5047 699 int LifixRx_PrintUnfinishedChannl()
JongYongPark 21:82b5759f5047 700 {
JongYongPark 21:82b5759f5047 701 int channel = LIFI_CHANNEL_1;
JongYongPark 21:82b5759f5047 702 int got_frame_count = 0;
JongYongPark 21:82b5759f5047 703 for (; channel <= LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX; channel++) {
JongYongPark 21:82b5759f5047 704 if (rx_vars[channel].is_received == true) ;//printf("CH[%d] Finished ooo", channel + 1);
JongYongPark 21:82b5759f5047 705 else printf("\n CH[%d]XXX", channel + 1);
JongYongPark 21:82b5759f5047 706 }
JongYongPark 21:82b5759f5047 707 return got_frame_count;
JongYongPark 21:82b5759f5047 708 }
JongYongPark 0:488aa8153e15 709
JongYongPark 21:82b5759f5047 710 bool LifixRx_FinishedFromAllChannel()
JongYongPark 21:82b5759f5047 711 {
JongYongPark 21:82b5759f5047 712 int channel = LIFI_CHANNEL_1;
JongYongPark 21:82b5759f5047 713 for (; channel <= LIFI_ACTUAL_MAX_CHANNEL_NUM_INDEX; channel++) {
JongYongPark 21:82b5759f5047 714 if (rx_vars[channel].is_received == false) {
JongYongPark 21:82b5759f5047 715 //waiting_count_for_all_channel_finished++;
JongYongPark 21:82b5759f5047 716 return false;
JongYongPark 21:82b5759f5047 717 }
JongYongPark 21:82b5759f5047 718 }
JongYongPark 21:82b5759f5047 719 //waiting_count_for_all_channel_finished = 0;
JongYongPark 21:82b5759f5047 720 return true;
JongYongPark 21:82b5759f5047 721 }
JongYongPark 21:82b5759f5047 722
JongYongPark 21:82b5759f5047 723 void LifiRx_LoopOOK()
JongYongPark 21:82b5759f5047 724 {
JongYongPark 21:82b5759f5047 725 static uint64_t loop_count = 0;
JongYongPark 21:82b5759f5047 726 int finished_channel = 0;
JongYongPark 21:82b5759f5047 727 //printf("!");
JongYongPark 21:82b5759f5047 728 // for 1 channel, it works well.
JongYongPark 21:82b5759f5047 729 // data corrupted when open 2 channels
JongYongPark 21:82b5759f5047 730 // LIFI_RX_SYMBOL_PERIOD_SEC (0.01) = works well for 2 channels *********
JongYongPark 21:82b5759f5047 731 rx_loop_ook_4ch(LIFI_CHANNEL_1);
JongYongPark 21:82b5759f5047 732 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_2))
JongYongPark 21:82b5759f5047 733 rx_loop_ook_4ch(LIFI_CHANNEL_2);
JongYongPark 21:82b5759f5047 734 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_3))
JongYongPark 21:82b5759f5047 735 rx_loop_ook_4ch(LIFI_CHANNEL_3);
JongYongPark 21:82b5759f5047 736 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_4))
JongYongPark 21:82b5759f5047 737 rx_loop_ook_4ch(LIFI_CHANNEL_4);
JongYongPark 21:82b5759f5047 738
JongYongPark 21:82b5759f5047 739
JongYongPark 21:82b5759f5047 740 // if(LifixRx_FinishedFromAllChannel()){
JongYongPark 21:82b5759f5047 741 // print_4ch_message();
JongYongPark 21:82b5759f5047 742 // loop_count = 0;
JongYongPark 21:82b5759f5047 743 // }
JongYongPark 21:82b5759f5047 744 // else {
JongYongPark 21:82b5759f5047 745 // loop_count++;
JongYongPark 21:82b5759f5047 746 // if(loop_count > 2 )
JongYongPark 21:82b5759f5047 747 // {
JongYongPark 21:82b5759f5047 748 // LifixRx_PrintUnFinishedChannl();
JongYongPark 21:82b5759f5047 749 // print_4ch_message();
JongYongPark 21:82b5759f5047 750 // LifiRx_Init();
JongYongPark 21:82b5759f5047 751 // loop_count = 0;
JongYongPark 21:82b5759f5047 752 // }
JongYongPark 21:82b5759f5047 753 // }
JongYongPark 21:82b5759f5047 754
JongYongPark 21:82b5759f5047 755 finished_channel = LifixRx_FinishedChannlCount();
JongYongPark 21:82b5759f5047 756 if( finished_channel == LIFI_ACTUAL_MAX_CHANNEL_NUM ) {
JongYongPark 21:82b5759f5047 757 print_4ch_message();
JongYongPark 21:82b5759f5047 758 loop_count = 0;
JongYongPark 21:82b5759f5047 759 }
JongYongPark 21:82b5759f5047 760 // 4 channel 에서 하나의 유효한 channel 에서 데이타를 받으면 나머지는 어디서 문제가 발생했는지 알 수 있다.
JongYongPark 21:82b5759f5047 761 else if(finished_channel >= 1 ) {
JongYongPark 21:82b5759f5047 762 loop_count++;
JongYongPark 21:82b5759f5047 763 if(loop_count > 1000 ) {
JongYongPark 22:1b6e6d26273e 764 printf("\nHERE 1 Finished channel count (%d)",finished_channel);
JongYongPark 21:82b5759f5047 765 LifixRx_PrintUnfinishedChannl();
JongYongPark 21:82b5759f5047 766 print_4ch_message();
JongYongPark 21:82b5759f5047 767 LifiRx_Init();
JongYongPark 21:82b5759f5047 768 loop_count = 0;
JongYongPark 21:82b5759f5047 769 }
JongYongPark 21:82b5759f5047 770 }
JongYongPark 21:82b5759f5047 771 // else
JongYongPark 21:82b5759f5047 772 // {
JongYongPark 21:82b5759f5047 773 // loop_count++;
JongYongPark 21:82b5759f5047 774 // if(loop_count > 10000000 )
JongYongPark 21:82b5759f5047 775 // {
JongYongPark 21:82b5759f5047 776 // printf("\nHERE 2 Finished(%d)",finished_channel);
JongYongPark 21:82b5759f5047 777 // LifixRx_PrintUnfinishedChannl();
JongYongPark 21:82b5759f5047 778 // print_4ch_message();
JongYongPark 21:82b5759f5047 779 // LifiRx_Init();
JongYongPark 21:82b5759f5047 780 // loop_count = 0;
JongYongPark 21:82b5759f5047 781 // }
JongYongPark 21:82b5759f5047 782 // }
JongYongPark 0:488aa8153e15 783 }
JongYongPark 0:488aa8153e15 784
JongYongPark 0:488aa8153e15 785 // the loop routine runs over and over again forever:
JongYongPark 0:488aa8153e15 786
JongYongPark 21:82b5759f5047 787 void LifiRx_SampleSignalEdge()
JongYongPark 21:82b5759f5047 788 {
JongYongPark 21:82b5759f5047 789 int sensorValue, sensorValue2, sensorValue3, sensorValue4;
JongYongPark 0:488aa8153e15 790
JongYongPark 21:82b5759f5047 791 sensorValue = LifiRx_AdcRead(LIFI_CHANNEL_1);
JongYongPark 21:82b5759f5047 792 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_2))
JongYongPark 21:82b5759f5047 793 sensorValue2 = LifiRx_AdcRead(LIFI_CHANNEL_2);
JongYongPark 21:82b5759f5047 794 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_3))
JongYongPark 21:82b5759f5047 795 sensorValue3 = LifiRx_AdcRead(LIFI_CHANNEL_3);
JongYongPark 21:82b5759f5047 796 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_4))
JongYongPark 21:82b5759f5047 797 sensorValue4 = LifiRx_AdcRead(LIFI_CHANNEL_4);
JongYongPark 0:488aa8153e15 798
JongYongPark 21:82b5759f5047 799 sample_signal_edge_4ch(LIFI_CHANNEL_1, sensorValue);
JongYongPark 21:82b5759f5047 800 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_2))
JongYongPark 21:82b5759f5047 801 sample_signal_edge_4ch(LIFI_CHANNEL_2, sensorValue2);
JongYongPark 21:82b5759f5047 802 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_3))
JongYongPark 21:82b5759f5047 803 sample_signal_edge_4ch(LIFI_CHANNEL_3, sensorValue3);
JongYongPark 21:82b5759f5047 804 if (Lifi_IsChannelAvailable(LIFI_CHANNEL_4))
JongYongPark 21:82b5759f5047 805 sample_signal_edge_4ch(LIFI_CHANNEL_4, sensorValue4);
JongYongPark 0:488aa8153e15 806 }
JongYongPark 0:488aa8153e15 807
JongYongPark 21:82b5759f5047 808 void LifiRx_Init()
JongYongPark 21:82b5759f5047 809 {
JongYongPark 21:82b5759f5047 810 rx_vars[LIFI_CHANNEL_1].rx_frame_index = -1;
JongYongPark 21:82b5759f5047 811 rx_vars[LIFI_CHANNEL_2].rx_frame_index = -1;
JongYongPark 21:82b5759f5047 812 rx_vars[LIFI_CHANNEL_3].rx_frame_index = -1;
JongYongPark 21:82b5759f5047 813 rx_vars[LIFI_CHANNEL_4].rx_frame_index = -1;
JongYongPark 21:82b5759f5047 814 rx_vars[LIFI_CHANNEL_1].rx_frame_size = -1;
JongYongPark 21:82b5759f5047 815 rx_vars[LIFI_CHANNEL_2].rx_frame_size = -1;
JongYongPark 21:82b5759f5047 816 rx_vars[LIFI_CHANNEL_3].rx_frame_size = -1;
JongYongPark 21:82b5759f5047 817 rx_vars[LIFI_CHANNEL_4].rx_frame_size = -1;
JongYongPark 21:82b5759f5047 818 rx_vars[LIFI_CHANNEL_1].frame_state = IDLE_STATE;
JongYongPark 21:82b5759f5047 819 rx_vars[LIFI_CHANNEL_2].frame_state = IDLE_STATE;
JongYongPark 21:82b5759f5047 820 rx_vars[LIFI_CHANNEL_3].frame_state = IDLE_STATE;
JongYongPark 21:82b5759f5047 821 rx_vars[LIFI_CHANNEL_4].frame_state = IDLE_STATE;
JongYongPark 0:488aa8153e15 822
JongYongPark 21:82b5759f5047 823 rx_vars[LIFI_CHANNEL_1].is_received = false;
JongYongPark 21:82b5759f5047 824 rx_vars[LIFI_CHANNEL_2].is_received = false;
JongYongPark 21:82b5759f5047 825 rx_vars[LIFI_CHANNEL_3].is_received = false;
JongYongPark 21:82b5759f5047 826 rx_vars[LIFI_CHANNEL_4].is_received = false;
JongYongPark 14:07669aafe0e4 827 }