void feedDataStream(void) { uint8_t readBuf[32]; uint8_t res = ERR_OK; UINT bytesRead = 0; //FRTOS1_xSemaphoreTakeRecursive(feedSem, portMAX_DELAY); if (!PlaybackIsSet()) { return; // paused or stopped } // Feed the hungry buffer! :) if (VS_Ready()) { //for (;;) { /* breaks */ if (FAT1_read(&fp, readBuf, sizeof(readBuf), &bytesRead) != FR_OK) { //FRTOS1_xSemaphoreGiveRecursive(feedSem); PLR_StopPlayback(); return; } if (bytesRead == 0) { /* end of file? */ // must be at the end of the file, wrap it up! //FRTOS1_xSemaphoreGiveRecursive(feedSem); PLR_StopPlayback(); return; } VS_SendData(readBuf, sizeof(readBuf)); } //FRTOS1_xSemaphoreGiveRecursive(feedSem); }
uint8_t PLR_StartNewFile(const char* filename, bool turn) { uint16_t data; if(turn == TRUE){ turning = TRUE; turntime = (config_turnval*1000)/TASKDEL_MS; /*Turn in taskcycles*/ } //Stop actual playback PLR_StopPlayback(); VS_ReadRegister(VS_MODE, &data); data = (data | VS_MODE_SM_LINE1 | VS_MODE_SM_SDINEW); VS_WriteRegister(VS_MODE, data); /*resync*/ VS_WriteRegister(VS_WRAMADDR, 0x1E29); VS_WriteRegister(VS_WRAM, 0); if (FAT1_open(&fp, filename, FA_READ) != FR_OK) { return ERR_FAILED; } /*As in datasheet explained set twice 0 in REG_DECODETIME to set back playback time*/ VS_WriteRegister(VS_DECODE_TIME, 0x00); VS_WriteRegister(VS_DECODE_TIME, 0x00); setPlayback(); while (!VS_Ready()) { //wait until DREQ high } return ERR_OK; }
uint8_t VS_WriteRegister(uint8_t reg, uint16_t value) { VS_OnSPIActivate(); VS_CONTROL_MODE_ON(); while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } /* send instruction byte, address byte and 16bit data word */ VS_SPI_WRITE(0x02); /* write instruction */ VS_SPI_WRITE(reg); VS_SPI_WRITE(value>>8); /* high byte first */ while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } VS_SPI_WRITE(value&0xff); /* low byte */ while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } VS_CONTROL_MODE_OFF(); VS_OnSPIDeactivate(); return ERR_OK; }
uint8_t VS_ReadRegister(uint8_t reg, uint16_t *value) { uint8_t val0, val1; VS_OnSPIActivate(); VS_CONTROL_MODE_ON(); while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } /* send instruction byte, address byte and 16bit data word */ VS_SPI_WRITE(0x03); /* read instruction */ VS_SPI_WRITE(reg); VS_SPI_WRITE_READ(0xff, &val0); /* read first byte */ while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } VS_SPI_WRITE_READ(0xff, &val1); /* read second byte */ while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } VS_CONTROL_MODE_OFF(); *value = (val0<<8)|val1; VS_OnSPIDeactivate(); return ERR_OK; }
uint8_t VS_SendData(uint8_t *data, size_t dataSize) { if (dataSize!=VS_DATA_SIZE_BYTES) { return ERR_FAULT; /* need 32 bytes! */ } VS_OnSPIActivate(); VS_DATA_MODE_ON(); while(dataSize>0) { while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } VS_SPI_WRITE(*data++); dataSize--; } VS_DATA_MODE_OFF(); VS_OnSPIDeactivate(); return ERR_OK; }
uint8_t VS_PlaySong(const uint8_t *fileName, const CLS1_StdIOType *io) { UINT bytesRead; uint8_t readBuf[32]; uint8_t res = ERR_OK; static FIL fp; if (io!=NULL) { CLS1_SendStr("Playing file '", io->stdOut); CLS1_SendStr(fileName, io->stdOut); CLS1_SendStr("'\r\n", io->stdOut); } if (FAT1_open(&fp, fileName, FA_READ)!=FR_OK) { if (io!=NULL) { CLS1_SendStr("ERR: Failed to open song file\r\n", io->stdErr); } return ERR_FAILED; } for(;;) { /* breaks */ bytesRead = 0; if (FAT1_read(&fp, readBuf, sizeof(readBuf), &bytesRead)!=FR_OK) { if (io!=NULL) { CLS1_SendStr("ERR: Failed to read file\r\n", io->stdErr); } res = ERR_FAILED; break; } if (bytesRead==0) { /* end of file? */ break; } while(!VS_Ready()) { FRTOS1_vTaskDelay(10/portTICK_RATE_MS); } VS_SendData(readBuf, sizeof(readBuf)); } /* closing file */ (void)FAT1_close(&fp); VS_StartSong(); return res; }
static uint8_t VS_SendZeroes(size_t nof) { size_t chunk; VS_OnSPIActivate(); VS_DATA_MODE_ON(); while(nof!=0) { while(!VS_Ready()) { /* wait until pin goes high so we know it is ready */ } if (nof>VS_DATA_SIZE_BYTES) { /* max 32 bytes */ chunk = VS_DATA_SIZE_BYTES; } else { chunk = nof; } nof -= chunk; while(chunk>0) { VS_SPI_WRITE(0); chunk--; } } VS_DATA_MODE_OFF(); VS_OnSPIDeactivate(); return ERR_OK; }