テストモード追加、LED有効化 left -> SerialRX, Data Recieve Complete , Serial Tx , Light Tx

Dependencies:   XBee mbed NetServicesMin

Committer:
recotana
Date:
Wed Apr 18 07:52:46 2012 +0000
Revision:
2:dec6319cf02c
Parent:
1:36eb173eb52b

        

Who changed what in which revision?

UserRevisionLine numberNew 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 2:dec6319cf02c 34 DigitalOut lightButtonLed(p29);
recotana 2:dec6319cf02c 35
recotana 1:36eb173eb52b 36 extern PrefSender spref;
recotana 1:36eb173eb52b 37
recotana 1:36eb173eb52b 38
recotana 1:36eb173eb52b 39 void lightIlluminateChange(uint8_t _sw){
recotana 1:36eb173eb52b 40
recotana 1:36eb173eb52b 41 if(_sw == 0){
recotana 2:dec6319cf02c 42 lightPowerOn=0;
recotana 2:dec6319cf02c 43 spref.lightsw = 0;
recotana 2:dec6319cf02c 44 lightButtonLed = 0;
recotana 1:36eb173eb52b 45 }
recotana 1:36eb173eb52b 46 else{
recotana 2:dec6319cf02c 47
recotana 2:dec6319cf02c 48 lightPowerOn=1;
recotana 2:dec6319cf02c 49 spref.lightsw = 1;
recotana 2:dec6319cf02c 50 lightButtonLed = 1;
recotana 2:dec6319cf02c 51
recotana 1:36eb173eb52b 52 }
recotana 1:36eb173eb52b 53
recotana 1:36eb173eb52b 54 }
recotana 1:36eb173eb52b 55
recotana 1:36eb173eb52b 56 void setTxLevel(TxGainData *_data)
recotana 0:42adca80439c 57 {
recotana 0:42adca80439c 58
recotana 1:36eb173eb52b 59 uint8_t _gain = _data->gain;
recotana 1:36eb173eb52b 60 uint8_t _mid = _data->middleLevel;
recotana 0:42adca80439c 61
recotana 0:42adca80439c 62 if( (_mid > 10) || (_mid <1) ) return;
recotana 0:42adca80439c 63 if(_gain > 10) return;
recotana 0:42adca80439c 64
recotana 0:42adca80439c 65 if(_gain == 0){
recotana 0:42adca80439c 66 txMax = 0;
recotana 0:42adca80439c 67 txMin = 0;
recotana 0:42adca80439c 68 txMid = 0;
recotana 0:42adca80439c 69 return;
recotana 0:42adca80439c 70 }
recotana 0:42adca80439c 71
recotana 0:42adca80439c 72 float g = (float)_gain*0.1;
recotana 0:42adca80439c 73 float mid = (float)_mid*0.1;
recotana 0:42adca80439c 74
recotana 0:42adca80439c 75 txMax = kDAC_GAIN_MAX * g;
recotana 0:42adca80439c 76 txMin = kDAC_GAIN_MIN * g;
recotana 0:42adca80439c 77 txMid = mid * g;
recotana 0:42adca80439c 78 }
recotana 0:42adca80439c 79
recotana 0:42adca80439c 80 void timer1_init(void)
recotana 0:42adca80439c 81 {
recotana 0:42adca80439c 82 LPC_SC->PCLKSEL0 &= ~(3UL << 4); //clear bits 96MHz
recotana 0:42adca80439c 83 LPC_SC->PCLKSEL0 |= (1UL << 4); //set bit
recotana 0:42adca80439c 84
recotana 0:42adca80439c 85 LPC_SC->PCONP |=1 << 2; //timer1 power on
recotana 0:42adca80439c 86 LPC_TIM1->MR0 = kTImerCount; //1/96MHz = 0.010416666 us :( 1/(0.010416666 us * 1667) * 2) = 28.794kHz
recotana 0:42adca80439c 87 LPC_TIM1->MCR = 3; //interrupt and reset control
recotana 0:42adca80439c 88 //3 = Interrupt & reset timer1 on match
recotana 0:42adca80439c 89 //1 = Interrupt only, no reset of timer1
recotana 0:42adca80439c 90 // NVIC_EnableIRQ(TIMER1_IRQn); //enable timer1 interrupt
recotana 0:42adca80439c 91 // LPC_TIM1->TCR = 1; //enable Timer1
recotana 0:42adca80439c 92 enableTimer();
recotana 0:42adca80439c 93 }
recotana 0:42adca80439c 94
recotana 0:42adca80439c 95 void enableTimer(void)
recotana 0:42adca80439c 96 {
recotana 0:42adca80439c 97 LPC_TIM1->MR0 = kTImerCount;
recotana 0:42adca80439c 98 NVIC_EnableIRQ(TIMER1_IRQn);
recotana 0:42adca80439c 99 LPC_TIM1->TCR = 1; //enable Timer1
recotana 0:42adca80439c 100 }
recotana 0:42adca80439c 101 void disableTimer(void)
recotana 0:42adca80439c 102 {
recotana 0:42adca80439c 103 NVIC_DisableIRQ(TIMER1_IRQn);
recotana 0:42adca80439c 104 LPC_TIM1->TCR = 0; //disable Timer1
recotana 0:42adca80439c 105 }
recotana 0:42adca80439c 106
recotana 0:42adca80439c 107 void preambleGenerator(){
recotana 0:42adca80439c 108
recotana 0:42adca80439c 109 symbolCode = 4;
recotana 1:36eb173eb52b 110 while( pulseCounter <=96 ) {readProcess();}
recotana 0:42adca80439c 111 pulseCounter = 0;
recotana 0:42adca80439c 112 }
recotana 0:42adca80439c 113
recotana 0:42adca80439c 114 void sendByteData(uint8_t _data){
recotana 0:42adca80439c 115 // printf("%02X ",_data);
recotana 0:42adca80439c 116 pulseCounter = 0;
recotana 0:42adca80439c 117
recotana 0:42adca80439c 118 symbolCode = (_data & 0x03);
recotana 0:42adca80439c 119 while( pulseCounter < 24 ) {readProcess();}
recotana 0:42adca80439c 120 pulseCounter = 0;
recotana 0:42adca80439c 121
recotana 0:42adca80439c 122 symbolCode = ( (_data & 0x0C ) >> 2);
recotana 0:42adca80439c 123 while( pulseCounter < 24 ) {readProcess();}
recotana 0:42adca80439c 124 pulseCounter = 0;
recotana 0:42adca80439c 125
recotana 0:42adca80439c 126 symbolCode = ( (_data & 0x30 ) >> 4);
recotana 0:42adca80439c 127 while( pulseCounter < 24 ) {readProcess();}
recotana 0:42adca80439c 128 pulseCounter = 0;
recotana 0:42adca80439c 129
recotana 0:42adca80439c 130 symbolCode = ( (_data & 0xC0 ) >> 6);
recotana 0:42adca80439c 131 while( pulseCounter < 24 ){readProcess();}
recotana 0:42adca80439c 132 pulseCounter = 0;
recotana 0:42adca80439c 133
recotana 0:42adca80439c 134
recotana 0:42adca80439c 135
recotana 0:42adca80439c 136 }
recotana 0:42adca80439c 137
recotana 0:42adca80439c 138
recotana 0:42adca80439c 139 void pulseGenerator(){
recotana 0:42adca80439c 140
recotana 0:42adca80439c 141 if(pulseState == -1) pulseState = 1;
recotana 0:42adca80439c 142 else pulseState = -1;
recotana 0:42adca80439c 143
recotana 0:42adca80439c 144
recotana 1:36eb173eb52b 145 if(pulseState<0) { out = 1; dac = txMax; }
recotana 1:36eb173eb52b 146 else { out = 0; dac = txMin; }
recotana 0:42adca80439c 147
recotana 0:42adca80439c 148 }
recotana 0:42adca80439c 149 extern "C" void TIMER1_IRQHandler (void)
recotana 0:42adca80439c 150 {
recotana 0:42adca80439c 151 if((LPC_TIM1->IR & 0x01) != 0x01) return; // if MR0 interrupt, proceed
recotana 0:42adca80439c 152
recotana 0:42adca80439c 153 LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag
recotana 0:42adca80439c 154
recotana 0:42adca80439c 155 pulseCounter++;
recotana 0:42adca80439c 156
recotana 0:42adca80439c 157
recotana 0:42adca80439c 158 switch(symbolCode){
recotana 0:42adca80439c 159
recotana 0:42adca80439c 160 case 0:
recotana 0:42adca80439c 161 {
recotana 0:42adca80439c 162 if( pulseCounter <= 6) pulseGenerator();
recotana 1:36eb173eb52b 163 else { out = 0; dac=txMid;}
recotana 0:42adca80439c 164 }
recotana 0:42adca80439c 165 break;
recotana 0:42adca80439c 166
recotana 0:42adca80439c 167 case 2:
recotana 0:42adca80439c 168 {
recotana 0:42adca80439c 169 if( (pulseCounter > 6)&(pulseCounter <= 12) ) pulseGenerator();
recotana 1:36eb173eb52b 170 else { out = 0; dac=txMid;}
recotana 0:42adca80439c 171 }
recotana 0:42adca80439c 172 break;
recotana 0:42adca80439c 173
recotana 0:42adca80439c 174 case 1:
recotana 0:42adca80439c 175 {
recotana 0:42adca80439c 176 if( (pulseCounter > 12)&(pulseCounter <= 18) ) pulseGenerator();
recotana 1:36eb173eb52b 177 else { out = 0; dac=txMid;}
recotana 0:42adca80439c 178 }
recotana 0:42adca80439c 179 break;
recotana 0:42adca80439c 180
recotana 0:42adca80439c 181 case 3:
recotana 0:42adca80439c 182 {
recotana 0:42adca80439c 183 if( (pulseCounter > 18)&(pulseCounter <= 24 )) 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 case 4:
recotana 0:42adca80439c 189 {
recotana 1:36eb173eb52b 190 // if( pulseCounter <= 18 ) pulseGenerator();
recotana 1:36eb173eb52b 191 if( (pulseCounter > 18) & (pulseCounter <= 36) ) pulseGenerator();
recotana 1:36eb173eb52b 192 else { out = 0; dac=txMid;}
recotana 0:42adca80439c 193 }
recotana 0:42adca80439c 194 break;
recotana 0:42adca80439c 195
recotana 0:42adca80439c 196 }
recotana 0:42adca80439c 197
recotana 0:42adca80439c 198
recotana 0:42adca80439c 199 }
recotana 0:42adca80439c 200
recotana 1:36eb173eb52b 201 void initCarrierWave(){
recotana 0:42adca80439c 202 dac = kDAC_OFF;
recotana 1:36eb173eb52b 203 out=0;
recotana 0:42adca80439c 204
recotana 0:42adca80439c 205 pulseCounter=0;
recotana 0:42adca80439c 206 symbolCode = 0;
recotana 0:42adca80439c 207 pulseState = -1;
recotana 0:42adca80439c 208
recotana 1:36eb173eb52b 209 spref.gainData.gain = kTxGain;
recotana 1:36eb173eb52b 210 spref.gainData.middleLevel = kTxMidLevel;
recotana 1:36eb173eb52b 211
recotana 1:36eb173eb52b 212 setTxLevel( &spref.gainData );
recotana 0:42adca80439c 213
recotana 1:36eb173eb52b 214 spref.lightsw=1;
recotana 1:36eb173eb52b 215 lightIlluminateChange(spref.lightsw);
recotana 1:36eb173eb52b 216
recotana 1:36eb173eb52b 217 spref.isSend=0;
recotana 1:36eb173eb52b 218 spref.continueusMode=0;
recotana 1:36eb173eb52b 219
recotana 1:36eb173eb52b 220
recotana 0:42adca80439c 221 sendedFrameNumber=0xffff;
recotana 0:42adca80439c 222 timer1_init();
recotana 0:42adca80439c 223
recotana 1:36eb173eb52b 224 // initPayload(&sendedPayload);
recotana 0:42adca80439c 225 }
recotana 0:42adca80439c 226
recotana 0:42adca80439c 227
recotana 1:36eb173eb52b 228
recotana 0:42adca80439c 229 void sendPayload(Payload *_payload){
recotana 0:42adca80439c 230
recotana 1:36eb173eb52b 231 #ifdef _SERVER_TEST_MODE_
recotana 1:36eb173eb52b 232 dumpPayload(_payload);
recotana 1:36eb173eb52b 233 #endif
recotana 0:42adca80439c 234
recotana 1:36eb173eb52b 235 makedata(_payload);
recotana 1:36eb173eb52b 236
recotana 1:36eb173eb52b 237 ledLightTx();
recotana 0:42adca80439c 238
recotana 1:36eb173eb52b 239 for(uint8_t i=0 ; i < kContSendNum ; i++){
recotana 1:36eb173eb52b 240 sendbuff();
recotana 1:36eb173eb52b 241 }
recotana 1:36eb173eb52b 242
recotana 1:36eb173eb52b 243 }
recotana 1:36eb173eb52b 244
recotana 1:36eb173eb52b 245 void makedata(Payload *_payload ){
recotana 1:36eb173eb52b 246
recotana 1:36eb173eb52b 247 uint16_t fNum= _payload->frame.message.frameNumber;
recotana 0:42adca80439c 248
recotana 1:36eb173eb52b 249 // printf("\n------------------- fnum:%0X\n",fNum);
recotana 1:36eb173eb52b 250 if( fNum != sendedFrameNumber ){
recotana 1:36eb173eb52b 251
recotana 1:36eb173eb52b 252 sendedFrameNumber = fNum;
recotana 0:42adca80439c 253
recotana 0:42adca80439c 254 memcpy(&sendedPayload,_payload,sizeof(Payload));
recotana 1:36eb173eb52b 255 sendedPayload.frame.message.sum = culcSum(&sendedPayload);
recotana 1:36eb173eb52b 256
recotana 1:36eb173eb52b 257 Payload tmp;
recotana 1:36eb173eb52b 258 memcpy(&tmp,&sendedPayload,sizeof(Payload));
recotana 1:36eb173eb52b 259
recotana 1:36eb173eb52b 260 Frame *frame=&tmp.frame;
recotana 1:36eb173eb52b 261
recotana 1:36eb173eb52b 262 payloadToNetwork(&tmp);
recotana 1:36eb173eb52b 263 // dumpPayload(&tmp);
recotana 0:42adca80439c 264
recotana 0:42adca80439c 265 uint16_t crc = 0xffff;
recotana 0:42adca80439c 266 uint8_t index=0;
recotana 0:42adca80439c 267
recotana 0:42adca80439c 268 //frame type
recotana 1:36eb173eb52b 269 buff[index]=tmp.ftype;
recotana 0:42adca80439c 270 crc = One_Byte_CRC16_Calc( crc , buff[index]);
recotana 0:42adca80439c 271
recotana 0:42adca80439c 272 index++;
recotana 1:36eb173eb52b 273 uint8_t *data=(uint8_t*)&frame->id;
recotana 0:42adca80439c 274
recotana 0:42adca80439c 275 //id
recotana 0:42adca80439c 276 for(int8_t i=15 ; 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 1:36eb173eb52b 281
recotana 0:42adca80439c 282 //message
recotana 1:36eb173eb52b 283 data=(uint8_t*)&frame->message;
recotana 0:42adca80439c 284 for(int8_t i=47 ; i>=0 ;i--){
recotana 1:36eb173eb52b 285 buff[index]=data[i];
recotana 0:42adca80439c 286 crc = One_Byte_CRC16_Calc( crc , buff[index]);
recotana 0:42adca80439c 287 index++;
recotana 0:42adca80439c 288 }
recotana 0:42adca80439c 289
recotana 0:42adca80439c 290 //CRC
recotana 0:42adca80439c 291 buff[index] =(uint8_t)(crc&0x00ff);
recotana 0:42adca80439c 292 index++;
recotana 0:42adca80439c 293 buff[index] =(uint8_t)(crc>>8);
recotana 0:42adca80439c 294
recotana 0:42adca80439c 295 }
recotana 0:42adca80439c 296
recotana 0:42adca80439c 297 }
recotana 0:42adca80439c 298
recotana 0:42adca80439c 299
recotana 1:36eb173eb52b 300 void sendComp(void){
recotana 1:36eb173eb52b 301 isSend=false;
recotana 0:42adca80439c 302 }
recotana 0:42adca80439c 303
recotana 1:36eb173eb52b 304 void sendbuff(void){
recotana 1:36eb173eb52b 305 if(isSend) return;
recotana 1:36eb173eb52b 306 // ledDevice();
recotana 1:36eb173eb52b 307
recotana 1:36eb173eb52b 308 isSend=true;
recotana 1:36eb173eb52b 309 preambleGenerator();
recotana 1:36eb173eb52b 310 for(uint16_t i=0 ; i<67 ; i++) sendByteData( buff[i] );
recotana 1:36eb173eb52b 311 isSend=false;
recotana 1:36eb173eb52b 312 }