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

Committer:
spinal
Date:
Sun Nov 18 15:47:54 2018 +0000
Revision:
64:6e6c6c2b664e
Parent:
52:c04087025cab
added fix for directrectangle()

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