if you send signal from pc to mbed ,mbed will send back analog data to pc

Dependencies:   mbed

main.cpp

Committer:
matsu
Date:
2012-12-05
Revision:
0:e7e366b4f7cd

File content as of revision 0:e7e366b4f7cd:

#include "mbed.h"

#define SENSOR_NUMBER 3

Serial device(USBTX, USBRX);  // tx, rx

DigitalOut myLed1(LED1);
DigitalOut myLed2(LED2);
DigitalOut myLed3(LED3);

AnalogIn ain1(p15);
AnalogIn ain2(p16);
AnalogIn ain3(p17);
AnalogIn ain4(p18);
AnalogIn ain5(p19);
AnalogIn ain6(p20);

I2C i2c(p9,p10);

void getInit(void);
void sendData(void);

typedef struct{
    int id;
    int analogNumber;
    int length;
}sensor_t;
sensor_t sensor[SENSOR_NUMBER];


int main() {
    device.baud(115200);
    /*
    i2c.frequency(40000);
    char cmd[6];
    char add[1];
    char init[2];
    add[0] = 0x01;
    init[0] = 0x2A;
    init[1] = 0x01;
    while(i2c.write(0x3A,init,2));
    */

    myLed1 = 0;
    myLed2 = 0;
    myLed3 = 0;    

    getInit();
    myLed1 = 1;
    sendData();

}


void getInit()
{
    int valueNumber = 0;
    int getValue = 0;
    int sensorCount = 0;
    int allSensorData = 1;
    
    while(1){
        if(device.readable()){
            valueNumber++;
            getValue = device.getc();
            switch(valueNumber){
            case 1:
                allSensorData = getValue;
                break;
            case 2:
                sensor[sensorCount/3].id = getValue;
                sensorCount++;
                break;
            case 3:
                sensor[(sensorCount-1)/3].analogNumber = getValue;
                sensorCount++;
                break;
            case 4:
                sensor[(sensorCount-2)/3].length = getValue;                
                sensorCount++;
                valueNumber = 1;
                break;
            } 
        }
        if(sensorCount > allSensorData-1)break;        
    }
}

void sendData()
{
    int valueNumber = 0;
    int id = 0;
    int getValue = 0;
    int checkSum = 0;
    int analogNumberTill = 0;
    int analogNumber = 0;
    char sendData[8];
    int analogData[10] = {0};

    while(1){
        if(device.readable()){
            valueNumber++;
            getValue = device.getc();                        
            switch(valueNumber){
                case 1: //get ID
                    id = getValue;
                    sendData[0] = id;
                    break;
                case 2:                     //get analog data
                    analogData[0] = ain1.read_u16();
                    analogData[1] = ain2.read_u16();
                    analogData[2] = ain3.read_u16();
                    analogData[3] = ain4.read_u16();
                    analogData[4] = ain5.read_u16();
                    analogData[5] = ain6.read_u16();

                    //calc which data to get
                    for(int i=0; i<id; i++){
                        analogNumberTill += sensor[i].analogNumber;
                    }
                    
                    if(getValue == 0xFE){
                        analogNumber = sensor[id].analogNumber;                        
                    }else{
                        analogNumber = 1;
                    }
                    
                    //analog data to send
                    for(int i=0; i<analogNumber; i++){
                        if(sensor[id].length == 2){
                             sendData[i*2+1] = analogData[i+analogNumberTill] >> 8;
                             sendData[i*2+2] = analogData[i+analogNumberTill] & 0xFF;
                        }else if(sensor[id].length == 1){
                             sendData[i+1] = analogData[i+analogNumberTill] & 0xFF;                        
                        }
                    }
                    
                    //senddata
                    for(int i=0; i < sensor[id].length*analogNumber+1; i++){
                        device.putc(sendData[i]);
                        checkSum += sendData[i];
                    }
                    device.putc(checkSum & 0xFF);
                    
                    checkSum = 0;
                    valueNumber = 0;
                    analogNumberTill = 0;
                    id = 0;
                    analogNumber = 0;
                    
                    break;
            }
        }
    }
}