Dependencies: keypad SDHCFileSystem mbed FPointer wave_player
main.cpp@0:879af6e11219, 2012-02-20 (annotated)
- Committer:
- daryl2110
- Date:
- Mon Feb 20 07:36:06 2012 +0000
- Revision:
- 0:879af6e11219
Who changed what in which revision?
User | Revision | Line number | New 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 | //----------------------------------------------------------------------------- |