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

Dependencies:   XBee mbed NetServicesMin

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?

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 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 }