PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)
Dependents: YATTT sd_map_test cPong SnowDemo ... more
PokittoLib
Library for programming Pokitto hardware
How to Use
- Import this library to online compiler (see button "import" on the right hand side
- DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
- Change My_settings.h according to your project
- Start coding!
POKITTO_CORE/PokittoDisk.cpp
- Committer:
- Pokitto
- Date:
- 2018-01-05
- Revision:
- 28:958b71c4b92a
- Parent:
- 20:fa6899411a24
File content as of revision 28:958b71c4b92a:
/**************************************************************************/ /*! @file Pokitto_disk.cpp @author Jonne Valola @section LICENSE Pokitto development stage library Software License Agreement Copyright (c) 2015, Jonne Valola ("Author") All rights reserved. This library is intended solely for the purpose of Pokitto development. Redistribution and use in source and binary forms, with or without modification requires written permission from Author. */ /**************************************************************************/ #include "Pokitto.h" #define SD_MOSI_PORT 0 #define SD_MISO_PORT 0 #define SD_SCK_PORT 0 #define SD_CS_PORT 0 #define SD_MOSI_PIN 9 #define SD_MISO_PIN 8 #define SD_SCK_PIN 6 #define SD_CS_PIN 7 #if POK_ENABLE_SD > 0 BYTE res; FATFS fs; /* File system object */ FATDIR dir; /* Directory object */ FILINFO fno; /* File information */ //static FATFS *FatFs; /* Pointer to the file system object (logical drive) */ bool diropened=false; #define SPEAKER 3 //#define BUFFER_SIZE 256 // was 128 #define SONGLENGTH 0x1BFBCD // 1072223 #define FILESIZE 0x1BFBCD uint8_t filemode = FILE_MODE_UNINITIALIZED; char currentfile[15]; // holds current file's name SPI device(CONNECT_MOSI,CONNECT_MISO,CONNECT_SCK); //DigitalOut mmccs(CONNECT_CS); const char *get_filename_ext(const char *filename) { const char *dot = strrchr(filename, '.'); if(!dot || dot == filename) return ""; return dot + 1; } __attribute__((section(".SD_Code"))) void initSDGPIO() { LPC_GPIO_PORT->DIR[SD_MOSI_PORT] |= (1 << SD_MOSI_PIN ); LPC_GPIO_PORT->DIR[SD_MISO_PORT] |= (1 << SD_MISO_PIN ); LPC_GPIO_PORT->DIR[SD_SCK_PORT] |= (1 << SD_SCK_PIN ); LPC_GPIO_PORT->DIR[SD_CS_PORT] |= (1 << SD_CS_PIN ); } __attribute__((section(".SD_Code"))) int pokInitSD() { initSDGPIO(); res = disk_initialize(); res = (pf_mount(&fs)); res = pf_opendir(&dir,""); if (res) diropened=false; else diropened=true; return res; } void emptyFname() { for (int i=0; i<13; i++) fno.fname[i]=NULL; } /** PUBLIC FUNCTIONS **/ char* getFirstDirEntry() { res=0; if (!diropened) { pokInitSD(); } res = pf_opendir(&dir,""); emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK if (res) return 0; while (res==0) { //while res is ok if ((fno.fattrib & 0x02)==0) { if (fno.fattrib & 0x10) { fno.fname[8]='.'; fno.fname[9]='D'; fno.fname[10]='I'; fno.fname[11]='R'; fno.fname[12]='\0'; } return fno.fname; } emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK if (res==0 && dir.index==0) break; } return 0; } char* getNextDirEntry() { if (!diropened) pokInitSD(); emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK if (res==0) { while (fno.fattrib & 0x02 && !res) {emptyFname(); res = pf_readdir(&dir,&fno);} //system/hidden file if (fno.fattrib & 0x10) { int a=12; while (a) { fno.fname[a] = fno.fname[a-1]; a--; } if (fno.fname[0]) { fno.fname[0]='/'; a=0; while (fno.fname[a]) a++; fno.fname[a]='/'; } /*fno.fname[a++]='.'; fno.fname[a++]='D'; fno.fname[a++]='I'; fno.fname[a++]='R'; fno.fname[a]='\0';*/ } return fno.fname; } return NULL; } char* getNextFile (char* ext){ if (!diropened) pokInitSD(); int a=1; emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK while (res==0 || a) { //while there are entries and if (dir.index==0) return 0; //end of list a = strcmp((const char*)get_filename_ext(fno.fname),(const char*)ext); // returns 0 if strings are identical if (strcmp(ext,"")==0 && (fno.fattrib & 0x10) == 0) a=0; if (a == 0 && (fno.fattrib & 0x10) == 0) return fno.fname; if (fno.fname[0]==NULL) return NULL; //end of files //if (fno.fattrib&0x10) return NULL; //its a directory emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK } return 0; } char* getNextFile() { return getNextFile(""); } char* getFirstFile(char* ext) { res=0; if (!diropened) { pokInitSD(); } res = pf_opendir(&dir,""); emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK if (res) return 0; while (res==0 || (fno.fattrib & 0x10) == 0) { int a=0; a = strcmp((const char*)get_filename_ext(fno.fname),(const char*)ext); // returns 0 if strings are identical if (!strcmp(ext,"")) a=0; if ( a == 0 && (fno.fattrib & 0x10) == 0) return fno.fname; emptyFname(); res = pf_readdir(&dir,&fno); //returns 0 if everything is OK if (fno.fname[0]==NULL) break; //end of directory reached, no files found if (res==0 && dir.index==0) break; } return 0; } char* getFirstFile() { return getFirstFile(""); } int isThisFileOpen(char* buffer){ int a=0; a = strcmp((const char*)buffer,(const char*)currentfile); // returns 0 if strings are identical if ( a == 0 && filemode != FILE_MODE_FAILED) return 1; return 0; } int fileOK() { if (filemode != FILE_MODE_FAILED) return 1; return 0; } uint8_t fileOpen(char* buffer, char fmode) { int err; if (filemode == FILE_MODE_UNINITIALIZED) { int a = pf_mount(&fs); if (a) return 1; // 1 means error in this context } filemode = fmode; err = pf_open(buffer); if (err==0) { strcpy(currentfile,(const char*)buffer); return 0; // 0 means all clear } // file open failed filemode = FILE_MODE_FAILED; return 1; // 1 means failed } void fileClose() { filemode = FILE_MODE_UNINITIALIZED; for (uint8_t i=0; i<15; i++) currentfile[i]=0; } int fileGetChar() { BYTE buff[1]; WORD br; int err = pf_read(buff, 1, &br); /* Read data to the buff[] */ return buff[0]; } void filePutChar(char c) { WORD bw; pf_write((const void*)&c, 1, &bw); pf_write(0, 0, &bw); } void fileWriteBytes(uint8_t * b, uint16_t n) { WORD bw; pf_write((const void*)&b, n, &bw); pf_write(0, 0, &bw); } uint16_t fileReadBytes(uint8_t * b, uint16_t n) { WORD br; pf_read(b, n, &br); /* Read data to the buff[] */ return br; /* Return number of bytes read */ } void fileSeekAbsolute(long n) { res = pf_lseek(n); } void fileSeekRelative(long n) { if (n<0) if (fs.fptr < -n) n=-fs.fptr; else if (n>0) if (fs.fptr+n > fs.fsize) n=fs.fsize-fs.fptr; res = pf_lseek(fs.fptr + n); } void fileRewind() { res = pf_lseek(0); } void fileEnd() { res = pf_lseek(fs.fsize); } long int fileGetPosition() { return fs.fptr; } uint8_t filePeek(long n) { pf_lseek(n); return fileGetChar(); } void filePoke(long n, uint8_t c) { pf_lseek(n); filePutChar(c); } int dirOpen() { return pf_opendir(&dir,""); } int dirUp() { return 0; } #endif // POK_ENABLE_SD