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 Oct 22 19:02:56 2017 +0000
Revision:
20:fa6899411a24
BLv3 mechanism installed

Who changed what in which revision?

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