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:
Wed Oct 11 20:35:52 2017 +0000
Revision:
6:72f87b7c7400
Fixed PokittoLib to fully working. Includes mbed-src

Who changed what in which revision?

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