test

Dependencies:   MODDMA MODSERIAL mbed

Fork of IRIS_MBED by IRIS

main.cpp

Committer:
JonathanAshworth
Date:
2015-03-26
Revision:
5:d0b2b4d8b9ba
Parent:
4:1017848d2fe1
Child:
6:8ffc6d3a7c1d

File content as of revision 5:d0b2b4d8b9ba:

#include "mbed.h"
#include "main.h"
#include "MODDMA/MODDMA.h"
#include "MODSERIAL/MODSERIAL.h"
#include "botHandler/botStateHandler.h"

// *** For development only ***
#define PC_TEST_REQUEST_1 "0,1.01,1,600"
#define PC_TEST_REQUEST_2 "0,1.01,1,2300"
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
// ****************************

#define PC_TX_BUFFER_SIZE 1024
#define PC_RX_BUFFER_SIZE 1024
#define PC_TX_PIN USBTX     //Serial tx
#define PC_RX_PIN USBRX     //Serial rx
#define PC_TIMEOUT_MESSAGE "MBED detected a timeout - eStop!"
#define PC_TERMINATION_BYTE0 0xef //0xcd //Packet termination sequence
#define PC_TERMINATION_BYTE1 0xff //0xcc
#define PC_TERMINATION_BYTE2 0xff //0x8c
#define PC_TERMINATION_BYTE3 0xff //0xbf

#define SSC32_TX_BUFFER_SIZE 512
#define SSC32_RX_BUFFER_SIZE 512
#define SSC32_TX_PIN p13    //Serial tx
#define SSC32_RX_PIN p14    //Serial rx

#define GPS_TX_BUFFER_SIZE 512
#define GPS_RX_BUFFER_SIZE 512
#define GPS_TX_PIN p28  //Serial tx
#define GPS_RX_PIN p27  //Serial rx

/* XBEES NOT INCLUDED IN SOLUTION (Recommend a pro version with I2C support)
#define XBEE_TX_BUFFER_SIZE 512
#define XBEE_RX_BUFFER_SIZE 512
#define XBEE_TX_PIN 0   //PIN UNALLOCATED
#define XBEE_RX_PIN 0   //PIN UNALLOCATED
*/

#define ULTRASOUND_TRIGGER_PIN p11//Digital out
#define ULTRASOUND_ECHO_PIN p12     //Digital (PWM) in (from mux common)
#define BATTERY_VOLTAGE_PIN p16     //Analogue in
#define BATTERY_CURRENT_PIN p15     //Analogue in
#define MUX_D0_PIN p5           //Digital out
#define MUX_D1_PIN p6           //Digital out
#define MUX_D2_PIN p7           //Digital out
#define MUX_D3_PIN p8           //Digital out
#define I2C_SDA p9              //I2C data line
#define I2C_SCL p10             //I2C clock line
#define PIR_PIN p20             //Digital in
#define DRIVE_NS_PIN p21    //PWM out
#define DRIVE_OS_PIN p22    //PWM out
 
MODSERIAL PCSerial(PC_TX_PIN, PC_RX_PIN, PC_TX_BUFFER_SIZE, PC_RX_BUFFER_SIZE);
MODSERIAL SSC32Serial(SSC32_TX_PIN, SSC32_RX_PIN, SSC32_TX_BUFFER_SIZE, SSC32_RX_BUFFER_SIZE);
MODSERIAL GPSSerial(GPS_TX_PIN, GPS_RX_PIN, GPS_TX_BUFFER_SIZE, GPS_RX_BUFFER_SIZE);
MODDMA dma;

Flags flags;

Timer PCTimeoutTimer;

Servo armBase;
Servo armShoulder;
Servo armElbow;
Servo armWrist;
Servo armManipulator;
Servo visionPitch;
Servo visionYaw;

DriveMotor driveNearside;
DriveMotor driveOffside;

AccelerometerSensor accelerometer;
GyroSensor gyro;
MagnetometerSensor magnetometer;

GPSSensor gps;

TemperatureSensor temperature;
HumiditySensor humidity;

BatteryVoltageSensor batteryVoltage;
BatteryCurrentSensor batteryCurrent;

PIRSensor PIR;

UltrasoundSensor ultrasound1 , ultrasound2, ultrasound3, ultrasound4, ultrasound5, 
                                    ultrasound6, ultrasound7, ultrasound8, ultrasound9, ultrasound10;

botStateHandler botData;

void *childIDLookup[30];

char PCRxData[PC_RX_BUFFER_SIZE] = {0}; //Complete PC requests (termination detected)
char incommingPCRxData[PC_RX_BUFFER_SIZE] = {0};    //Used to temp store incomming PC bytes

char incommingPCRxDataCount = 0;
char PCRxTerminationCount = 0;

int main(void) {
    
    //((Servo*)childIDLookup[0])->channel = 0;
    
    initialise();
    
    while(1) {
        /*SSC32Serial.printf("#0 P1500 T50 \r");
        
        wait_ms(1000);
        
        SSC32Serial.printf("#0 P600 T25 \r");
        
        wait_ms(1000);
        
        SSC32Serial.printf("#0 P2300 T500 \r");
        
        wait_ms(1000);*/
        //LPC_TIM2->TCR = 0x02;
        if (PCTimeoutTimer.read_ms() > 100) {
            flags.PCTimeout = 1;
            GPSSerial.printf("Idle timeout\n");
        }
        if (flags.PCTimeout == 1) {
            PCTimeout();
        }
        if (flags.rxNewData == 1) {
            sendSerialData();
            flags.rxNewData = 0;
        }
    }
}

void initialise(void) {
    
    //wait_ms(10000);
    
    PCSerial.baud(115200);
    PCSerial.attach(&dmaPCSerialRx, MODSERIAL::RxIrq);
    SSC32Serial.baud(115200);
    //SSC32Serial.attach(&dmaSSC32SerialRx, MODSERIAL::RxIrq);
    GPSSerial.baud(115200);
    //GPSSerial.attach(&dmaGPSSerialRx, MODSERIAL::RxIrq);
    
    PCTimeoutTimer.stop();
    PCTimeoutTimer.reset();
    
    //PCTimeoutTimer.attach(&PCTimeout, 0.1);
    //LPC_TIM2->TCR = 0x00; //Stop timer
    //LPC_TIM2->TCR = 0x02; //Reset timer
    
    /*LPC_SC->PCONP |= 1 << 1; //Power up Timer 0
    LPC_SC->PCLKSEL0 |= 1 << 2; // Clock for timer = CCLK
    LPC_TIM0->MR0 = 1 << 23; // Give a value suitable for the LED blinking frequency based on the clock frequency
    LPC_TIM0->MCR |= 1 << 0; // Interrupt on Match0 compare
    LPC_TIM0->MCR |= 1 << 1; // Reset timer on Match 0.
    LPC_TIM0->TCR |= 1 << 1; // Manually Reset Timer0 ( forced )
    LPC_TIM0->TCR &= ~(1 << 1); // stop resetting the timer.
    NVIC_EnableIRQ(TIMER0_IRQn); // Enable timer interrupt
    LPC_TIM0->TCR |= 1 << 0; // Start timer
    */
    NVIC_SetPriority(DMA_IRQn, 1);
    NVIC_SetPriority(USB_IRQn, 1);
    //NVIC_SetPriority(dmaGPSSerial, 2);
    //NVIC_SetPriority(dmaSSC32Serial, 3);
    NVIC_SetPriority(RIT_IRQn, 1);
    NVIC_SetPriority(TIMER0_IRQn, 0);
  NVIC_SetPriority(TIMER1_IRQn, 0);
  NVIC_SetPriority(TIMER2_IRQn, 0);
  NVIC_SetPriority(TIMER3_IRQn, 0);
    //NVIC_SetPriority(timer, 0);
    
    armBase.channel = 0;
    armShoulder.channel = 1;
    armElbow.channel = 2;
    armWrist.channel = 3;
    armManipulator.channel = 4;
    visionPitch.channel = 5;
    visionYaw.channel = 6;
    
    childIDLookup[0] = &armBase;                    // 1.01
    childIDLookup[1] = &ultrasound1;            // 1.02
    childIDLookup[2] = &armShoulder;            // 1.02
    childIDLookup[3] = &armElbow;                   // 1.03
    childIDLookup[4] = &armWrist;               // 1.04
    childIDLookup[5] = &armManipulator;     // 1.05
    childIDLookup[6] = &visionPitch;            // 1.06
    childIDLookup[7] = &visionYaw;              // 1.07
    childIDLookup[8] = &driveNearside;      // 1.08
    childIDLookup[9] = &driveOffside;           // 1.09
    childIDLookup[10] = 0;                              // 1.10 RESERVED
    childIDLookup[11] = &accelerometer;     // 1.11
    childIDLookup[12] = &gyro;                      // 1.12
    childIDLookup[13] = &magnetometer;      // 1.13
    childIDLookup[14] = &gps;                           // 1.14
    childIDLookup[15] = &temperature;           // 1.15
    childIDLookup[16] = &humidity;              // 1.16
    childIDLookup[17] = &batteryVoltage;    // 1.17
    childIDLookup[18] = &batteryCurrent;    // 1.18
    childIDLookup[19] = &PIR;                           // 1.19
    childIDLookup[20] = &ultrasound1;           // 1.20
    childIDLookup[21] = &ultrasound2;           // 1.21
    childIDLookup[22] = &ultrasound3;           // 1.22
    childIDLookup[23] = &ultrasound4;           // 1.23
    childIDLookup[24] = &ultrasound5;           // 1.24
    childIDLookup[25] = &ultrasound6;           // 1.25
    childIDLookup[26] = &ultrasound7;           // 1.26
    childIDLookup[27] = &ultrasound8;           // 1.27
    childIDLookup[28] = &ultrasound9;           // 1.28
    childIDLookup[29] = &ultrasound10;      // 1.29 
    
    getServoData(&armBase);
    getServoData(&armShoulder);
    getServoData(&armElbow);
    getServoData(&armWrist);
    getServoData(&armManipulator);
    getServoData(&visionPitch);
    getServoData(&visionYaw);
    
    GPSSerial.printf("hi");
    
}

void getServoData(Servo *servo) {
    SSC32Serial.printf("QP %d\r", servo->channel);
    int temp = 1;
    //read reply
    //convert char to int
    servo->position = temp;
}

void readUltrasound(UltrasoundSensor *sensor) {
    //Set Mux to sensor->muxChannel
    //Pulse trigger pin
    //Disable interrupts
    //Read PWM on echo pin
    //Enable interrupts
    //sensor->distanceMillimeters = result;
}

void validateRequest(void) {
    /*
    
    BYTE 0 = CID = 0 ONLY
    BYTE 1 = COMMA ONLY
    BYTE 2 = SID = 1 | 1.01 upto 1.30
    BYTE 3 = COMMA ONLY
    BYTE 4 = FC = 1 upto 30
    BYTE 5 = COMMA ONLY
    
    
    */
}

void parseRequestData(char *request) {
    /*
    
    requestedSensorIDs[512] = {0};
    
    char posArr[4];
    char spdArr[4];
    char timArr[4];
    
    CID = request[0];               // Byte 0       Read CID 
    SID = request[1];               // Byte 1       Read SID
    fieldCount = request[2]; // Byte 2      Read Field Count
    
    If CID != 0
        return; // Leave as I'm only listening to the PC
    
    If SID == 0
        return; // Leave as that message is for the PC
    
    If SID == 1 {
        Get ready to pump out sensor data
        for (i=0; i++; i<fieldCount) {
            requestedSensorIDs[i] = request[3+i];
        }
    }
    
    If (SID > 1) && (SID < 0x09) { //We're writing to a servo
        for (i=0; i<3; i++) {
            posArr[i] = request[3+i]; //byte 3, 4, 5 & 6
            spdArr[i] = request[7+i]; //byte 7, 8, 9 & 10
            timArr[i] = request[11+i]; //byte 11, 12, 13 & 14
        }
        position = (float)posArr;
        speed = (float)spdArr;
        time =(float)timArr;
        if ((position > 600)&&(position < 2300)&&(speed > -1)&&(time > -1)) {
            SSC32Serial.printf("#%d P%d S%d T%d \r", SID-2, position, speed, time); //Set servo
            botData.setVal(SID, 0, &position); //update botData with new value
            botData.setVal(SID, 1, &speed);
            botData.setVal(SID, 2, &time);
        }
        else {
            led4 = 1; //indicate an invalid data warning
        }
    }
    return;
    */
}

void PCTimeout(void) {
__disable_irq();
    PCSerial.printf(PC_TIMEOUT_MESSAGE);
    GPSSerial.printf(PC_TIMEOUT_MESSAGE);
    led1 = 1;
    led2 = flags.rxNewData;
    led3 = flags.txSentData;
    while(1);
}

void timerISR(void) {
    // Priority 0
    // Fires when timer gets to 110ms
    //LPC_TIM2->TCR = 0x00; //Stop timer
    flags.PCTimeout = 1; // Set timeout flag
    // Leave
}

void dmaPCSerialRx(MODSERIAL_IRQ_INFO *q) {
    /*
    
    Priority 1
    
    Start timer
    If timer is < 100ms
        Copy dma buffer into local buffer
        Look for termination in local buffer
            If found then stop/reset/(start again once ive sent) timer and set new data flag
            Else leave isr
    Else report timeout and leave
     
    LPC_TIM2->TCR = 0x01; //Start timer
    LPC_TIM2->TCR = 0x00; //Stop timer
    LPC_TIM2->TCR = 0x02; //Reset timer
    */
    
    MODSERIAL *serial = q->serial; //Define local serial class
    if (flags.txSentData == 1) {
        PCTimeoutTimer.stop();
        PCTimeoutTimer.reset();
        flags.txSentData = 0;
    }
    PCTimeoutTimer.start();
    
    
    //LPC_TIM2->TCR = 0x01; //Start timer
    if (PCTimeoutTimer.read_ms() < 100) {
        incommingPCRxData[incommingPCRxDataCount] = serial->getc();
        GPSSerial.putc(incommingPCRxData[incommingPCRxDataCount]);
        if (incommingPCRxDataCount > 2) {
            if ((incommingPCRxData[incommingPCRxDataCount-3] == (char)PC_TERMINATION_BYTE0) &&
                    (incommingPCRxData[incommingPCRxDataCount-2] == (char)PC_TERMINATION_BYTE1) &&
                    (incommingPCRxData[incommingPCRxDataCount-1] == (char)PC_TERMINATION_BYTE2) &&
                    (incommingPCRxData[incommingPCRxDataCount] == (char)PC_TERMINATION_BYTE3)) {
                //LPC_TIM2->TCR = 0x00; //Stop timer
                //LPC_TIM2->TCR = 0x02; //Reset timer
                memset(PCRxData, 0, PC_RX_BUFFER_SIZE); //reset rx buffer
                memcpy(PCRxData, incommingPCRxData, PC_RX_BUFFER_SIZE); //PCRxData = incommingPCRxData;
                memset(incommingPCRxData, 0, PC_RX_BUFFER_SIZE); //reset rx buffer
                incommingPCRxDataCount = 0;
                flags.rxNewData = 1;
                PCTimeoutTimer.stop();
                PCTimeoutTimer.reset();
                        GPSSerial.printf("\nReceived a termination\n");
            }
            else {
                incommingPCRxDataCount++;
            }
        }
        else {
            incommingPCRxDataCount++;
        }
    }
    else {
        flags.PCTimeout = 1;
        GPSSerial.printf("Rx timeout\n");
        PCTimeoutTimer.stop();
        PCTimeoutTimer.reset();
    }   
    
    /* //code for a \n termination
    
    if (PCTimeoutTimer.read_ms() < 100) {
        incommingPCRxData[incommingPCRxDataCount] = serial->getc();
        if (incommingPCRxData[incommingPCRxDataCount] == 0x0A) {
            PCRxTerminationCount++;
            if (PCRxTerminationCount == 4) {
                //LPC_TIM2->TCR = 0x00; //Stop timer
                //LPC_TIM2->TCR = 0x02; //Reset timer
                memset(PCRxData, 0, PC_RX_BUFFER_SIZE); //reset rx buffer
                memcpy(PCRxData, incommingPCRxData, incommingPCRxDataCount); //PCRxData = incommingPCRxData;
                incommingPCRxDataCount = 0;
                PCRxTerminationCount = 0;
                flags.rxNewData = 1;
                PCTimeoutTimer.stop();
                PCTimeoutTimer.reset();
            }
        }
        incommingPCRxDataCount++;
    }
    else {
        flags.PCTimeout = 1;
        PCTimeoutTimer.stop();
        PCTimeoutTimer.reset();
    }   */
}

void sendSerialData(void) {
    int i = 0;
    bool terminated = 0;
    //PCSerial.printf(PCRxData);
    for (i=0; i<PC_RX_BUFFER_SIZE; i++) {
        if (    (PCRxData[i-4] == (char)PC_TERMINATION_BYTE0) &&
                    (PCRxData[i-3] == (char)PC_TERMINATION_BYTE1) &&
                    (PCRxData[i-2] == (char)PC_TERMINATION_BYTE2) &&
                    (PCRxData[i-1] == (char)PC_TERMINATION_BYTE3)) {
                        terminated = 1;
        }
        if (!terminated) {
            PCSerial.putc(PCRxData[i]);
        }
    }
    terminated = 0;
    GPSSerial.printf("Echoed back...\n");
    for (i=0; i<PC_RX_BUFFER_SIZE; i++) {
        if (    (PCRxData[i-4] == (char)PC_TERMINATION_BYTE0) &&
                    (PCRxData[i-3] == (char)PC_TERMINATION_BYTE1) &&
                    (PCRxData[i-2] == (char)PC_TERMINATION_BYTE2) &&
                    (PCRxData[i-1] == (char)PC_TERMINATION_BYTE3)) {
                        terminated = 1;
        }
        if (!terminated) {
            GPSSerial.putc(PCRxData[i]);
        }
    }
    GPSSerial.printf("...Echo end\n");
    PCTimeoutTimer.stop(); // precautionary - done after receiving
    PCTimeoutTimer.reset(); // precautionary - done after receiving
    //GPSSerial.printf(PCRxData);
    flags.txSentData = 1;
    PCTimeoutTimer.start();
    //LPC_TIM2->TCR = 0x01; //Start timer
}

void dmaSSC32SerialRx(MODSERIAL_IRQ_INFO *q) {
    
}

void dmaGPSSerialRx(MODSERIAL_IRQ_INFO *q) {
    
}