テストモード追加、LED有効化 left -> SerialRX, Data Recieve Complete , Serial Tx , Light Tx
Dependencies: XBee mbed NetServicesMin
frame_layer/layer_frame.cpp@0:42adca80439c, 2012-03-22 (annotated)
- Committer:
- recotana
- Date:
- Thu Mar 22 12:40:48 2012 +0000
- Revision:
- 0:42adca80439c
- Child:
- 1:36eb173eb52b
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 | 0:42adca80439c | 6 | |
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 | 0:42adca80439c | 29 | //Ticker carrierWave; |
recotana | 0:42adca80439c | 30 | AnalogOut dac(p18); |
recotana | 0:42adca80439c | 31 | |
recotana | 0:42adca80439c | 32 | void setTxLevel(uint8_t _gain , uint8_t _mid) |
recotana | 0:42adca80439c | 33 | { |
recotana | 0:42adca80439c | 34 | |
recotana | 0:42adca80439c | 35 | |
recotana | 0:42adca80439c | 36 | if( (_mid > 10) || (_mid <1) ) return; |
recotana | 0:42adca80439c | 37 | if(_gain > 10) return; |
recotana | 0:42adca80439c | 38 | |
recotana | 0:42adca80439c | 39 | if(_gain == 0){ |
recotana | 0:42adca80439c | 40 | txMax = 0; |
recotana | 0:42adca80439c | 41 | txMin = 0; |
recotana | 0:42adca80439c | 42 | txMid = 0; |
recotana | 0:42adca80439c | 43 | return; |
recotana | 0:42adca80439c | 44 | } |
recotana | 0:42adca80439c | 45 | |
recotana | 0:42adca80439c | 46 | float g = (float)_gain*0.1; |
recotana | 0:42adca80439c | 47 | float mid = (float)_mid*0.1; |
recotana | 0:42adca80439c | 48 | |
recotana | 0:42adca80439c | 49 | txMax = kDAC_GAIN_MAX * g; |
recotana | 0:42adca80439c | 50 | txMin = kDAC_GAIN_MIN * g; |
recotana | 0:42adca80439c | 51 | txMid = mid * g; |
recotana | 0:42adca80439c | 52 | } |
recotana | 0:42adca80439c | 53 | |
recotana | 0:42adca80439c | 54 | void timer1_init(void) |
recotana | 0:42adca80439c | 55 | { |
recotana | 0:42adca80439c | 56 | LPC_SC->PCLKSEL0 &= ~(3UL << 4); //clear bits 96MHz |
recotana | 0:42adca80439c | 57 | LPC_SC->PCLKSEL0 |= (1UL << 4); //set bit |
recotana | 0:42adca80439c | 58 | |
recotana | 0:42adca80439c | 59 | LPC_SC->PCONP |=1 << 2; //timer1 power on |
recotana | 0:42adca80439c | 60 | LPC_TIM1->MR0 = kTImerCount; //1/96MHz = 0.010416666 us :( 1/(0.010416666 us * 1667) * 2) = 28.794kHz |
recotana | 0:42adca80439c | 61 | LPC_TIM1->MCR = 3; //interrupt and reset control |
recotana | 0:42adca80439c | 62 | //3 = Interrupt & reset timer1 on match |
recotana | 0:42adca80439c | 63 | //1 = Interrupt only, no reset of timer1 |
recotana | 0:42adca80439c | 64 | // NVIC_EnableIRQ(TIMER1_IRQn); //enable timer1 interrupt |
recotana | 0:42adca80439c | 65 | // LPC_TIM1->TCR = 1; //enable Timer1 |
recotana | 0:42adca80439c | 66 | enableTimer(); |
recotana | 0:42adca80439c | 67 | } |
recotana | 0:42adca80439c | 68 | |
recotana | 0:42adca80439c | 69 | void enableTimer(void) |
recotana | 0:42adca80439c | 70 | { |
recotana | 0:42adca80439c | 71 | LPC_TIM1->MR0 = kTImerCount; |
recotana | 0:42adca80439c | 72 | NVIC_EnableIRQ(TIMER1_IRQn); |
recotana | 0:42adca80439c | 73 | LPC_TIM1->TCR = 1; //enable Timer1 |
recotana | 0:42adca80439c | 74 | } |
recotana | 0:42adca80439c | 75 | void disableTimer(void) |
recotana | 0:42adca80439c | 76 | { |
recotana | 0:42adca80439c | 77 | NVIC_DisableIRQ(TIMER1_IRQn); |
recotana | 0:42adca80439c | 78 | LPC_TIM1->TCR = 0; //disable Timer1 |
recotana | 0:42adca80439c | 79 | } |
recotana | 0:42adca80439c | 80 | |
recotana | 0:42adca80439c | 81 | void preambleGenerator(){ |
recotana | 0:42adca80439c | 82 | |
recotana | 0:42adca80439c | 83 | symbolCode = 4; |
recotana | 0:42adca80439c | 84 | while( pulseCounter <=77 ) {readProcess();} |
recotana | 0:42adca80439c | 85 | pulseCounter = 0; |
recotana | 0:42adca80439c | 86 | } |
recotana | 0:42adca80439c | 87 | |
recotana | 0:42adca80439c | 88 | void sendByteData(uint8_t _data){ |
recotana | 0:42adca80439c | 89 | // printf("%02X ",_data); |
recotana | 0:42adca80439c | 90 | pulseCounter = 0; |
recotana | 0:42adca80439c | 91 | |
recotana | 0:42adca80439c | 92 | symbolCode = (_data & 0x03); |
recotana | 0:42adca80439c | 93 | while( pulseCounter < 24 ) {readProcess();} |
recotana | 0:42adca80439c | 94 | pulseCounter = 0; |
recotana | 0:42adca80439c | 95 | |
recotana | 0:42adca80439c | 96 | symbolCode = ( (_data & 0x0C ) >> 2); |
recotana | 0:42adca80439c | 97 | while( pulseCounter < 24 ) {readProcess();} |
recotana | 0:42adca80439c | 98 | pulseCounter = 0; |
recotana | 0:42adca80439c | 99 | |
recotana | 0:42adca80439c | 100 | symbolCode = ( (_data & 0x30 ) >> 4); |
recotana | 0:42adca80439c | 101 | while( pulseCounter < 24 ) {readProcess();} |
recotana | 0:42adca80439c | 102 | pulseCounter = 0; |
recotana | 0:42adca80439c | 103 | |
recotana | 0:42adca80439c | 104 | symbolCode = ( (_data & 0xC0 ) >> 6); |
recotana | 0:42adca80439c | 105 | while( pulseCounter < 24 ){readProcess();} |
recotana | 0:42adca80439c | 106 | pulseCounter = 0; |
recotana | 0:42adca80439c | 107 | |
recotana | 0:42adca80439c | 108 | |
recotana | 0:42adca80439c | 109 | |
recotana | 0:42adca80439c | 110 | } |
recotana | 0:42adca80439c | 111 | |
recotana | 0:42adca80439c | 112 | |
recotana | 0:42adca80439c | 113 | void pulseGenerator(){ |
recotana | 0:42adca80439c | 114 | |
recotana | 0:42adca80439c | 115 | if(pulseState == -1) pulseState = 1; |
recotana | 0:42adca80439c | 116 | else pulseState = -1; |
recotana | 0:42adca80439c | 117 | |
recotana | 0:42adca80439c | 118 | |
recotana | 0:42adca80439c | 119 | if(pulseState<0) dac = txMax; |
recotana | 0:42adca80439c | 120 | else dac = txMin; |
recotana | 0:42adca80439c | 121 | |
recotana | 0:42adca80439c | 122 | } |
recotana | 0:42adca80439c | 123 | extern "C" void TIMER1_IRQHandler (void) |
recotana | 0:42adca80439c | 124 | { |
recotana | 0:42adca80439c | 125 | if((LPC_TIM1->IR & 0x01) != 0x01) return; // if MR0 interrupt, proceed |
recotana | 0:42adca80439c | 126 | |
recotana | 0:42adca80439c | 127 | LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag |
recotana | 0:42adca80439c | 128 | |
recotana | 0:42adca80439c | 129 | pulseCounter++; |
recotana | 0:42adca80439c | 130 | |
recotana | 0:42adca80439c | 131 | |
recotana | 0:42adca80439c | 132 | switch(symbolCode){ |
recotana | 0:42adca80439c | 133 | |
recotana | 0:42adca80439c | 134 | case 0: |
recotana | 0:42adca80439c | 135 | { |
recotana | 0:42adca80439c | 136 | if( pulseCounter <= 6) pulseGenerator(); |
recotana | 0:42adca80439c | 137 | else dac=txMid; |
recotana | 0:42adca80439c | 138 | } |
recotana | 0:42adca80439c | 139 | break; |
recotana | 0:42adca80439c | 140 | |
recotana | 0:42adca80439c | 141 | case 2: |
recotana | 0:42adca80439c | 142 | { |
recotana | 0:42adca80439c | 143 | if( (pulseCounter > 6)&(pulseCounter <= 12) ) pulseGenerator(); |
recotana | 0:42adca80439c | 144 | else dac=txMid; |
recotana | 0:42adca80439c | 145 | } |
recotana | 0:42adca80439c | 146 | break; |
recotana | 0:42adca80439c | 147 | |
recotana | 0:42adca80439c | 148 | case 1: |
recotana | 0:42adca80439c | 149 | { |
recotana | 0:42adca80439c | 150 | if( (pulseCounter > 12)&(pulseCounter <= 18) ) pulseGenerator(); |
recotana | 0:42adca80439c | 151 | else dac=txMid; |
recotana | 0:42adca80439c | 152 | } |
recotana | 0:42adca80439c | 153 | break; |
recotana | 0:42adca80439c | 154 | |
recotana | 0:42adca80439c | 155 | case 3: |
recotana | 0:42adca80439c | 156 | { |
recotana | 0:42adca80439c | 157 | if( (pulseCounter > 18)&(pulseCounter <= 24 )) pulseGenerator(); |
recotana | 0:42adca80439c | 158 | else dac=txMid; |
recotana | 0:42adca80439c | 159 | } |
recotana | 0:42adca80439c | 160 | break; |
recotana | 0:42adca80439c | 161 | |
recotana | 0:42adca80439c | 162 | case 4: |
recotana | 0:42adca80439c | 163 | { |
recotana | 0:42adca80439c | 164 | if( pulseCounter <= 18) pulseGenerator(); |
recotana | 0:42adca80439c | 165 | else dac=txMid; |
recotana | 0:42adca80439c | 166 | } |
recotana | 0:42adca80439c | 167 | break; |
recotana | 0:42adca80439c | 168 | |
recotana | 0:42adca80439c | 169 | } |
recotana | 0:42adca80439c | 170 | |
recotana | 0:42adca80439c | 171 | |
recotana | 0:42adca80439c | 172 | } |
recotana | 0:42adca80439c | 173 | |
recotana | 0:42adca80439c | 174 | |
recotana | 0:42adca80439c | 175 | void initCarrierWave(){ |
recotana | 0:42adca80439c | 176 | dac = kDAC_OFF; |
recotana | 0:42adca80439c | 177 | |
recotana | 0:42adca80439c | 178 | pulseCounter=0; |
recotana | 0:42adca80439c | 179 | symbolCode = 0; |
recotana | 0:42adca80439c | 180 | pulseState = -1; |
recotana | 0:42adca80439c | 181 | |
recotana | 0:42adca80439c | 182 | setTxLevel( kTxGain , kTxMidLevel ); |
recotana | 0:42adca80439c | 183 | |
recotana | 0:42adca80439c | 184 | isSend=false; |
recotana | 0:42adca80439c | 185 | isSendContinueous=false; |
recotana | 0:42adca80439c | 186 | sendedFrameNumber=0xffff; |
recotana | 0:42adca80439c | 187 | timer1_init(); |
recotana | 0:42adca80439c | 188 | |
recotana | 0:42adca80439c | 189 | initPayload(&sendedPayload); |
recotana | 0:42adca80439c | 190 | } |
recotana | 0:42adca80439c | 191 | |
recotana | 0:42adca80439c | 192 | |
recotana | 0:42adca80439c | 193 | void sendPayload(Payload *_payload){ |
recotana | 0:42adca80439c | 194 | |
recotana | 0:42adca80439c | 195 | if(isSend) return; |
recotana | 0:42adca80439c | 196 | |
recotana | 0:42adca80439c | 197 | Frame *frame=&_payload->frame; |
recotana | 0:42adca80439c | 198 | |
recotana | 0:42adca80439c | 199 | if( frame->message.frameNumber != sendedFrameNumber ){ |
recotana | 0:42adca80439c | 200 | |
recotana | 0:42adca80439c | 201 | sendedFrameNumber = frame->message.frameNumber; |
recotana | 0:42adca80439c | 202 | |
recotana | 0:42adca80439c | 203 | memcpy(&sendedPayload,_payload,sizeof(Payload)); |
recotana | 0:42adca80439c | 204 | |
recotana | 0:42adca80439c | 205 | uint16_t crc = 0xffff; |
recotana | 0:42adca80439c | 206 | uint8_t index=0; |
recotana | 0:42adca80439c | 207 | |
recotana | 0:42adca80439c | 208 | //frame type |
recotana | 0:42adca80439c | 209 | buff[index]=_payload->ftype; |
recotana | 0:42adca80439c | 210 | crc = One_Byte_CRC16_Calc( crc , buff[index]); |
recotana | 0:42adca80439c | 211 | |
recotana | 0:42adca80439c | 212 | index++; |
recotana | 0:42adca80439c | 213 | uint8_t *tmp=(uint8_t*)&frame->id; |
recotana | 0:42adca80439c | 214 | |
recotana | 0:42adca80439c | 215 | //id |
recotana | 0:42adca80439c | 216 | for(int8_t i=15 ; i>=0 ;i--){ |
recotana | 0:42adca80439c | 217 | buff[index]=tmp[i]; |
recotana | 0:42adca80439c | 218 | crc = One_Byte_CRC16_Calc( crc , buff[index]); |
recotana | 0:42adca80439c | 219 | index++; |
recotana | 0:42adca80439c | 220 | } |
recotana | 0:42adca80439c | 221 | |
recotana | 0:42adca80439c | 222 | //message |
recotana | 0:42adca80439c | 223 | tmp=(uint8_t*)&frame->message; |
recotana | 0:42adca80439c | 224 | for(int8_t i=47 ; i>=0 ;i--){ |
recotana | 0:42adca80439c | 225 | buff[index]=tmp[i]; |
recotana | 0:42adca80439c | 226 | crc = One_Byte_CRC16_Calc( crc , buff[index]); |
recotana | 0:42adca80439c | 227 | index++; |
recotana | 0:42adca80439c | 228 | } |
recotana | 0:42adca80439c | 229 | |
recotana | 0:42adca80439c | 230 | //CRC |
recotana | 0:42adca80439c | 231 | buff[index] =(uint8_t)(crc&0x00ff); |
recotana | 0:42adca80439c | 232 | index++; |
recotana | 0:42adca80439c | 233 | buff[index] =(uint8_t)(crc>>8); |
recotana | 0:42adca80439c | 234 | |
recotana | 0:42adca80439c | 235 | } |
recotana | 0:42adca80439c | 236 | // for(int i=0;i<67;i++) printf("%02X ",buff[i]); |
recotana | 0:42adca80439c | 237 | // printf("\r\n"); |
recotana | 0:42adca80439c | 238 | ledDevice(); |
recotana | 0:42adca80439c | 239 | |
recotana | 0:42adca80439c | 240 | for(uint8_t i=0 ; i<kContSendNum ; i++) |
recotana | 0:42adca80439c | 241 | { |
recotana | 0:42adca80439c | 242 | preambleGenerator(); |
recotana | 0:42adca80439c | 243 | |
recotana | 0:42adca80439c | 244 | for(uint16_t i=0 ; i<67 ; i++) sendByteData( buff[i] ); |
recotana | 0:42adca80439c | 245 | // printf("\r\n+++++++++\r\n"); |
recotana | 0:42adca80439c | 246 | } |
recotana | 0:42adca80439c | 247 | |
recotana | 0:42adca80439c | 248 | isSend=false; |
recotana | 0:42adca80439c | 249 | |
recotana | 0:42adca80439c | 250 | } |
recotana | 0:42adca80439c | 251 | |
recotana | 0:42adca80439c | 252 | |
recotana | 0:42adca80439c | 253 | void swapPayloadData(Payload *_payload) |
recotana | 0:42adca80439c | 254 | { |
recotana | 0:42adca80439c | 255 | uint8_t *org=(uint8_t*)_payload; |
recotana | 0:42adca80439c | 256 | uint8_t *tmp=(uint8_t*)&sendedPayload; |
recotana | 0:42adca80439c | 257 | |
recotana | 0:42adca80439c | 258 | uint8_t i; |
recotana | 0:42adca80439c | 259 | for(i=0 ; i<16 ;i++) tmp[i+2]=org[17-i]; |
recotana | 0:42adca80439c | 260 | for(i=0 ; i<48 ;i++) tmp[i+18]=org[65-i]; |
recotana | 0:42adca80439c | 261 | } |
recotana | 0:42adca80439c | 262 |