test

Dependencies:   MODDMA MODSERIAL mbed

Fork of IRIS_MBED by IRIS

Files at this revision

API Documentation at this revision

Comitter:
JonathanAshworth
Date:
Sun Mar 15 21:48:23 2015 +0000
Child:
1:ccecc816c5e8
Commit message:
Interrupt driven. Passed pre-check testing using a terminal program but now requires pc:mbed testing.

Changed in this revision

RIT.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RIT.lib	Sun Mar 15 21:48:23 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/wvd_vegt/code/RIT/#64198265f56f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Mar 15 21:48:23 2015 +0000
@@ -0,0 +1,196 @@
+#include "mbed.h"
+#include "main.h"
+#include "RIT.h"
+
+#define TIMEOUT_MESSAGE "MBED detected a timeout - eStop!\n\n\n\n"
+#define USB_BUFFER_SIZE 1024
+ 
+Serial serial(USBTX, USBRX);
+Timer usbTimer;
+RIT usbRIT(100);
+Flags flags;
+
+char txBuffer[USB_BUFFER_SIZE] = {0};
+char rxBuffer[USB_BUFFER_SIZE] = {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);
+    
+    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
+    
+    while(1) {
+        if (flags.usbTimeout) {
+            usbTimeout();
+        }
+        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();
+            
+            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 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 shutdown(void) {
+    //turn off each peripheral safely
+}
+
+
+/**************** ISRs ****************/
+
+void serialRx_ISR(void) {
+    char buffPntr = 0;
+    bool terminated = 0;
+    
+    usbRIT.disable();
+    usbTimer.stop();
+    usbTimer.reset();
+    usbTimer.start();
+    usbRIT.enable();
+    if (!flags.rxNewData) { //prevent too short windows
+        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;
+                }
+            }
+            if (!terminated) {
+                while((!serial.readable())&&(!flags.usbTimeout)) {;}
+                if (serial.readable()) {
+                    rxBuffer[buffPntr] = serial.getc();//whenDataReady, insert into rx buffer
+                }
+            }
+            else {
+                rxBuffer[buffPntr] = 0;
+            }
+            buffPntr++;
+        }
+        if (!terminated) {
+            flags.usbTimeout = 1; //no valid termination seen
+        }
+        else {
+            flags.rxNewData = 1;
+        }
+    }
+    else {
+        flags.usbTimeout = 1; //received another window too early
+    }
+    flags.rxNewData = 1;
+}
+
+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;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Sun Mar 15 21:48:23 2015 +0000
@@ -0,0 +1,12 @@
+struct Flags
+{
+    bool rxNewData;
+    bool txSentData;
+    bool usbTimeout;
+};
+
+void serialTx (void);
+void usbTimeout(void);
+void shutdown(void);
+void serialRx_ISR(void);
+void usbTimer_ISR(void);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Mar 15 21:48:23 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7e07b6fb45cf
\ No newline at end of file