test

Dependencies:   MODDMA MODSERIAL mbed

Fork of IRIS_MBED by IRIS

Revision:
4:1017848d2fe1
Parent:
3:074db974b47a
Child:
5:d0b2b4d8b9ba
diff -r 074db974b47a -r 1017848d2fe1 main.cpp
--- a/main.cpp	Mon Mar 16 15:38:37 2015 +0000
+++ b/main.cpp	Thu Mar 26 12:02:10 2015 +0000
@@ -1,196 +1,416 @@
 #include "mbed.h"
 #include "main.h"
-#include "RIT.h"
+#include "MODDMA.h"
+#include "MODSERIAL.h"
+#include "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);
+// ****************************
+
+#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 0x0a//0xcd //Packet termination sequence
+#define PC_TERMINATION_BYTE1 0x0a//0xcc
+#define PC_TERMINATION_BYTE2 0x0a//0x8c
+#define PC_TERMINATION_BYTE3 0x0a//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 TIMEOUT_MESSAGE "MBED detected a timeout - eStop!\n\n\n\n"
-#define USB_BUFFER_SIZE 1024
+#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
  
-Serial serial(USBTX, USBRX);
-Timer usbTimer;
-RIT usbRIT(110);
+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;
 
-char txBuffer[USB_BUFFER_SIZE] = {0};
-char rxBuffer[USB_BUFFER_SIZE] = {0};
+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) {
- 
-    flags.rxNewData = 0;
-    flags.txSentData = 0;
-    flags.usbTimeout = 0;
-    
-    serial.baud(115200);
-    
-    //NVIC_SetPriority(TIMER3_IRQn, 1);//priority 1
-    //NVIC_SetPriority(USB_IRQn, 2);//priority 2
-    
-    NVIC_SetPriority( NonMaskableInt_IRQn, 100 ); 
-    NVIC_SetPriority(MemoryManagement_IRQn, 100);
-    
-    NVIC_SetPriority(BusFault_IRQn, 100);
-    NVIC_SetPriority(UsageFault_IRQn, 100);
-    NVIC_SetPriority(SVCall_IRQn, 100);
-    NVIC_SetPriority(DebugMonitor_IRQn, 100);
-    NVIC_SetPriority(PendSV_IRQn, 100);
-    NVIC_SetPriority(SysTick_IRQn, 50);
-    NVIC_SetPriority(WDT_IRQn, 100);
-    NVIC_SetPriority(TIMER0_IRQn, 85);
-    NVIC_SetPriority(TIMER1_IRQn, 85);
-    NVIC_SetPriority(TIMER2_IRQn, 85);
-    NVIC_SetPriority(TIMER3_IRQn, 85);
-    NVIC_SetPriority(UART0_IRQn, 100);
-    NVIC_SetPriority(UART1_IRQn, 100);
-    NVIC_SetPriority(UART2_IRQn, 100);
-    NVIC_SetPriority(UART3_IRQn, 100);
     
-    NVIC_SetPriority(PWM1_IRQn, 100);
-    NVIC_SetPriority(I2C0_IRQn, 100);
-    NVIC_SetPriority(I2C1_IRQn, 100);
-    NVIC_SetPriority(I2C2_IRQn, 100);
-    NVIC_SetPriority(SPI_IRQn, 100);
-    NVIC_SetPriority(SSP0_IRQn, 100);
-    NVIC_SetPriority(SSP1_IRQn, 100);
-    NVIC_SetPriority(PLL0_IRQn, 100);
-    NVIC_SetPriority(RTC_IRQn, 100);
-    NVIC_SetPriority(EINT0_IRQn, 100);
-    NVIC_SetPriority(EINT1_IRQn, 100);
+    //((Servo*)childIDLookup[0])->channel = 0;
     
-    NVIC_SetPriority(EINT2_IRQn, 100);
-    NVIC_SetPriority(EINT3_IRQn, 100);
-    NVIC_SetPriority(ADC_IRQn, 100);
-    NVIC_SetPriority(BOD_IRQn, 100);
-    NVIC_SetPriority(USB_IRQn, 100);
-    NVIC_SetPriority(CAN_IRQn, 100);
-    NVIC_SetPriority(DMA_IRQn, 100);
-    
-    NVIC_SetPriority(I2S_IRQn, 100);
-    NVIC_SetPriority(ENET_IRQn, 100);
-    NVIC_SetPriority(RIT_IRQn, 1);
-    NVIC_SetPriority(MCPWM_IRQn, 100);
-    NVIC_SetPriority(QEI_IRQn, 100);
-    NVIC_SetPriority(PLL1_IRQn, 100);
-    
-    serial.attach(&serialRx_ISR, Serial::RxIrq);
-    usbRIT.append(&usbTimer_ISR);
-    usbRIT.disable();
-    
-    char responseData[USB_BUFFER_SIZE] = {0};
-    char requestData[USB_BUFFER_SIZE] = {0};
-    
-    //LPC_TIMER3->;
-    
-    //setup ISRs
+    initialise();
     
     while(1) {
-        if (flags.usbTimeout) {
-            usbTimeout();
+        /*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;
+            led2 = 1;
         }
-        if (flags.rxNewData) {
-            memcpy(requestData, rxBuffer, USB_BUFFER_SIZE); //requestData = rxBuffer;
-            memset(rxBuffer, 0, USB_BUFFER_SIZE); //reset rx buffer
-                
-            //deconstruct and validate request
-            
-            //construct response:
-            memcpy(responseData, requestData, USB_BUFFER_SIZE); //just echo request back for now
-                
-            memcpy(txBuffer, responseData, USB_BUFFER_SIZE); //txBuffer = responseData;
-            
-            serialTx();
-            
+        if (flags.PCTimeout == 1) {
+            PCTimeout();
+        }
+        if (flags.rxNewData == 1) {
+            sendSerialData();
             flags.rxNewData = 0;
         }
     }
 }
 
-void serialTx (void) {
-__disable_irq();
-    char buffPntr;
-    bool terminated = 0;
-    for(buffPntr=0; buffPntr<4; buffPntr++) {
-        serial.putc(txBuffer[buffPntr]);
-    }
-    while ((!terminated)&&(buffPntr != USB_BUFFER_SIZE-1)) {
-        if ((txBuffer[buffPntr-3] == 0x0A)&&(txBuffer[buffPntr-2] == 0x0A)&&(txBuffer[buffPntr-1] == 0x0A)&&(txBuffer[buffPntr] == 0x0A)) {
-            terminated = 1;
-        }
-        else {
-            serial.putc(txBuffer[buffPntr]);
-        }
-        buffPntr++;
-    }
-    //send data from tx buffer
-    memset(txBuffer, 0, USB_BUFFER_SIZE); //reset tx buffer
-    flags.txSentData = 1;
-__enable_irq();
+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);
+    
 }
 
-void usbTimeout(void) {
-    memcpy(txBuffer, TIMEOUT_MESSAGE, USB_BUFFER_SIZE); //send eStop over usb serial
-    serialTx();
-    shutdown();
-__disable_irq();
-    while(1) {;} //remain here until hardware reset 
+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 shutdown(void) {
-    //turn off each peripheral safely
+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(void) {
+    /*
+    
+    1) Check CID is 0
+    2) Check for comma
+    3) Read SID and decide where to go next
+    4) Check for comma
+    5) Check for line termination
+    5) Check for window termination
+        If not present then repeat sequence
+        If present then update variables with new data and return
+    
+    Servo:
+    1) Figure out which servo has been requested
+    2) Read and validate position data
+    3) Read and validate speed data
+    4) Read and validate time data
+        
+    Drive:
+    1) Figure out which motor has been requested
+    2) Read and validate power data
+    
+    Sensors:
+    1) Read number of fields
+    
+    */
+    
+    //Servo set request SID = 1.01 to 1.07
+    // CID  SID     FC  F1  F2  F3  Term
+    // 0        1.0X    3       Pos Spd Tim \n
+    
+    //Drive motor set request SID = 1.08 & 1.09
+    // CID  SID     FC  F1  Term
+    // 0        1.0X    1       Pwr \n
+    
+    //Sensor info request SID = 1
+    // CID  SID     FC  FN      Term
+    // 0        1           N       1.XX    \n
 }
 
-
-/**************** ISRs ****************/
+void PCTimeout(void) {
+__disable_irq();
+    PCSerial.printf(PC_TIMEOUT_MESSAGE);
+    //GPSSerial.printf(PC_TIMEOUT_MESSAGE);
+    led1 = 1;
+    while(1);
+}
 
-void serialRx_ISR(void) {
-    char buffPntr = 0;
-    bool terminated = 0;
+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
     
-    usbRIT.disable();
-    usbTimer.stop();
-    usbTimer.reset();
-    usbTimer.start();
-    usbRIT.enable();
-    while ((buffPntr != USB_BUFFER_SIZE-1)&&(!flags.usbTimeout)) {
-        if (buffPntr >= 3) {
-            if ((rxBuffer[buffPntr-3] == 0x0A)&&(rxBuffer[buffPntr-2] == 0x0A)&&(rxBuffer[buffPntr-1] == 0x0A)&&(rxBuffer[buffPntr] == 0x0A)) {
-                terminated = 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");
             }
-        }
-        if (!terminated) {
-            while((!serial.readable())&&(!flags.usbTimeout)) {;}
-            if (serial.readable()) {
-                usbRIT.disable();
-                usbTimer.stop();
-                usbTimer.reset();
-                usbTimer.start();
-                usbRIT.enable();
-                rxBuffer[buffPntr] = serial.getc();//whenDataReady, insert into rx buffer
+            else {
+                incommingPCRxDataCount++;
             }
         }
         else {
-            rxBuffer[buffPntr] = 0;
+            incommingPCRxDataCount++;
         }
-        buffPntr++;
-    }
-    if (!terminated) {
-        flags.usbTimeout = 1; //no valid termination seen
     }
     else {
-        flags.rxNewData = 1;
+        flags.PCTimeout = 1;
+        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++;
     }
-    flags.rxNewData = 1;
+    else {
+        flags.PCTimeout = 1;
+        PCTimeoutTimer.stop();
+        PCTimeoutTimer.reset();
+    }   */
 }
 
-void usbTimer_ISR(void) {
-    usbRIT.disable();
-    usbTimer.stop();
-    if ((flags.rxNewData) && (flags.txSentData)) {
-        usbTimer.reset();
-        usbTimer.start();
-        usbRIT.enable();
-        flags.rxNewData = 0;
-        flags.txSentData = 0;
-    }
-    else {
-        flags.usbTimeout = 1;
-    }
+void sendSerialData(void) {
+    PCSerial.printf(PCRxData);
+    PCTimeoutTimer.stop(); // precautionary - done after receiving
+    PCTimeoutTimer.reset(); // precautionary - done after receiving
+    //GPSSerial.printf("Echoed back...\n");
+    //GPSSerial.printf(PCRxData);
+    //GPSSerial.printf("...Echo end\n");
+    flags.txSentData = 1;
+    PCTimeoutTimer.start();
+    //LPC_TIM2->TCR = 0x01; //Start timer
 }
+
+void dmaSSC32SerialRx(MODSERIAL_IRQ_INFO *q) {
+    
+}
+
+void dmaGPSSerialRx(MODSERIAL_IRQ_INFO *q) {
+    
+}