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

Dependencies:   XBee mbed NetServicesMin

serial_process/serialRecieve.cpp

Committer:
recotana
Date:
2012-04-18
Revision:
2:dec6319cf02c
Parent:
1:36eb173eb52b

File content as of revision 2:dec6319cf02c:

#include "mbed.h"
#include "types.h"
#include "config.h"
#include "serialRecieve.h"
#include "data_models.h"
#include "layer_frame.h"
#include "leds.h"

extern Serial pc;

Payload payload;
uint8_t *payByte;
uint8_t payByteIndex;


uint16_t oldFrameNumber;

uint8_t rxBuff[256];
uint8_t rxBuffWindex;
uint8_t rxBuffRindex;

Timer timeout;
bool isFirstByte;

extern bool isSendContinueous;
extern PrefSender spref;

uint8_t serialRead(void){
    uint8_t data=rxBuff[rxBuffRindex];
    rxBuffRindex++;
    return data;
}
bool serialCheck(void){
    return (rxBuffWindex!=rxBuffRindex);
}

void serialFlush(void){
    rxBuffWindex=0;
    rxBuffRindex=0;
    LPC_UART0->FCR = (7 << 0);
    payByteIndex=0;
    isFirstByte=true;
}



void rxCallback(void){
     uint8_t data=pc.getc();
//     if(data==0x0A && rxBuff[rxBuffWindex-1]== 0x0D)  rxBuff[rxBuffWindex-1]=data; //LF escape
//     else 
     rxBuff[rxBuffWindex]=data;
     rxBuffWindex++;
     
     if(isFirstByte){
        timeout.reset();
        timeout.start();
       
     }
     else if(timeout.read_ms() > 50){
        serialFlush();        
        timeout.stop();
        timeout.reset();
        pc.printf("--------------timeout!!\r\n");
     }
     
}

void serialSendPayload(Payload *_payload){
    
    ledSerialTx();
    
    uint8_t *data = (uint8_t*)_payload;
    
    pc.printf("\r\n---return Send Payload data \r\n");
    
    for(uint8_t i=0 ; i<data[0] ; i++){
     pc.printf("%d:%02X ",i,data[i]);
     }
     
    pc.printf("\r\n---end\r\n");
}


void serialInit(void){

    pc.baud(115200);
    pc.attach(&rxCallback);
    pc.format(8, Serial::None, 1);
    serialFlush();
    
    payByte = (uint8_t*)&payload;
/*
    payByte[0]=sizeof(Payload);
    payByte[1]=0;
    
    payByte = (uint8_t*)&payload.ftype;
*/ 
    
    timeout.stop();
    timeout.reset();
}



void routing(Payload *_payload)
{
  
    switch(_payload->frame.message.command)
    {
        
        
        case SEND_SINGLE:
        {
            spref.continueusMode=0;
            #ifndef _SERVER_TEST_MODE_
            sendPayload(_payload);
            #else
            serialSendPayload(_payload);
            #endif

            DBGF("*******  single send!  *******\r\n");
            
        }
        break;
        
        case SEND_CONTINUEOUS:
        {
            spref.continueusMode=1;
            #ifndef _SERVER_TEST_MODE_
            sendPayload(_payload);
            #else
            serialSendPayload(_payload);
            #endif
            
            DBGF("*******  continueous send!  *******\r\n");
        }
        break;
        
        case SEND_CONT_STOP:
        {
            spref.continueusMode=0;
            memcpy(_payload->frame.message.data,&spref,sizeof(PrefSender));
            serialSendPayload(_payload);
            
            DBGF("*******  continueous stop!  *******\r\n");
        }
        break;
        
         case RECIEVE:
        {
            DBGF("******  recieve!  *******\r\n");
        }
        break;
        
        case PING:
        {   
            memcpy(_payload->frame.message.data,&spref,sizeof(PrefSender));
            _payload->frame.message.command=PING;
            _payload->frame.message.device=LED_SENDER;
            serialSendPayload(_payload);
            DBGF("*******  ping!  **************");
        }
        break;
        
        case SET_TX_GAIN:
        {
            spref.gainData.gain=_payload->frame.message.data[0];
            spref.gainData.middleLevel=_payload->frame.message.data[1];
            memcpy(_payload->frame.message.data,&spref,sizeof(PrefSender));
            setTxLevel(&spref.gainData);

            serialSendPayload(_payload);
            
            DBGV("*******   set tx gain:%d mid level:%d *******\r\n",spref.gainData.gain,spref.gainData.middleLevel);
        }
        break;
        
        case SET_LIGHT_CONTROL:
        {   
             spref.lightsw = _payload->frame.message.data[0];
             memcpy(_payload->frame.message.data,&spref,sizeof(PrefSender));
//             _payload->frame.message.device=LED_SENDER;
//             _payload->frame.message.command=SET_LIGHT_CONTROL;
             lightIlluminateChange(spref.lightsw);
            
            serialSendPayload(_payload);
            DBGV("*******  SET_LIGHT_CONTROL! %d **************", spref.lightsw);
        }
        break;
        
    }

}

void readProcess(void){


    if(!serialCheck()) return;
    
    ledSerialRx();
   
     payByte[payByteIndex]=serialRead();
     payByteIndex++;
    
    if(payByteIndex<(sizeof(Payload))) return;
    
    payByteIndex=0;

    ledSerialDataCmp();
    
     networkToPayload(&payload);
/*
    if( payload.frame.message.frameNumber == oldFrameNumber){
    
        DBGF("-------- same frame.. \r\n");
        return;   
     }
*/    
//    dumpPayload(&payload);

    


    routing(&payload);
    
    oldFrameNumber= payload.frame.message.frameNumber;

    
     DBGF("\r\n*******  tx send!  *******\r\n");
}