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

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!
Committer:
Pokitto
Date:
Sun Jul 01 06:32:37 2018 +0000
Revision:
52:c04087025cab
Child:
66:6281a40d73e6
PokittoCookie, faster Mode2 and Mode13 added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 52:c04087025cab 1 /**************************************************************************/
Pokitto 52:c04087025cab 2 /*!
Pokitto 52:c04087025cab 3 @file Pokitto_disk.cpp
Pokitto 52:c04087025cab 4 @author Jonne Valola
Pokitto 52:c04087025cab 5
Pokitto 52:c04087025cab 6 @section LICENSE
Pokitto 52:c04087025cab 7
Pokitto 52:c04087025cab 8 Pokitto development stage library
Pokitto 52:c04087025cab 9 Software License Agreement
Pokitto 52:c04087025cab 10
Pokitto 52:c04087025cab 11 Copyright (c) 2015, Jonne Valola ("Author")
Pokitto 52:c04087025cab 12 All rights reserved.
Pokitto 52:c04087025cab 13
Pokitto 52:c04087025cab 14 This library is intended solely for the purpose of Pokitto development.
Pokitto 52:c04087025cab 15
Pokitto 52:c04087025cab 16 Redistribution and use in source and binary forms, with or without
Pokitto 52:c04087025cab 17 modification requires written permission from Author.
Pokitto 52:c04087025cab 18 */
Pokitto 52:c04087025cab 19 /**************************************************************************/
Pokitto 52:c04087025cab 20
Pokitto 52:c04087025cab 21 #include "Pokitto.h"
Pokitto 52:c04087025cab 22
Pokitto 52:c04087025cab 23 #define SD_MOSI_PORT 0
Pokitto 52:c04087025cab 24 #define SD_MISO_PORT 0
Pokitto 52:c04087025cab 25 #define SD_SCK_PORT 0
Pokitto 52:c04087025cab 26 #define SD_CS_PORT 0
Pokitto 52:c04087025cab 27 #define SD_MOSI_PIN 9
Pokitto 52:c04087025cab 28 #define SD_MISO_PIN 8
Pokitto 52:c04087025cab 29 #define SD_SCK_PIN 6
Pokitto 52:c04087025cab 30 #define SD_CS_PIN 7
Pokitto 52:c04087025cab 31
Pokitto 52:c04087025cab 32 #if POK_ENABLE_SD > 0
Pokitto 52:c04087025cab 33 PFFS::BYTE res;
Pokitto 52:c04087025cab 34 PFFS::FATFS fs; /* File system object */
Pokitto 52:c04087025cab 35 PFFS::FATDIR dir; /* Directory object */
Pokitto 52:c04087025cab 36 PFFS::FILINFO fno; /* File information */
Pokitto 52:c04087025cab 37
Pokitto 52:c04087025cab 38 //static FATFS *FatFs; /* Pointer to the file system object (logical drive) */
Pokitto 52:c04087025cab 39
Pokitto 52:c04087025cab 40 bool diropened=false;
Pokitto 52:c04087025cab 41
Pokitto 52:c04087025cab 42 #define SPEAKER 3
Pokitto 52:c04087025cab 43 //#define BUFFER_SIZE 256 // was 128
Pokitto 52:c04087025cab 44 #define SONGLENGTH 0x1BFBCD // 1072223
Pokitto 52:c04087025cab 45 #define FILESIZE 0x1BFBCD
Pokitto 52:c04087025cab 46
Pokitto 52:c04087025cab 47 uint8_t filemode = FILE_MODE_UNINITIALIZED;
Pokitto 52:c04087025cab 48 char currentfile[15]; // holds current file's name
Pokitto 52:c04087025cab 49
Pokitto 52:c04087025cab 50 SPI device(CONNECT_MOSI,CONNECT_MISO,CONNECT_SCK);
Pokitto 52:c04087025cab 51 //DigitalOut mmccs(CONNECT_CS);
Pokitto 52:c04087025cab 52
Pokitto 52:c04087025cab 53 const char *get_filename_ext(const char *filename) {
Pokitto 52:c04087025cab 54 const char *dot = strrchr(filename, '.');
Pokitto 52:c04087025cab 55 if(!dot || dot == filename) return "";
Pokitto 52:c04087025cab 56 return dot + 1;
Pokitto 52:c04087025cab 57 }
Pokitto 52:c04087025cab 58
Pokitto 52:c04087025cab 59 __attribute__((section(".SD_Code"))) void initSDGPIO() {
Pokitto 52:c04087025cab 60 LPC_GPIO_PORT->DIR[SD_MOSI_PORT] |= (1 << SD_MOSI_PIN );
Pokitto 52:c04087025cab 61 LPC_GPIO_PORT->DIR[SD_MISO_PORT] |= (1 << SD_MISO_PIN );
Pokitto 52:c04087025cab 62 LPC_GPIO_PORT->DIR[SD_SCK_PORT] |= (1 << SD_SCK_PIN );
Pokitto 52:c04087025cab 63 LPC_GPIO_PORT->DIR[SD_CS_PORT] |= (1 << SD_CS_PIN );
Pokitto 52:c04087025cab 64 }
Pokitto 52:c04087025cab 65
Pokitto 52:c04087025cab 66 __attribute__((section(".SD_Code"))) int pokInitSD() {
Pokitto 52:c04087025cab 67 initSDGPIO();
Pokitto 52:c04087025cab 68 res = PFFS::disk_initialize();
Pokitto 52:c04087025cab 69 //res = disk_initialize(0);
Pokitto 52:c04087025cab 70 res = (pf_mount(&fs));
Pokitto 52:c04087025cab 71 res = pf_opendir(&dir,"");
Pokitto 52:c04087025cab 72 if (res) diropened=false;
Pokitto 52:c04087025cab 73 else diropened=true;
Pokitto 52:c04087025cab 74 return res;
Pokitto 52:c04087025cab 75 }
Pokitto 52:c04087025cab 76
Pokitto 52:c04087025cab 77
Pokitto 52:c04087025cab 78 void emptyFname() {
Pokitto 52:c04087025cab 79 for (int i=0; i<13; i++) fno.fname[i]=NULL;
Pokitto 52:c04087025cab 80 }
Pokitto 52:c04087025cab 81
Pokitto 52:c04087025cab 82 /** PUBLIC FUNCTIONS **/
Pokitto 52:c04087025cab 83
Pokitto 52:c04087025cab 84 char* getFirstDirEntry() {
Pokitto 52:c04087025cab 85 res=0;
Pokitto 52:c04087025cab 86 if (!diropened) {
Pokitto 52:c04087025cab 87 pokInitSD();
Pokitto 52:c04087025cab 88 }
Pokitto 52:c04087025cab 89 res = pf_opendir(&dir,"");
Pokitto 52:c04087025cab 90 emptyFname();
Pokitto 52:c04087025cab 91 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 92 if (res) return 0;
Pokitto 52:c04087025cab 93 while (res==0) { //while res is ok
Pokitto 52:c04087025cab 94 if ((fno.fattrib & 0x02)==0) {
Pokitto 52:c04087025cab 95 if (fno.fattrib & 0x10) {
Pokitto 52:c04087025cab 96 fno.fname[8]='.';
Pokitto 52:c04087025cab 97 fno.fname[9]='D';
Pokitto 52:c04087025cab 98 fno.fname[10]='I';
Pokitto 52:c04087025cab 99 fno.fname[11]='R';
Pokitto 52:c04087025cab 100 fno.fname[12]='\0';
Pokitto 52:c04087025cab 101 }
Pokitto 52:c04087025cab 102 return fno.fname;
Pokitto 52:c04087025cab 103 }
Pokitto 52:c04087025cab 104 emptyFname();
Pokitto 52:c04087025cab 105 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 106 if (res==0 && dir.index==0) break;
Pokitto 52:c04087025cab 107 }
Pokitto 52:c04087025cab 108 return 0;
Pokitto 52:c04087025cab 109 }
Pokitto 52:c04087025cab 110
Pokitto 52:c04087025cab 111 char* getNextDirEntry() {
Pokitto 52:c04087025cab 112 if (!diropened) pokInitSD();
Pokitto 52:c04087025cab 113 emptyFname();
Pokitto 52:c04087025cab 114 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 115 if (res==0) {
Pokitto 52:c04087025cab 116 while (fno.fattrib & 0x02 && !res) {emptyFname(); res = pf_readdir(&dir,&fno);} //system/hidden file
Pokitto 52:c04087025cab 117 if (fno.fattrib & 0x10) {
Pokitto 52:c04087025cab 118 int a=12;
Pokitto 52:c04087025cab 119 while (a) {
Pokitto 52:c04087025cab 120 fno.fname[a] = fno.fname[a-1];
Pokitto 52:c04087025cab 121 a--;
Pokitto 52:c04087025cab 122 }
Pokitto 52:c04087025cab 123 if (fno.fname[0]) {
Pokitto 52:c04087025cab 124 fno.fname[0]='/';
Pokitto 52:c04087025cab 125 a=0;
Pokitto 52:c04087025cab 126 while (fno.fname[a]) a++;
Pokitto 52:c04087025cab 127 fno.fname[a]='/';
Pokitto 52:c04087025cab 128 }
Pokitto 52:c04087025cab 129
Pokitto 52:c04087025cab 130 /*fno.fname[a++]='.';
Pokitto 52:c04087025cab 131 fno.fname[a++]='D';
Pokitto 52:c04087025cab 132 fno.fname[a++]='I';
Pokitto 52:c04087025cab 133 fno.fname[a++]='R';
Pokitto 52:c04087025cab 134 fno.fname[a]='\0';*/
Pokitto 52:c04087025cab 135 }
Pokitto 52:c04087025cab 136 return fno.fname;
Pokitto 52:c04087025cab 137 }
Pokitto 52:c04087025cab 138 return NULL;
Pokitto 52:c04087025cab 139 }
Pokitto 52:c04087025cab 140
Pokitto 52:c04087025cab 141 char* getNextFile (char* ext){
Pokitto 52:c04087025cab 142
Pokitto 52:c04087025cab 143 if (!diropened) pokInitSD();
Pokitto 52:c04087025cab 144 int a=1;
Pokitto 52:c04087025cab 145 emptyFname();
Pokitto 52:c04087025cab 146 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 147 while (res==0 || a) { //while there are entries and
Pokitto 52:c04087025cab 148 if (dir.index==0) return 0; //end of list
Pokitto 52:c04087025cab 149 a = strcmp((const char*)get_filename_ext(fno.fname),(const char*)ext); // returns 0 if strings are identical
Pokitto 52:c04087025cab 150 if (strcmp(ext,"")==0 && (fno.fattrib & 0x10) == 0) a=0;
Pokitto 52:c04087025cab 151 if (a == 0 && (fno.fattrib & 0x10) == 0) return fno.fname;
Pokitto 52:c04087025cab 152 if (fno.fname[0]==NULL) return NULL; //end of files
Pokitto 52:c04087025cab 153 //if (fno.fattrib&0x10) return NULL; //its a directory
Pokitto 52:c04087025cab 154 emptyFname();
Pokitto 52:c04087025cab 155 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 156 }
Pokitto 52:c04087025cab 157 return 0;
Pokitto 52:c04087025cab 158 }
Pokitto 52:c04087025cab 159
Pokitto 52:c04087025cab 160
Pokitto 52:c04087025cab 161 char* getNextFile() {
Pokitto 52:c04087025cab 162 return getNextFile("");
Pokitto 52:c04087025cab 163 }
Pokitto 52:c04087025cab 164
Pokitto 52:c04087025cab 165 char* getFirstFile(char* ext) {
Pokitto 52:c04087025cab 166 res=0;
Pokitto 52:c04087025cab 167 if (!diropened) {
Pokitto 52:c04087025cab 168 pokInitSD();
Pokitto 52:c04087025cab 169 }
Pokitto 52:c04087025cab 170 res = pf_opendir(&dir,"");
Pokitto 52:c04087025cab 171 emptyFname();
Pokitto 52:c04087025cab 172 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 173 if (res) return 0;
Pokitto 52:c04087025cab 174 while (res==0 || (fno.fattrib & 0x10) == 0) {
Pokitto 52:c04087025cab 175 int a=0;
Pokitto 52:c04087025cab 176 a = strcmp((const char*)get_filename_ext(fno.fname),(const char*)ext); // returns 0 if strings are identical
Pokitto 52:c04087025cab 177 if (!strcmp(ext,"")) a=0;
Pokitto 52:c04087025cab 178 if ( a == 0 && (fno.fattrib & 0x10) == 0) return fno.fname;
Pokitto 52:c04087025cab 179 emptyFname();
Pokitto 52:c04087025cab 180 res = pf_readdir(&dir,&fno); //returns 0 if everything is OK
Pokitto 52:c04087025cab 181 if (fno.fname[0]==NULL) break; //end of directory reached, no files found
Pokitto 52:c04087025cab 182 if (res==0 && dir.index==0) break;
Pokitto 52:c04087025cab 183 }
Pokitto 52:c04087025cab 184 return 0;
Pokitto 52:c04087025cab 185 }
Pokitto 52:c04087025cab 186
Pokitto 52:c04087025cab 187 char* getFirstFile() {
Pokitto 52:c04087025cab 188 return getFirstFile("");
Pokitto 52:c04087025cab 189 }
Pokitto 52:c04087025cab 190
Pokitto 52:c04087025cab 191 int isThisFileOpen(char* buffer){
Pokitto 52:c04087025cab 192 int a=0;
Pokitto 52:c04087025cab 193 a = strcmp((const char*)buffer,(const char*)currentfile); // returns 0 if strings are identical
Pokitto 52:c04087025cab 194 if ( a == 0 && filemode != FILE_MODE_FAILED) return 1;
Pokitto 52:c04087025cab 195 return 0;
Pokitto 52:c04087025cab 196 }
Pokitto 52:c04087025cab 197
Pokitto 52:c04087025cab 198 int fileOK() {
Pokitto 52:c04087025cab 199 if (filemode != FILE_MODE_FAILED) return 1;
Pokitto 52:c04087025cab 200 return 0;
Pokitto 52:c04087025cab 201 }
Pokitto 52:c04087025cab 202
Pokitto 52:c04087025cab 203 uint8_t fileOpen(char* buffer, char fmode) {
Pokitto 52:c04087025cab 204 int err;
Pokitto 52:c04087025cab 205 if (filemode == FILE_MODE_UNINITIALIZED) {
Pokitto 52:c04087025cab 206 int a = pf_mount(&fs);
Pokitto 52:c04087025cab 207 if (a) return 1; // 1 means error in this context
Pokitto 52:c04087025cab 208 }
Pokitto 52:c04087025cab 209
Pokitto 52:c04087025cab 210 filemode = fmode;
Pokitto 52:c04087025cab 211 err = PFFS::pf_open(buffer);
Pokitto 52:c04087025cab 212 if (err==0) {
Pokitto 52:c04087025cab 213 strcpy(currentfile,(const char*)buffer);
Pokitto 52:c04087025cab 214 return 0; // 0 means all clear
Pokitto 52:c04087025cab 215 }
Pokitto 52:c04087025cab 216 // file open failed
Pokitto 52:c04087025cab 217 filemode = FILE_MODE_FAILED;
Pokitto 52:c04087025cab 218 return 1; // 1 means failed
Pokitto 52:c04087025cab 219 }
Pokitto 52:c04087025cab 220
Pokitto 52:c04087025cab 221 void fileClose() {
Pokitto 52:c04087025cab 222 filemode = FILE_MODE_UNINITIALIZED;
Pokitto 52:c04087025cab 223 for (uint8_t i=0; i<15; i++) currentfile[i]=0;
Pokitto 52:c04087025cab 224 }
Pokitto 52:c04087025cab 225
Pokitto 52:c04087025cab 226 char fileGetChar() {
Pokitto 52:c04087025cab 227 PFFS::BYTE buff[1];
Pokitto 52:c04087025cab 228 PFFS::WORD br;
Pokitto 52:c04087025cab 229 int err = PFFS::pf_read(buff, 1, &br); /* Read data to the buff[] */
Pokitto 52:c04087025cab 230 return buff[0];
Pokitto 52:c04087025cab 231 }
Pokitto 52:c04087025cab 232
Pokitto 52:c04087025cab 233 void filePutChar(char c) {
Pokitto 52:c04087025cab 234 PFFS::WORD bw;
Pokitto 52:c04087025cab 235 PFFS::pf_write((const void*)&c, 1, &bw);
Pokitto 52:c04087025cab 236 PFFS::pf_write(0, 0, &bw);
Pokitto 52:c04087025cab 237 }
Pokitto 52:c04087025cab 238
Pokitto 52:c04087025cab 239 void fileWriteBytes(uint8_t * b, uint16_t n) {
Pokitto 52:c04087025cab 240 PFFS::WORD bw;
Pokitto 52:c04087025cab 241 PFFS::pf_write((const void*)&b, n, &bw);
Pokitto 52:c04087025cab 242 PFFS::pf_write(0, 0, &bw);
Pokitto 52:c04087025cab 243 }
Pokitto 52:c04087025cab 244
Pokitto 52:c04087025cab 245 uint16_t fileReadBytes(uint8_t * b, uint16_t n) {
Pokitto 52:c04087025cab 246 PFFS::WORD br;
Pokitto 52:c04087025cab 247 PFFS::pf_read(b, n, &br); /* Read data to the buff[] */
Pokitto 52:c04087025cab 248 return br; /* Return number of bytes read */
Pokitto 52:c04087025cab 249 }
Pokitto 52:c04087025cab 250
Pokitto 52:c04087025cab 251 void fileSeekAbsolute(long n) {
Pokitto 52:c04087025cab 252 res = PFFS::pf_lseek(n);
Pokitto 52:c04087025cab 253 }
Pokitto 52:c04087025cab 254
Pokitto 52:c04087025cab 255 void fileSeekRelative(long n) {
Pokitto 52:c04087025cab 256 if (n<0) if (fs.fptr < -n) n=-fs.fptr;
Pokitto 52:c04087025cab 257 else if (n>0) if (fs.fptr+n > fs.fsize) n=fs.fsize-fs.fptr;
Pokitto 52:c04087025cab 258 res = PFFS::pf_lseek(fs.fptr + n);
Pokitto 52:c04087025cab 259 }
Pokitto 52:c04087025cab 260
Pokitto 52:c04087025cab 261 void fileRewind() {
Pokitto 52:c04087025cab 262 res = PFFS::pf_lseek(0);
Pokitto 52:c04087025cab 263 }
Pokitto 52:c04087025cab 264
Pokitto 52:c04087025cab 265 void fileEnd() {
Pokitto 52:c04087025cab 266 res = PFFS::pf_lseek(fs.fsize);
Pokitto 52:c04087025cab 267 }
Pokitto 52:c04087025cab 268
Pokitto 52:c04087025cab 269 long int fileGetPosition() {
Pokitto 52:c04087025cab 270 return fs.fptr;
Pokitto 52:c04087025cab 271 }
Pokitto 52:c04087025cab 272
Pokitto 52:c04087025cab 273 uint8_t filePeek(long n) {
Pokitto 52:c04087025cab 274 PFFS::pf_lseek(n);
Pokitto 52:c04087025cab 275 return fileGetChar();
Pokitto 52:c04087025cab 276 }
Pokitto 52:c04087025cab 277
Pokitto 52:c04087025cab 278 void filePoke(long n, uint8_t c) {
Pokitto 52:c04087025cab 279 PFFS::pf_lseek(n);
Pokitto 52:c04087025cab 280 filePutChar(c);
Pokitto 52:c04087025cab 281 }
Pokitto 52:c04087025cab 282
Pokitto 52:c04087025cab 283 int fileReadLine(char* destination, int maxchars) {
Pokitto 52:c04087025cab 284 int n=0;
Pokitto 52:c04087025cab 285 char c=1;
Pokitto 52:c04087025cab 286 char linebuf[80];
Pokitto 52:c04087025cab 287 fileReadBytes((uint8_t*)linebuf,80);
Pokitto 52:c04087025cab 288 int index=0;
Pokitto 52:c04087025cab 289 while (c!=NULL) {
Pokitto 52:c04087025cab 290 c = linebuf[index++];
Pokitto 52:c04087025cab 291 if (n == 0) {
Pokitto 52:c04087025cab 292 while (c == '\n' || c == '\r') c = linebuf[index++]; // skip empty lines
Pokitto 52:c04087025cab 293 }
Pokitto 52:c04087025cab 294 n++;
Pokitto 52:c04087025cab 295 if (c=='\n' || c=='\r' || n==maxchars-1) c=NULL; //prevent buffer overflow
Pokitto 52:c04087025cab 296 *destination++ = c;
Pokitto 52:c04087025cab 297 }
Pokitto 52:c04087025cab 298 fileSeekRelative(-80+index); //rewind
Pokitto 52:c04087025cab 299 return n; //number of characters read
Pokitto 52:c04087025cab 300 }
Pokitto 52:c04087025cab 301
Pokitto 52:c04087025cab 302 int dirOpen() {
Pokitto 52:c04087025cab 303 return PFFS::pf_opendir(&dir,"");
Pokitto 52:c04087025cab 304 }
Pokitto 52:c04087025cab 305
Pokitto 52:c04087025cab 306 int dirUp() {
Pokitto 52:c04087025cab 307
Pokitto 52:c04087025cab 308 return 0;
Pokitto 52:c04087025cab 309 }
Pokitto 52:c04087025cab 310 #endif // POK_ENABLE_SD
Pokitto 52:c04087025cab 311
Pokitto 52:c04087025cab 312
Pokitto 52:c04087025cab 313