Dependencies:   keypad SDHCFileSystem mbed FPointer wave_player

Revision:
0:879af6e11219
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Feb 20 07:36:06 2012 +0000
@@ -0,0 +1,207 @@
+#include "mbed.h"
+#include "scmRTOS.h"
+#include "wave_player.h"
+#include "SDHCFileSystem.h"
+#include "keypad.h"
+
+BusOut     SevenSegments(p21, p22, p23, p24, p25, p26, p27);
+BusOut     Leds(p28, p29, p30);
+Keypad     keypad(p15, p14, p13, p12, p20, p19, p17, p16);
+
+Serial          xbee(p9, p10);
+DigitalOut      rst1(p11);
+SDFileSystem    sd(p5, p6, p7, p8, "sd");
+AnalogOut       AudioOut(p18);
+wave_player     waver(&AudioOut);
+
+
+#define  MAXBUS     2
+#define  MAXLEN     4
+#define  ENDKEYIX  14
+char     BusNumber[MAXBUS][MAXLEN];
+char     BusInput[MAXLEN];
+volatile char     BusDisplay[MAXLEN]; // Updated by ISR?? for 7-segment LED refresh
+char     Keytable[] = { 0x30, 0x6D, 0x79, 0x00,
+                        0x33, 0x5B, 0x5F, 0x00,
+                        0x70, 0xFF, 0x7B, 0x00,
+                        0x00, 0x75, 0x00, 0x00
+                      };
+
+
+int req;
+/*
+ * ISR to update completed bus number input into BusNumer[][]
+ */
+uint32_t cbAfterInput(uint32_t keyIX) {
+    bool     finish = false;
+    static int NumIX = 0;    // Point to current index of Bus number
+
+    if (NumIX < MAXLEN - 1) {
+        if (keyIX != ENDKEYIX) {
+            BusInput[NumIX] = Keytable[keyIX];
+            //printf("Entered = %02X\n", BusInput[NumIX]);
+            NumIX++;
+        } else {
+            finish = true;
+        }
+    }
+
+    if (finish || NumIX == MAXLEN - 1) {
+        int i;
+        for (i = 0; i < MAXBUS; i++) {
+            if ( (BusNumber[i][0] == 0)) {
+                memcpy((void *) &BusNumber[i][0], &BusInput[0], 3);
+                printf("Entered %02X%02X%02X\n",
+                       BusNumber[i][0], BusNumber[i][1], BusNumber[i][2]);
+                break;
+            }
+        }
+        if (i == MAXBUS -1)
+            printf("BusNumber buffer is full\n");
+
+        NumIX = 0;
+    }
+    return 0;
+}
+
+/*
+ * Update a bus number into BusDisplay for 7-segment LED
+ */
+void Refresh7SegmentLedISR() {
+    if (BusDisplay[0] != 0) {
+        printf("BusDisplay %02X%02X%02X\n",
+               BusDisplay[0],BusDisplay[1],BusDisplay[2]);
+        for (int i = 0; i< MAXLEN-1; i++) {
+            Leds = 0x01 << i;
+            SevenSegments = BusDisplay[i];
+            wait_ms(50); // Change to Sleep(20000) in RTOS
+        }
+    }
+}
+
+void UpdateBusDisplayISR() {
+    static  int BusIX = -1;
+
+    BusIX = ++BusIX % MAXBUS;
+
+    if (BusNumber[BusIX][0] != 0)
+        memcpy((void *)BusDisplay, BusNumber[BusIX], MAXLEN);
+}
+
+
+Ticker   UpdateBusDisplay;
+Ticker   Refresh7SegmentLed;
+
+//---------------------------------------------------------------------------
+//
+//      Process types
+//
+typedef OS::process<OS::pr0, 5000> TProc1;
+typedef OS::process<OS::pr1, 3000> TProc2;
+typedef OS::process<OS::pr2, 3000> TProc3;
+
+//---------------------------------------------------------------------------
+//
+//      Process objects
+//
+TProc1 Proc1;
+TProc2 Proc2;
+TProc3 Proc3;
+
+//---------------------------------------------------------------------------
+//
+//      IO Pins
+//
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+
+//---------------------------------------------------------------------------
+//
+//      Event Flags to test
+//
+OS::TEventFlag XBee;
+
+
+//---------------------------------------------------------------------------
+//
+int main() {
+    // configure IO pins
+    //printf("\nInitialising ...\n");
+    rst1   = 0; //Set reset pin to 0
+    led1  = 0;//Set LED1 to 0
+    led2 = 0;//Set LED2 to 0
+    wait_ms(1);//Wait at least one millisecond
+    rst1   = 1;//Set reset pin to 1
+    wait_ms(1);//Wait another millisecond
+
+    // run
+    OS::Run();
+}
+
+//---------------------------------------------------------------------------
+template<> OS_PROCESS void TProc1::Exec() {
+
+    for (;;) {
+        if (xbee.readable()) {
+            req = xbee.getc();
+            //printf("req = %c\n", req);
+            XBee.SignalISR();
+            Sleep(2000);
+        }
+    }
+}
+
+//---------------------------------------------------------------------------
+template<> OS_PROCESS void TProc2::Exec() {
+    for (;;) {
+        XBee.Wait();
+        if (req == 'r') {
+            //printf("Came here 2 \n");
+            FILE *fp = fopen("/sd/wf/Bus.wav","r");
+            waver.play(fp);
+            //printf("playing");
+            fseek(fp, 0, SEEK_SET);
+            fclose(fp);
+            FILE *fp1 = fopen("/sd/wf/30.wav","r");
+            waver.play(fp1);
+            fseek(fp1, 0, SEEK_SET);
+            fclose(fp1);
+            FILE *fp2 = fopen("/sd/wf/coming.wav","r");
+            waver.play(fp2);
+            fseek(fp2, 0, SEEK_SET);
+            fclose(fp2);
+        }
+    }
+}
+
+//---------------------------------------------------------------------------
+template<> OS_PROCESS void TProc3::Exec() {
+
+    for (;;) {
+        printf("Start\n");
+        UpdateBusDisplay.attach(&UpdateBusDisplayISR, 1.0);
+        Refresh7SegmentLed.attach(&Refresh7SegmentLedISR, 1.3);
+
+        memset((void*)BusNumber, 0, MAXBUS * MAXLEN);
+        memset((void*)BusInput,  0, MAXLEN);
+        memset((void*)BusDisplay, 0, MAXLEN);
+        keypad.CallAfterInput(&cbAfterInput);
+        keypad.Start();
+    }
+}
+/*
+//---------------------------------------------------------------------------
+void OS::SystemTimerUserHook() {
+    static int cnt=0;
+    if (++cnt == 2000) {
+        cnt = 0;
+        led2.write(1);
+
+    }
+}
+*/
+//---------------------------------------------------------------------------
+void OS::IdleProcessUserHook() {
+    __WFI();
+}
+//-----------------------------------------------------------------------------