JongYong Park / Mbed 2 deprecated NUCLEO-F767_LIFI_4CH_os2_v2

Dependencies:   mbed

Committer:
JongYongPark
Date:
Wed Apr 10 11:56:56 2019 +0900
Revision:
34:d704131107dd
Parent:
23:45461af5efc5
Child:
35:dcddce1fe126
add new struct

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