Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lifiReceiver.cpp@34:d704131107dd, 2019-04-10 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |