//--------------------------------------------------------------- // Use these functions to build an RTOS for the playback system // delayMS(x) - creates task to delay x mS // SignalEvent(messageName, messageValue) - send message // GetMessageValue(messageName) - gets the messages value // WaitForEvent(messageName) - causes task to wait on message // CheckForEvent(messageName) - Equal 1 if there is a waiting message //--------------------------------------------------------------- //--------------------------------------------------------------- // messages that are used in this program // messageStartRecord messageEndRecord // messageStartPlay messageEndPlay // messageADIF messageMicValid // messageDoneWritePage messagePageFull // messageNeedNewPage messagePageValid // messageNeedNewNote messageNoteValid //--------------------------------------------------------------- // Globals uint8_t red[PAGE_SIZE], blue[PAGE_SIZE]; uint8_t *storingBuffer, *fillingBuffer, *playingBuffer; uint32_t finalSdCardAddress; uint32_t sdCardAddress; //--------------------------------------------------------------- // task: ReadJoy // purp: Reads the joystick every 100mS and // starts recording on up // stops recording on down // starts playback on left // stops recording on right //--------------------------------------------------------------- void taskReadJoy() { for(;;) { delayMS(10); if (up_pin) SignalEvent(________________________, 1); if (down_pin) SignalEvent(________________________, 1); if (left_pin) SignalEvent(________________________, 1); if (right_pin) SignalEvent(________________________, 1); } } //--------------------------------------------------------------- // task: ReadMic // purp: Reads the microphone every 1mS and signals // StoreMic with this new sample //--------------------------------------------------------------- void taskReadMic() { for(;;) { WaitForEvent(________________________); while(!CheckForEvent(________________________)) { ADCCONbits.GO = 1; WaitForEvent(________________________); SignalEvent(________________________); delayMS(________________________); } } //--------------------------------------------------------------- // task: StoreMic // purp: acquires samples from ReadMic, puts them into // the red or blue buffer. When a buffer is full // writing is switched to the other buffer and the // full buffer is stored in the SDCARD via the // WritePage task. //--------------------------------------------------------------- void taskStoreMic() { uint32_t sdCardAddress; for(;;) { WaitForEvent(________________________); sdCardAddress=0; fillingBuffer=red; while(!CheckForEvent(________________________)) { for(i=0; i < PAGE_SIZE; i++) { WaitForEvent(________________________); fillingBuffer[i++]=ValueOfMessage(________________________); } storingBuffer = fillingBuffer; SignalEvent(________________________); if (fillingBuffer==red) fillingBuffer=blue; else fillingBuffer=red; sdCardAddress += PAGE_SIZE; } finalSdCardAddress=sdCardAddress; } } //--------------------------------------------------------------- // task: WritePage // purp: Writes a full buffer to the SDCARD and signals // the StoreMic task when complete. //--------------------------------------------------------------- void taskWritePage() { uint8_t *buffer; for(;;) { WaitForEvent(________________________); buffer = GetMessageValue(________________________>); SDCARD_WriteBlock(sdCardAddress, buffer); SignalEvent(________________________) } } //--------------------------------------------------------------- // task: PlayPage // purp: Reads out pages from the SDCARD into one of two // buffers and informs the PlayNote task when a // new CCPR1L value is ready. //--------------------------------------------------------------- void taskPlayPage() { uint32_t sdCardAddress=0; uint8_t *buffer; for(;;) { WaitForEvent(________________________); sdCardAddress = 0; sdCardAddress = 0; // Get first page SignalEvent(________________________); WaitForEvent(________________________); buffer=ValueOfMessage(________________________); sdCardAddress += PAGE_SIZE; while(sdCardAddress < finalSdCardAddress) { SignalEvent(________________________); sdCardAddress += PAGE_SIZE; for(i=0; i<PAGE_SIZE; i++) { SignalEvent(________________________); WaitForEvent(________________________); } WaitForEvent(________________________); buffer=ValueOfMessage(________________________); } } } //--------------------------------------------------------------- // task: ReadPage // purp: read the SD Card and toggle buffers. //--------------------------------------------------------------- void taskReadPage() { uint32_t sdCardAddress=0; for(;;) { WaitForEvent(________________________); sdCardAddress=ValueOfMessage(________________________); SDCARD_ReadBlock(Address, fillingBuffer); playingBuffer = fillingBuffer; SignalEvent(________________________, playingBuffer); if (fillingBuffer == red) fillingBuffer=blue; else fillingBuffer=red; } } //--------------------------------------------------------------- // task: PlayNote // purp: Play the PWM frequency for 1ms //--------------------------------------------------------------- void taskPlayNote() { for(;;) { WaitForEvent(________________________); EPWM1_LoadDuty(ValueOfMessage(________________________)); delayMS(1); SignalEvent(________________________); } }