Dependencies:   keypad SDHCFileSystem mbed FPointer wave_player

Committer:
daryl2110
Date:
Mon Feb 20 07:36:06 2012 +0000
Revision:
0:879af6e11219

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daryl2110 0:879af6e11219 1 #include "mbed.h"
daryl2110 0:879af6e11219 2 #include "scmRTOS.h"
daryl2110 0:879af6e11219 3 #include "wave_player.h"
daryl2110 0:879af6e11219 4 #include "SDHCFileSystem.h"
daryl2110 0:879af6e11219 5 #include "keypad.h"
daryl2110 0:879af6e11219 6
daryl2110 0:879af6e11219 7 BusOut SevenSegments(p21, p22, p23, p24, p25, p26, p27);
daryl2110 0:879af6e11219 8 BusOut Leds(p28, p29, p30);
daryl2110 0:879af6e11219 9 Keypad keypad(p15, p14, p13, p12, p20, p19, p17, p16);
daryl2110 0:879af6e11219 10
daryl2110 0:879af6e11219 11 Serial xbee(p9, p10);
daryl2110 0:879af6e11219 12 DigitalOut rst1(p11);
daryl2110 0:879af6e11219 13 SDFileSystem sd(p5, p6, p7, p8, "sd");
daryl2110 0:879af6e11219 14 AnalogOut AudioOut(p18);
daryl2110 0:879af6e11219 15 wave_player waver(&AudioOut);
daryl2110 0:879af6e11219 16
daryl2110 0:879af6e11219 17
daryl2110 0:879af6e11219 18 #define MAXBUS 2
daryl2110 0:879af6e11219 19 #define MAXLEN 4
daryl2110 0:879af6e11219 20 #define ENDKEYIX 14
daryl2110 0:879af6e11219 21 char BusNumber[MAXBUS][MAXLEN];
daryl2110 0:879af6e11219 22 char BusInput[MAXLEN];
daryl2110 0:879af6e11219 23 volatile char BusDisplay[MAXLEN]; // Updated by ISR?? for 7-segment LED refresh
daryl2110 0:879af6e11219 24 char Keytable[] = { 0x30, 0x6D, 0x79, 0x00,
daryl2110 0:879af6e11219 25 0x33, 0x5B, 0x5F, 0x00,
daryl2110 0:879af6e11219 26 0x70, 0xFF, 0x7B, 0x00,
daryl2110 0:879af6e11219 27 0x00, 0x75, 0x00, 0x00
daryl2110 0:879af6e11219 28 };
daryl2110 0:879af6e11219 29
daryl2110 0:879af6e11219 30
daryl2110 0:879af6e11219 31 int req;
daryl2110 0:879af6e11219 32 /*
daryl2110 0:879af6e11219 33 * ISR to update completed bus number input into BusNumer[][]
daryl2110 0:879af6e11219 34 */
daryl2110 0:879af6e11219 35 uint32_t cbAfterInput(uint32_t keyIX) {
daryl2110 0:879af6e11219 36 bool finish = false;
daryl2110 0:879af6e11219 37 static int NumIX = 0; // Point to current index of Bus number
daryl2110 0:879af6e11219 38
daryl2110 0:879af6e11219 39 if (NumIX < MAXLEN - 1) {
daryl2110 0:879af6e11219 40 if (keyIX != ENDKEYIX) {
daryl2110 0:879af6e11219 41 BusInput[NumIX] = Keytable[keyIX];
daryl2110 0:879af6e11219 42 //printf("Entered = %02X\n", BusInput[NumIX]);
daryl2110 0:879af6e11219 43 NumIX++;
daryl2110 0:879af6e11219 44 } else {
daryl2110 0:879af6e11219 45 finish = true;
daryl2110 0:879af6e11219 46 }
daryl2110 0:879af6e11219 47 }
daryl2110 0:879af6e11219 48
daryl2110 0:879af6e11219 49 if (finish || NumIX == MAXLEN - 1) {
daryl2110 0:879af6e11219 50 int i;
daryl2110 0:879af6e11219 51 for (i = 0; i < MAXBUS; i++) {
daryl2110 0:879af6e11219 52 if ( (BusNumber[i][0] == 0)) {
daryl2110 0:879af6e11219 53 memcpy((void *) &BusNumber[i][0], &BusInput[0], 3);
daryl2110 0:879af6e11219 54 printf("Entered %02X%02X%02X\n",
daryl2110 0:879af6e11219 55 BusNumber[i][0], BusNumber[i][1], BusNumber[i][2]);
daryl2110 0:879af6e11219 56 break;
daryl2110 0:879af6e11219 57 }
daryl2110 0:879af6e11219 58 }
daryl2110 0:879af6e11219 59 if (i == MAXBUS -1)
daryl2110 0:879af6e11219 60 printf("BusNumber buffer is full\n");
daryl2110 0:879af6e11219 61
daryl2110 0:879af6e11219 62 NumIX = 0;
daryl2110 0:879af6e11219 63 }
daryl2110 0:879af6e11219 64 return 0;
daryl2110 0:879af6e11219 65 }
daryl2110 0:879af6e11219 66
daryl2110 0:879af6e11219 67 /*
daryl2110 0:879af6e11219 68 * Update a bus number into BusDisplay for 7-segment LED
daryl2110 0:879af6e11219 69 */
daryl2110 0:879af6e11219 70 void Refresh7SegmentLedISR() {
daryl2110 0:879af6e11219 71 if (BusDisplay[0] != 0) {
daryl2110 0:879af6e11219 72 printf("BusDisplay %02X%02X%02X\n",
daryl2110 0:879af6e11219 73 BusDisplay[0],BusDisplay[1],BusDisplay[2]);
daryl2110 0:879af6e11219 74 for (int i = 0; i< MAXLEN-1; i++) {
daryl2110 0:879af6e11219 75 Leds = 0x01 << i;
daryl2110 0:879af6e11219 76 SevenSegments = BusDisplay[i];
daryl2110 0:879af6e11219 77 wait_ms(50); // Change to Sleep(20000) in RTOS
daryl2110 0:879af6e11219 78 }
daryl2110 0:879af6e11219 79 }
daryl2110 0:879af6e11219 80 }
daryl2110 0:879af6e11219 81
daryl2110 0:879af6e11219 82 void UpdateBusDisplayISR() {
daryl2110 0:879af6e11219 83 static int BusIX = -1;
daryl2110 0:879af6e11219 84
daryl2110 0:879af6e11219 85 BusIX = ++BusIX % MAXBUS;
daryl2110 0:879af6e11219 86
daryl2110 0:879af6e11219 87 if (BusNumber[BusIX][0] != 0)
daryl2110 0:879af6e11219 88 memcpy((void *)BusDisplay, BusNumber[BusIX], MAXLEN);
daryl2110 0:879af6e11219 89 }
daryl2110 0:879af6e11219 90
daryl2110 0:879af6e11219 91
daryl2110 0:879af6e11219 92 Ticker UpdateBusDisplay;
daryl2110 0:879af6e11219 93 Ticker Refresh7SegmentLed;
daryl2110 0:879af6e11219 94
daryl2110 0:879af6e11219 95 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 96 //
daryl2110 0:879af6e11219 97 // Process types
daryl2110 0:879af6e11219 98 //
daryl2110 0:879af6e11219 99 typedef OS::process<OS::pr0, 5000> TProc1;
daryl2110 0:879af6e11219 100 typedef OS::process<OS::pr1, 3000> TProc2;
daryl2110 0:879af6e11219 101 typedef OS::process<OS::pr2, 3000> TProc3;
daryl2110 0:879af6e11219 102
daryl2110 0:879af6e11219 103 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 104 //
daryl2110 0:879af6e11219 105 // Process objects
daryl2110 0:879af6e11219 106 //
daryl2110 0:879af6e11219 107 TProc1 Proc1;
daryl2110 0:879af6e11219 108 TProc2 Proc2;
daryl2110 0:879af6e11219 109 TProc3 Proc3;
daryl2110 0:879af6e11219 110
daryl2110 0:879af6e11219 111 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 112 //
daryl2110 0:879af6e11219 113 // IO Pins
daryl2110 0:879af6e11219 114 //
daryl2110 0:879af6e11219 115 DigitalOut led1(LED1);
daryl2110 0:879af6e11219 116 DigitalOut led2(LED2);
daryl2110 0:879af6e11219 117
daryl2110 0:879af6e11219 118 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 119 //
daryl2110 0:879af6e11219 120 // Event Flags to test
daryl2110 0:879af6e11219 121 //
daryl2110 0:879af6e11219 122 OS::TEventFlag XBee;
daryl2110 0:879af6e11219 123
daryl2110 0:879af6e11219 124
daryl2110 0:879af6e11219 125 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 126 //
daryl2110 0:879af6e11219 127 int main() {
daryl2110 0:879af6e11219 128 // configure IO pins
daryl2110 0:879af6e11219 129 //printf("\nInitialising ...\n");
daryl2110 0:879af6e11219 130 rst1 = 0; //Set reset pin to 0
daryl2110 0:879af6e11219 131 led1 = 0;//Set LED1 to 0
daryl2110 0:879af6e11219 132 led2 = 0;//Set LED2 to 0
daryl2110 0:879af6e11219 133 wait_ms(1);//Wait at least one millisecond
daryl2110 0:879af6e11219 134 rst1 = 1;//Set reset pin to 1
daryl2110 0:879af6e11219 135 wait_ms(1);//Wait another millisecond
daryl2110 0:879af6e11219 136
daryl2110 0:879af6e11219 137 // run
daryl2110 0:879af6e11219 138 OS::Run();
daryl2110 0:879af6e11219 139 }
daryl2110 0:879af6e11219 140
daryl2110 0:879af6e11219 141 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 142 template<> OS_PROCESS void TProc1::Exec() {
daryl2110 0:879af6e11219 143
daryl2110 0:879af6e11219 144 for (;;) {
daryl2110 0:879af6e11219 145 if (xbee.readable()) {
daryl2110 0:879af6e11219 146 req = xbee.getc();
daryl2110 0:879af6e11219 147 //printf("req = %c\n", req);
daryl2110 0:879af6e11219 148 XBee.SignalISR();
daryl2110 0:879af6e11219 149 Sleep(2000);
daryl2110 0:879af6e11219 150 }
daryl2110 0:879af6e11219 151 }
daryl2110 0:879af6e11219 152 }
daryl2110 0:879af6e11219 153
daryl2110 0:879af6e11219 154 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 155 template<> OS_PROCESS void TProc2::Exec() {
daryl2110 0:879af6e11219 156 for (;;) {
daryl2110 0:879af6e11219 157 XBee.Wait();
daryl2110 0:879af6e11219 158 if (req == 'r') {
daryl2110 0:879af6e11219 159 //printf("Came here 2 \n");
daryl2110 0:879af6e11219 160 FILE *fp = fopen("/sd/wf/Bus.wav","r");
daryl2110 0:879af6e11219 161 waver.play(fp);
daryl2110 0:879af6e11219 162 //printf("playing");
daryl2110 0:879af6e11219 163 fseek(fp, 0, SEEK_SET);
daryl2110 0:879af6e11219 164 fclose(fp);
daryl2110 0:879af6e11219 165 FILE *fp1 = fopen("/sd/wf/30.wav","r");
daryl2110 0:879af6e11219 166 waver.play(fp1);
daryl2110 0:879af6e11219 167 fseek(fp1, 0, SEEK_SET);
daryl2110 0:879af6e11219 168 fclose(fp1);
daryl2110 0:879af6e11219 169 FILE *fp2 = fopen("/sd/wf/coming.wav","r");
daryl2110 0:879af6e11219 170 waver.play(fp2);
daryl2110 0:879af6e11219 171 fseek(fp2, 0, SEEK_SET);
daryl2110 0:879af6e11219 172 fclose(fp2);
daryl2110 0:879af6e11219 173 }
daryl2110 0:879af6e11219 174 }
daryl2110 0:879af6e11219 175 }
daryl2110 0:879af6e11219 176
daryl2110 0:879af6e11219 177 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 178 template<> OS_PROCESS void TProc3::Exec() {
daryl2110 0:879af6e11219 179
daryl2110 0:879af6e11219 180 for (;;) {
daryl2110 0:879af6e11219 181 printf("Start\n");
daryl2110 0:879af6e11219 182 UpdateBusDisplay.attach(&UpdateBusDisplayISR, 1.0);
daryl2110 0:879af6e11219 183 Refresh7SegmentLed.attach(&Refresh7SegmentLedISR, 1.3);
daryl2110 0:879af6e11219 184
daryl2110 0:879af6e11219 185 memset((void*)BusNumber, 0, MAXBUS * MAXLEN);
daryl2110 0:879af6e11219 186 memset((void*)BusInput, 0, MAXLEN);
daryl2110 0:879af6e11219 187 memset((void*)BusDisplay, 0, MAXLEN);
daryl2110 0:879af6e11219 188 keypad.CallAfterInput(&cbAfterInput);
daryl2110 0:879af6e11219 189 keypad.Start();
daryl2110 0:879af6e11219 190 }
daryl2110 0:879af6e11219 191 }
daryl2110 0:879af6e11219 192 /*
daryl2110 0:879af6e11219 193 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 194 void OS::SystemTimerUserHook() {
daryl2110 0:879af6e11219 195 static int cnt=0;
daryl2110 0:879af6e11219 196 if (++cnt == 2000) {
daryl2110 0:879af6e11219 197 cnt = 0;
daryl2110 0:879af6e11219 198 led2.write(1);
daryl2110 0:879af6e11219 199
daryl2110 0:879af6e11219 200 }
daryl2110 0:879af6e11219 201 }
daryl2110 0:879af6e11219 202 */
daryl2110 0:879af6e11219 203 //---------------------------------------------------------------------------
daryl2110 0:879af6e11219 204 void OS::IdleProcessUserHook() {
daryl2110 0:879af6e11219 205 __WFI();
daryl2110 0:879af6e11219 206 }
daryl2110 0:879af6e11219 207 //-----------------------------------------------------------------------------