PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

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