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:
Tue Jan 30 10:41:47 2018 +0000
Revision:
31:f4b9b85c7b62
Sound output improvements added:  louder, clearer, faster!

Who changed what in which revision?

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