テストモード追加、LED有効化 left -> SerialRX, Data Recieve Complete , Serial Tx , Light Tx
Dependencies: XBee mbed NetServicesMin
frame_layer/layer_frame.cpp@1:36eb173eb52b, 2012-04-15 (annotated)
- Committer:
- recotana
- Date:
- Sun Apr 15 13:09:53 2012 +0000
- Revision:
- 1:36eb173eb52b
- Parent:
- 0:42adca80439c
- Child:
- 2:dec6319cf02c
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
recotana | 0:42adca80439c | 1 | #include "mbed.h" |
recotana | 0:42adca80439c | 2 | #include "types.h" |
recotana | 0:42adca80439c | 3 | #include "config.h" |
recotana | 0:42adca80439c | 4 | #include "culc_crc16.h" |
recotana | 0:42adca80439c | 5 | #include "layer_frame.h" |
recotana | 1:36eb173eb52b | 6 | #include "data_models.h" |
recotana | 0:42adca80439c | 7 | #include "leds.h" |
recotana | 0:42adca80439c | 8 | #include "serialRecieve.h" |
recotana | 0:42adca80439c | 9 | |
recotana | 0:42adca80439c | 10 | |
recotana | 0:42adca80439c | 11 | volatile int symbolCode; |
recotana | 0:42adca80439c | 12 | volatile int pulseCounter; |
recotana | 0:42adca80439c | 13 | volatile int pulseState; |
recotana | 0:42adca80439c | 14 | volatile bool isSend; |
recotana | 0:42adca80439c | 15 | |
recotana | 0:42adca80439c | 16 | volatile bool isSendContinueous; |
recotana | 0:42adca80439c | 17 | volatile bool isSendContinued; |
recotana | 0:42adca80439c | 18 | |
recotana | 0:42adca80439c | 19 | Payload sendedPayload; |
recotana | 0:42adca80439c | 20 | uint16_t sendedFrameNumber; |
recotana | 0:42adca80439c | 21 | |
recotana | 0:42adca80439c | 22 | volatile uint8_t buff[70]; |
recotana | 0:42adca80439c | 23 | volatile uint8_t buffIndex; |
recotana | 0:42adca80439c | 24 | |
recotana | 0:42adca80439c | 25 | volatile float txMax; |
recotana | 0:42adca80439c | 26 | volatile float txMin; |
recotana | 0:42adca80439c | 27 | volatile float txMid; |
recotana | 0:42adca80439c | 28 | |
recotana | 1:36eb173eb52b | 29 | |
recotana | 0:42adca80439c | 30 | AnalogOut dac(p18); |
recotana | 1:36eb173eb52b | 31 | DigitalOut lightPowerOn(p8); |
recotana | 1:36eb173eb52b | 32 | DigitalOut out(p19); |
recotana | 0:42adca80439c | 33 | |
recotana | 1:36eb173eb52b | 34 | extern PrefSender spref; |
recotana | 1:36eb173eb52b | 35 | |
recotana | 1:36eb173eb52b | 36 | |
recotana | 1:36eb173eb52b | 37 | void lightIlluminateChange(uint8_t _sw){ |
recotana | 1:36eb173eb52b | 38 | |
recotana | 1:36eb173eb52b | 39 | if(_sw == 0){ |
recotana | 1:36eb173eb52b | 40 | lightPowerOn=0; |
recotana | 1:36eb173eb52b | 41 | } |
recotana | 1:36eb173eb52b | 42 | else{ |
recotana | 1:36eb173eb52b | 43 | lightPowerOn=1; |
recotana | 1:36eb173eb52b | 44 | } |
recotana | 1:36eb173eb52b | 45 | |
recotana | 1:36eb173eb52b | 46 | } |
recotana | 1:36eb173eb52b | 47 | |
recotana | 1:36eb173eb52b | 48 | void setTxLevel(TxGainData *_data) |
recotana | 0:42adca80439c | 49 | { |
recotana | 0:42adca80439c | 50 | |
recotana | 1:36eb173eb52b | 51 | uint8_t _gain = _data->gain; |
recotana | 1:36eb173eb52b | 52 | uint8_t _mid = _data->middleLevel; |
recotana | 0:42adca80439c | 53 | |
recotana | 0:42adca80439c | 54 | if( (_mid > 10) || (_mid <1) ) return; |
recotana | 0:42adca80439c | 55 | if(_gain > 10) return; |
recotana | 0:42adca80439c | 56 | |
recotana | 0:42adca80439c | 57 | if(_gain == 0){ |
recotana | 0:42adca80439c | 58 | txMax = 0; |
recotana | 0:42adca80439c | 59 | txMin = 0; |
recotana | 0:42adca80439c | 60 | txMid = 0; |
recotana | 0:42adca80439c | 61 | return; |
recotana | 0:42adca80439c | 62 | } |
recotana | 0:42adca80439c | 63 | |
recotana | 0:42adca80439c | 64 | float g = (float)_gain*0.1; |
recotana | 0:42adca80439c | 65 | float mid = (float)_mid*0.1; |
recotana | 0:42adca80439c | 66 | |
recotana | 0:42adca80439c | 67 | txMax = kDAC_GAIN_MAX * g; |
recotana | 0:42adca80439c | 68 | txMin = kDAC_GAIN_MIN * g; |
recotana | 0:42adca80439c | 69 | txMid = mid * g; |
recotana | 0:42adca80439c | 70 | } |
recotana | 0:42adca80439c | 71 | |
recotana | 0:42adca80439c | 72 | void timer1_init(void) |
recotana | 0:42adca80439c | 73 | { |
recotana | 0:42adca80439c | 74 | LPC_SC->PCLKSEL0 &= ~(3UL << 4); //clear bits 96MHz |
recotana | 0:42adca80439c | 75 | LPC_SC->PCLKSEL0 |= (1UL << 4); //set bit |
recotana | 0:42adca80439c | 76 | |
recotana | 0:42adca80439c | 77 | LPC_SC->PCONP |=1 << 2; //timer1 power on |
recotana | 0:42adca80439c | 78 | LPC_TIM1->MR0 = kTImerCount; //1/96MHz = 0.010416666 us :( 1/(0.010416666 us * 1667) * 2) = 28.794kHz |
recotana | 0:42adca80439c | 79 | LPC_TIM1->MCR = 3; //interrupt and reset control |
recotana | 0:42adca80439c | 80 | //3 = Interrupt & reset timer1 on match |
recotana | 0:42adca80439c | 81 | //1 = Interrupt only, no reset of timer1 |
recotana | 0:42adca80439c | 82 | // NVIC_EnableIRQ(TIMER1_IRQn); //enable timer1 interrupt |
recotana | 0:42adca80439c | 83 | // LPC_TIM1->TCR = 1; //enable Timer1 |
recotana | 0:42adca80439c | 84 | enableTimer(); |
recotana | 0:42adca80439c | 85 | } |
recotana | 0:42adca80439c | 86 | |
recotana | 0:42adca80439c | 87 | void enableTimer(void) |
recotana | 0:42adca80439c | 88 | { |
recotana | 0:42adca80439c | 89 | LPC_TIM1->MR0 = kTImerCount; |
recotana | 0:42adca80439c | 90 | NVIC_EnableIRQ(TIMER1_IRQn); |
recotana | 0:42adca80439c | 91 | LPC_TIM1->TCR = 1; //enable Timer1 |
recotana | 0:42adca80439c | 92 | } |
recotana | 0:42adca80439c | 93 | void disableTimer(void) |
recotana | 0:42adca80439c | 94 | { |
recotana | 0:42adca80439c | 95 | NVIC_DisableIRQ(TIMER1_IRQn); |
recotana | 0:42adca80439c | 96 | LPC_TIM1->TCR = 0; //disable Timer1 |
recotana | 0:42adca80439c | 97 | } |
recotana | 0:42adca80439c | 98 | |
recotana | 0:42adca80439c | 99 | void preambleGenerator(){ |
recotana | 0:42adca80439c | 100 | |
recotana | 0:42adca80439c | 101 | symbolCode = 4; |
recotana | 1:36eb173eb52b | 102 | while( pulseCounter <=96 ) {readProcess();} |
recotana | 0:42adca80439c | 103 | pulseCounter = 0; |
recotana | 0:42adca80439c | 104 | } |
recotana | 0:42adca80439c | 105 | |
recotana | 0:42adca80439c | 106 | void sendByteData(uint8_t _data){ |
recotana | 0:42adca80439c | 107 | // printf("%02X ",_data); |
recotana | 0:42adca80439c | 108 | pulseCounter = 0; |
recotana | 0:42adca80439c | 109 | |
recotana | 0:42adca80439c | 110 | symbolCode = (_data & 0x03); |
recotana | 0:42adca80439c | 111 | while( pulseCounter < 24 ) {readProcess();} |
recotana | 0:42adca80439c | 112 | pulseCounter = 0; |
recotana | 0:42adca80439c | 113 | |
recotana | 0:42adca80439c | 114 | symbolCode = ( (_data & 0x0C ) >> 2); |
recotana | 0:42adca80439c | 115 | while( pulseCounter < 24 ) {readProcess();} |
recotana | 0:42adca80439c | 116 | pulseCounter = 0; |
recotana | 0:42adca80439c | 117 | |
recotana | 0:42adca80439c | 118 | symbolCode = ( (_data & 0x30 ) >> 4); |
recotana | 0:42adca80439c | 119 | while( pulseCounter < 24 ) {readProcess();} |
recotana | 0:42adca80439c | 120 | pulseCounter = 0; |
recotana | 0:42adca80439c | 121 | |
recotana | 0:42adca80439c | 122 | symbolCode = ( (_data & 0xC0 ) >> 6); |
recotana | 0:42adca80439c | 123 | while( pulseCounter < 24 ){readProcess();} |
recotana | 0:42adca80439c | 124 | pulseCounter = 0; |
recotana | 0:42adca80439c | 125 | |
recotana | 0:42adca80439c | 126 | |
recotana | 0:42adca80439c | 127 | |
recotana | 0:42adca80439c | 128 | } |
recotana | 0:42adca80439c | 129 | |
recotana | 0:42adca80439c | 130 | |
recotana | 0:42adca80439c | 131 | void pulseGenerator(){ |
recotana | 0:42adca80439c | 132 | |
recotana | 0:42adca80439c | 133 | if(pulseState == -1) pulseState = 1; |
recotana | 0:42adca80439c | 134 | else pulseState = -1; |
recotana | 0:42adca80439c | 135 | |
recotana | 0:42adca80439c | 136 | |
recotana | 1:36eb173eb52b | 137 | if(pulseState<0) { out = 1; dac = txMax; } |
recotana | 1:36eb173eb52b | 138 | else { out = 0; dac = txMin; } |
recotana | 0:42adca80439c | 139 | |
recotana | 0:42adca80439c | 140 | } |
recotana | 0:42adca80439c | 141 | extern "C" void TIMER1_IRQHandler (void) |
recotana | 0:42adca80439c | 142 | { |
recotana | 0:42adca80439c | 143 | if((LPC_TIM1->IR & 0x01) != 0x01) return; // if MR0 interrupt, proceed |
recotana | 0:42adca80439c | 144 | |
recotana | 0:42adca80439c | 145 | LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag |
recotana | 0:42adca80439c | 146 | |
recotana | 0:42adca80439c | 147 | pulseCounter++; |
recotana | 0:42adca80439c | 148 | |
recotana | 0:42adca80439c | 149 | |
recotana | 0:42adca80439c | 150 | switch(symbolCode){ |
recotana | 0:42adca80439c | 151 | |
recotana | 0:42adca80439c | 152 | case 0: |
recotana | 0:42adca80439c | 153 | { |
recotana | 0:42adca80439c | 154 | if( pulseCounter <= 6) pulseGenerator(); |
recotana | 1:36eb173eb52b | 155 | else { out = 0; dac=txMid;} |
recotana | 0:42adca80439c | 156 | } |
recotana | 0:42adca80439c | 157 | break; |
recotana | 0:42adca80439c | 158 | |
recotana | 0:42adca80439c | 159 | case 2: |
recotana | 0:42adca80439c | 160 | { |
recotana | 0:42adca80439c | 161 | if( (pulseCounter > 6)&(pulseCounter <= 12) ) pulseGenerator(); |
recotana | 1:36eb173eb52b | 162 | else { out = 0; dac=txMid;} |
recotana | 0:42adca80439c | 163 | } |
recotana | 0:42adca80439c | 164 | break; |
recotana | 0:42adca80439c | 165 | |
recotana | 0:42adca80439c | 166 | case 1: |
recotana | 0:42adca80439c | 167 | { |
recotana | 0:42adca80439c | 168 | if( (pulseCounter > 12)&(pulseCounter <= 18) ) pulseGenerator(); |
recotana | 1:36eb173eb52b | 169 | else { out = 0; dac=txMid;} |
recotana | 0:42adca80439c | 170 | } |
recotana | 0:42adca80439c | 171 | break; |
recotana | 0:42adca80439c | 172 | |
recotana | 0:42adca80439c | 173 | case 3: |
recotana | 0:42adca80439c | 174 | { |
recotana | 0:42adca80439c | 175 | if( (pulseCounter > 18)&(pulseCounter <= 24 )) pulseGenerator(); |
recotana | 1:36eb173eb52b | 176 | else { out = 0; dac=txMid;} |
recotana | 0:42adca80439c | 177 | } |
recotana | 0:42adca80439c | 178 | break; |
recotana | 0:42adca80439c | 179 | |
recotana | 0:42adca80439c | 180 | case 4: |
recotana | 0:42adca80439c | 181 | { |
recotana | 1:36eb173eb52b | 182 | // if( pulseCounter <= 18 ) pulseGenerator(); |
recotana | 1:36eb173eb52b | 183 | if( (pulseCounter > 18) & (pulseCounter <= 36) ) pulseGenerator(); |
recotana | 1:36eb173eb52b | 184 | else { out = 0; dac=txMid;} |
recotana | 0:42adca80439c | 185 | } |
recotana | 0:42adca80439c | 186 | break; |
recotana | 0:42adca80439c | 187 | |
recotana | 0:42adca80439c | 188 | } |
recotana | 0:42adca80439c | 189 | |
recotana | 0:42adca80439c | 190 | |
recotana | 0:42adca80439c | 191 | } |
recotana | 0:42adca80439c | 192 | |
recotana | 1:36eb173eb52b | 193 | void initCarrierWave(){ |
recotana | 0:42adca80439c | 194 | dac = kDAC_OFF; |
recotana | 1:36eb173eb52b | 195 | out=0; |
recotana | 0:42adca80439c | 196 | |
recotana | 0:42adca80439c | 197 | pulseCounter=0; |
recotana | 0:42adca80439c | 198 | symbolCode = 0; |
recotana | 0:42adca80439c | 199 | pulseState = -1; |
recotana | 0:42adca80439c | 200 | |
recotana | 1:36eb173eb52b | 201 | spref.gainData.gain = kTxGain; |
recotana | 1:36eb173eb52b | 202 | spref.gainData.middleLevel = kTxMidLevel; |
recotana | 1:36eb173eb52b | 203 | |
recotana | 1:36eb173eb52b | 204 | setTxLevel( &spref.gainData ); |
recotana | 0:42adca80439c | 205 | |
recotana | 1:36eb173eb52b | 206 | spref.lightsw=1; |
recotana | 1:36eb173eb52b | 207 | lightIlluminateChange(spref.lightsw); |
recotana | 1:36eb173eb52b | 208 | |
recotana | 1:36eb173eb52b | 209 | spref.isSend=0; |
recotana | 1:36eb173eb52b | 210 | spref.continueusMode=0; |
recotana | 1:36eb173eb52b | 211 | |
recotana | 1:36eb173eb52b | 212 | |
recotana | 0:42adca80439c | 213 | sendedFrameNumber=0xffff; |
recotana | 0:42adca80439c | 214 | timer1_init(); |
recotana | 0:42adca80439c | 215 | |
recotana | 1:36eb173eb52b | 216 | // initPayload(&sendedPayload); |
recotana | 0:42adca80439c | 217 | } |
recotana | 0:42adca80439c | 218 | |
recotana | 0:42adca80439c | 219 | |
recotana | 1:36eb173eb52b | 220 | |
recotana | 0:42adca80439c | 221 | void sendPayload(Payload *_payload){ |
recotana | 0:42adca80439c | 222 | |
recotana | 1:36eb173eb52b | 223 | #ifdef _SERVER_TEST_MODE_ |
recotana | 1:36eb173eb52b | 224 | dumpPayload(_payload); |
recotana | 1:36eb173eb52b | 225 | #endif |
recotana | 0:42adca80439c | 226 | |
recotana | 1:36eb173eb52b | 227 | makedata(_payload); |
recotana | 1:36eb173eb52b | 228 | |
recotana | 1:36eb173eb52b | 229 | ledLightTx(); |
recotana | 0:42adca80439c | 230 | |
recotana | 1:36eb173eb52b | 231 | for(uint8_t i=0 ; i < kContSendNum ; i++){ |
recotana | 1:36eb173eb52b | 232 | sendbuff(); |
recotana | 1:36eb173eb52b | 233 | } |
recotana | 1:36eb173eb52b | 234 | |
recotana | 1:36eb173eb52b | 235 | } |
recotana | 1:36eb173eb52b | 236 | |
recotana | 1:36eb173eb52b | 237 | void makedata(Payload *_payload ){ |
recotana | 1:36eb173eb52b | 238 | |
recotana | 1:36eb173eb52b | 239 | uint16_t fNum= _payload->frame.message.frameNumber; |
recotana | 0:42adca80439c | 240 | |
recotana | 1:36eb173eb52b | 241 | // printf("\n------------------- fnum:%0X\n",fNum); |
recotana | 1:36eb173eb52b | 242 | if( fNum != sendedFrameNumber ){ |
recotana | 1:36eb173eb52b | 243 | |
recotana | 1:36eb173eb52b | 244 | sendedFrameNumber = fNum; |
recotana | 0:42adca80439c | 245 | |
recotana | 0:42adca80439c | 246 | memcpy(&sendedPayload,_payload,sizeof(Payload)); |
recotana | 1:36eb173eb52b | 247 | sendedPayload.frame.message.sum = culcSum(&sendedPayload); |
recotana | 1:36eb173eb52b | 248 | |
recotana | 1:36eb173eb52b | 249 | Payload tmp; |
recotana | 1:36eb173eb52b | 250 | memcpy(&tmp,&sendedPayload,sizeof(Payload)); |
recotana | 1:36eb173eb52b | 251 | |
recotana | 1:36eb173eb52b | 252 | Frame *frame=&tmp.frame; |
recotana | 1:36eb173eb52b | 253 | |
recotana | 1:36eb173eb52b | 254 | payloadToNetwork(&tmp); |
recotana | 1:36eb173eb52b | 255 | // dumpPayload(&tmp); |
recotana | 0:42adca80439c | 256 | |
recotana | 0:42adca80439c | 257 | uint16_t crc = 0xffff; |
recotana | 0:42adca80439c | 258 | uint8_t index=0; |
recotana | 0:42adca80439c | 259 | |
recotana | 0:42adca80439c | 260 | //frame type |
recotana | 1:36eb173eb52b | 261 | buff[index]=tmp.ftype; |
recotana | 0:42adca80439c | 262 | crc = One_Byte_CRC16_Calc( crc , buff[index]); |
recotana | 0:42adca80439c | 263 | |
recotana | 0:42adca80439c | 264 | index++; |
recotana | 1:36eb173eb52b | 265 | uint8_t *data=(uint8_t*)&frame->id; |
recotana | 0:42adca80439c | 266 | |
recotana | 0:42adca80439c | 267 | //id |
recotana | 0:42adca80439c | 268 | for(int8_t i=15 ; i>=0 ;i--){ |
recotana | 1:36eb173eb52b | 269 | buff[index]=data[i]; |
recotana | 0:42adca80439c | 270 | crc = One_Byte_CRC16_Calc( crc , buff[index]); |
recotana | 0:42adca80439c | 271 | index++; |
recotana | 0:42adca80439c | 272 | } |
recotana | 1:36eb173eb52b | 273 | |
recotana | 0:42adca80439c | 274 | //message |
recotana | 1:36eb173eb52b | 275 | data=(uint8_t*)&frame->message; |
recotana | 0:42adca80439c | 276 | for(int8_t i=47 ; i>=0 ;i--){ |
recotana | 1:36eb173eb52b | 277 | buff[index]=data[i]; |
recotana | 0:42adca80439c | 278 | crc = One_Byte_CRC16_Calc( crc , buff[index]); |
recotana | 0:42adca80439c | 279 | index++; |
recotana | 0:42adca80439c | 280 | } |
recotana | 0:42adca80439c | 281 | |
recotana | 0:42adca80439c | 282 | //CRC |
recotana | 0:42adca80439c | 283 | buff[index] =(uint8_t)(crc&0x00ff); |
recotana | 0:42adca80439c | 284 | index++; |
recotana | 0:42adca80439c | 285 | buff[index] =(uint8_t)(crc>>8); |
recotana | 0:42adca80439c | 286 | |
recotana | 0:42adca80439c | 287 | } |
recotana | 0:42adca80439c | 288 | |
recotana | 0:42adca80439c | 289 | } |
recotana | 0:42adca80439c | 290 | |
recotana | 0:42adca80439c | 291 | |
recotana | 1:36eb173eb52b | 292 | void sendComp(void){ |
recotana | 1:36eb173eb52b | 293 | isSend=false; |
recotana | 0:42adca80439c | 294 | } |
recotana | 0:42adca80439c | 295 | |
recotana | 1:36eb173eb52b | 296 | void sendbuff(void){ |
recotana | 1:36eb173eb52b | 297 | if(isSend) return; |
recotana | 1:36eb173eb52b | 298 | // ledDevice(); |
recotana | 1:36eb173eb52b | 299 | |
recotana | 1:36eb173eb52b | 300 | isSend=true; |
recotana | 1:36eb173eb52b | 301 | preambleGenerator(); |
recotana | 1:36eb173eb52b | 302 | for(uint16_t i=0 ; i<67 ; i++) sendByteData( buff[i] ); |
recotana | 1:36eb173eb52b | 303 | isSend=false; |
recotana | 1:36eb173eb52b | 304 | } |