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

Dependencies:   XBee mbed NetServicesMin

frame_layer/layer_frame.cpp

Committer:
recotana
Date:
2012-03-22
Revision:
0:42adca80439c
Child:
1:36eb173eb52b

File content as of revision 0:42adca80439c:

#include "mbed.h"
#include "types.h"
#include "config.h"
#include "culc_crc16.h"
#include "layer_frame.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;

//Ticker carrierWave;
AnalogOut dac(p18);

void setTxLevel(uint8_t _gain , uint8_t _mid)
{
    
    
    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 <=77 )  {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)    dac = txMax;
    else                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                    dac=txMid;
    }
    break;
    
    case 2:
    {
        if( (pulseCounter > 6)&(pulseCounter <= 12) )  pulseGenerator();
        else                                            dac=txMid;
    }
    break;
    
    case 1:
    {
        if( (pulseCounter > 12)&(pulseCounter <= 18) )  pulseGenerator();
        else                    dac=txMid;
    }
    break;
    
    case 3:
    {
        if( (pulseCounter > 18)&(pulseCounter <= 24 ))  pulseGenerator();
        else                    dac=txMid;
    }
    break;
    
    case 4:
    {
        if( pulseCounter <= 18) pulseGenerator();
        else                    dac=txMid;
    }
    break;

 }
 
    
}


 void initCarrierWave(){
    dac = kDAC_OFF;

    pulseCounter=0;
    symbolCode = 0;
    pulseState = -1;
    
    setTxLevel( kTxGain , kTxMidLevel );
    
    isSend=false;
    isSendContinueous=false;
    sendedFrameNumber=0xffff;
    timer1_init();
   
   initPayload(&sendedPayload);
}


void sendPayload(Payload *_payload){

    if(isSend) return;
    
    Frame *frame=&_payload->frame;
    
    if( frame->message.frameNumber != sendedFrameNumber ){
    
        sendedFrameNumber = frame->message.frameNumber;
        
        memcpy(&sendedPayload,_payload,sizeof(Payload));
         
        uint16_t crc = 0xffff;   
        uint8_t index=0;
    
        //frame type
        buff[index]=_payload->ftype;
        crc = One_Byte_CRC16_Calc( crc , buff[index]);
    
        index++;
        uint8_t *tmp=(uint8_t*)&frame->id;
        
        //id
        for(int8_t i=15 ; i>=0 ;i--){
            buff[index]=tmp[i];
            crc = One_Byte_CRC16_Calc( crc , buff[index]);
            index++;
        }
        
        //message
        tmp=(uint8_t*)&frame->message;
        for(int8_t i=47 ; i>=0 ;i--){
            buff[index]=tmp[i];
            crc = One_Byte_CRC16_Calc( crc , buff[index]);
            index++;
        }
   
        //CRC
        buff[index] =(uint8_t)(crc&0x00ff);
        index++;
        buff[index] =(uint8_t)(crc>>8);
      
        }
//    for(int i=0;i<67;i++) printf("%02X ",buff[i]);
//    printf("\r\n");
    ledDevice();
   
    for(uint8_t i=0 ; i<kContSendNum ; i++) 
    {
        preambleGenerator();
        
        for(uint16_t i=0 ; i<67 ; i++) sendByteData( buff[i] );
//        printf("\r\n+++++++++\r\n");
    }
    
    isSend=false;

}


void swapPayloadData(Payload *_payload)
{
     uint8_t *org=(uint8_t*)_payload;
     uint8_t *tmp=(uint8_t*)&sendedPayload;

     uint8_t i;
     for(i=0 ; i<16 ;i++) tmp[i+2]=org[17-i];
     for(i=0 ; i<48 ;i++) tmp[i+18]=org[65-i];
}