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:
Mon Apr 02 22:37:22 2018 +0000
Revision:
36:771321e70814
Synced with Github repo

Who changed what in which revision?

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