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

Dependencies:   XBee mbed NetServicesMin

Committer:
recotana
Date:
Thu Mar 22 12:40:48 2012 +0000
Revision:
0:42adca80439c
Child:
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 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