テストモード追加、LED有効化 left -> SerialRX, Data Recieve Complete , Serial Tx , Light Tx
Dependencies: XBee mbed NetServicesMin
frame_layer/layer_frame.cpp
- Committer:
- recotana
- Date:
- 2012-04-15
- Revision:
- 1:36eb173eb52b
- Parent:
- 0:42adca80439c
- Child:
- 2:dec6319cf02c
File content as of revision 1:36eb173eb52b:
#include "mbed.h" #include "types.h" #include "config.h" #include "culc_crc16.h" #include "layer_frame.h" #include "data_models.h" #include "leds.h" #include "serialRecieve.h" volatile int symbolCode; volatile int pulseCounter; volatile int pulseState; volatile bool isSend; volatile bool isSendContinueous; volatile bool isSendContinued; Payload sendedPayload; uint16_t sendedFrameNumber; volatile uint8_t buff[70]; volatile uint8_t buffIndex; volatile float txMax; volatile float txMin; volatile float txMid; AnalogOut dac(p18); DigitalOut lightPowerOn(p8); DigitalOut out(p19); extern PrefSender spref; void lightIlluminateChange(uint8_t _sw){ if(_sw == 0){ lightPowerOn=0; } else{ lightPowerOn=1; } } void setTxLevel(TxGainData *_data) { uint8_t _gain = _data->gain; uint8_t _mid = _data->middleLevel; if( (_mid > 10) || (_mid <1) ) return; if(_gain > 10) return; if(_gain == 0){ txMax = 0; txMin = 0; txMid = 0; return; } float g = (float)_gain*0.1; float mid = (float)_mid*0.1; txMax = kDAC_GAIN_MAX * g; txMin = kDAC_GAIN_MIN * g; txMid = mid * g; } void timer1_init(void) { LPC_SC->PCLKSEL0 &= ~(3UL << 4); //clear bits 96MHz LPC_SC->PCLKSEL0 |= (1UL << 4); //set bit LPC_SC->PCONP |=1 << 2; //timer1 power on LPC_TIM1->MR0 = kTImerCount; //1/96MHz = 0.010416666 us :( 1/(0.010416666 us * 1667) * 2) = 28.794kHz LPC_TIM1->MCR = 3; //interrupt and reset control //3 = Interrupt & reset timer1 on match //1 = Interrupt only, no reset of timer1 // NVIC_EnableIRQ(TIMER1_IRQn); //enable timer1 interrupt // LPC_TIM1->TCR = 1; //enable Timer1 enableTimer(); } void enableTimer(void) { LPC_TIM1->MR0 = kTImerCount; NVIC_EnableIRQ(TIMER1_IRQn); LPC_TIM1->TCR = 1; //enable Timer1 } void disableTimer(void) { NVIC_DisableIRQ(TIMER1_IRQn); LPC_TIM1->TCR = 0; //disable Timer1 } void preambleGenerator(){ symbolCode = 4; while( pulseCounter <=96 ) {readProcess();} pulseCounter = 0; } void sendByteData(uint8_t _data){ // printf("%02X ",_data); pulseCounter = 0; symbolCode = (_data & 0x03); while( pulseCounter < 24 ) {readProcess();} pulseCounter = 0; symbolCode = ( (_data & 0x0C ) >> 2); while( pulseCounter < 24 ) {readProcess();} pulseCounter = 0; symbolCode = ( (_data & 0x30 ) >> 4); while( pulseCounter < 24 ) {readProcess();} pulseCounter = 0; symbolCode = ( (_data & 0xC0 ) >> 6); while( pulseCounter < 24 ){readProcess();} pulseCounter = 0; } void pulseGenerator(){ if(pulseState == -1) pulseState = 1; else pulseState = -1; if(pulseState<0) { out = 1; dac = txMax; } else { out = 0; dac = txMin; } } extern "C" void TIMER1_IRQHandler (void) { if((LPC_TIM1->IR & 0x01) != 0x01) return; // if MR0 interrupt, proceed LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt flag pulseCounter++; switch(symbolCode){ case 0: { if( pulseCounter <= 6) pulseGenerator(); else { out = 0; dac=txMid;} } break; case 2: { if( (pulseCounter > 6)&(pulseCounter <= 12) ) pulseGenerator(); else { out = 0; dac=txMid;} } break; case 1: { if( (pulseCounter > 12)&(pulseCounter <= 18) ) pulseGenerator(); else { out = 0; dac=txMid;} } break; case 3: { if( (pulseCounter > 18)&(pulseCounter <= 24 )) pulseGenerator(); else { out = 0; dac=txMid;} } break; case 4: { // if( pulseCounter <= 18 ) pulseGenerator(); if( (pulseCounter > 18) & (pulseCounter <= 36) ) pulseGenerator(); else { out = 0; dac=txMid;} } break; } } void initCarrierWave(){ dac = kDAC_OFF; out=0; pulseCounter=0; symbolCode = 0; pulseState = -1; spref.gainData.gain = kTxGain; spref.gainData.middleLevel = kTxMidLevel; setTxLevel( &spref.gainData ); spref.lightsw=1; lightIlluminateChange(spref.lightsw); spref.isSend=0; spref.continueusMode=0; sendedFrameNumber=0xffff; timer1_init(); // initPayload(&sendedPayload); } void sendPayload(Payload *_payload){ #ifdef _SERVER_TEST_MODE_ dumpPayload(_payload); #endif makedata(_payload); ledLightTx(); for(uint8_t i=0 ; i < kContSendNum ; i++){ sendbuff(); } } void makedata(Payload *_payload ){ uint16_t fNum= _payload->frame.message.frameNumber; // printf("\n------------------- fnum:%0X\n",fNum); if( fNum != sendedFrameNumber ){ sendedFrameNumber = fNum; memcpy(&sendedPayload,_payload,sizeof(Payload)); sendedPayload.frame.message.sum = culcSum(&sendedPayload); Payload tmp; memcpy(&tmp,&sendedPayload,sizeof(Payload)); Frame *frame=&tmp.frame; payloadToNetwork(&tmp); // dumpPayload(&tmp); uint16_t crc = 0xffff; uint8_t index=0; //frame type buff[index]=tmp.ftype; crc = One_Byte_CRC16_Calc( crc , buff[index]); index++; uint8_t *data=(uint8_t*)&frame->id; //id for(int8_t i=15 ; i>=0 ;i--){ buff[index]=data[i]; crc = One_Byte_CRC16_Calc( crc , buff[index]); index++; } //message data=(uint8_t*)&frame->message; for(int8_t i=47 ; i>=0 ;i--){ buff[index]=data[i]; crc = One_Byte_CRC16_Calc( crc , buff[index]); index++; } //CRC buff[index] =(uint8_t)(crc&0x00ff); index++; buff[index] =(uint8_t)(crc>>8); } } void sendComp(void){ isSend=false; } void sendbuff(void){ if(isSend) return; // ledDevice(); isSend=true; preambleGenerator(); for(uint16_t i=0 ; i<67 ; i++) sendByteData( buff[i] ); isSend=false; }