47 virtual void process(
char ch) = 0;
73 uint32_t startMillis = millis();
75 while (!fAvailable && millis() < startMillis + 3000)
77 while (fStream.available())
79 char ch = fStream.read();
86 if (strcmp(fBuffer,
"No Disk") == 0)
89 fDriveInserted =
false;
92 if (strcmp(fBuffer,
"Stopped") == 0 ||
93 strcmp(fBuffer,
"D:\\>") == 0 ||
94 strcmp(fBuffer,
"D:\\>Command Failed") == 0 ||
95 strcmp(fBuffer,
"No Upgrade") == 0 ||
96 strcmp(fBuffer,
"Bad Command") == 0 ||
97 strcmp(fBuffer,
"Command Failed") == 0)
100 fDriveInserted =
true;
107 fBuffer[fPos++] = ch;
108 fBuffer[fPos] =
'\0';
125 while (fStream.available())
133 else if (strcmp(str,
"Device Removed P2") == 0)
137 else if (strcmp(str,
"No Disk") == 0)
139 fDriveInserted =
false;
142 else if (strcmp(str,
"Device Detected P2") == 0)
146 else if (strcmp(str,
"No Upgrade") == 0)
148 fDriveInserted =
true;
151 else if (strcmp(str,
"Stopped") == 0)
167 return fDriveInserted;
231 if (strcmp(ret,
"No Disk") == 0)
233 snprintf(labelBuffer, bufferSize,
"%s", ret);
248 for (
unsigned i = 0; i <
sizeof(buf); i++)
252 serialNumber = (uint32_t(buf[0])<<0 |
253 uint32_t(buf[1])<<8 |
254 uint32_t(buf[2])<<16 |
255 uint32_t(buf[3])<<24);
331 while ((str =
readLine(bytesRead)) !=
nullptr && str[0] !=
'\0')
334 size_t len = strlen(fileName);
335 if (bytesRead == len+5 && str[len] ==
' ')
338 size = (uint32_t(str[0])<<0 |
339 uint32_t(str[1])<<8 |
340 uint32_t(str[2])<<16 |
341 uint32_t(str[3])<<24);
354 uint32_t fileSize = 0;
366 bool newline =
false;
367 char readCmd[9] = {
'R',
'D',
'F',
' ' };
369 uint32_t chunkSize =
sizeof(chunk);
370 while (fileSize != 0)
372 if (fileSize < chunkSize)
373 chunkSize = fileSize;
374 readCmd[4] = (chunkSize>>24)&0xFF;
375 readCmd[5] = (chunkSize>>16)&0xFF;
376 readCmd[6] = (chunkSize>>8)&0xFF;
377 readCmd[7] = (chunkSize>>0)&0xFF;
380 fStream.write(readCmd,
sizeof(readCmd));
385 for (
size_t i = 0; i < chunkSize; i++)
387 char ch = (char)ptr[i];
388 if (ch ==
'\n' || ch ==
'\r')
394 newline = (ch ==
'\n' || ch ==
'\r');
407 fileSize -= chunkSize;
424 uint8_t seekCmd[9] = {
'S',
'E',
'K',
' ' };
425 seekCmd[4] = (pos>>24)&0xFF;
426 seekCmd[5] = (pos>>16)&0xFF;
427 seekCmd[6] = (pos>>8)&0xFF;
428 seekCmd[7] = (pos>>0)&0xFF;
430 fStream.write(seekCmd,
sizeof(seekCmd));
436 uint8_t readCmd[9] = {
'R',
'D',
'F',
' ' };
437 readCmd[4] = (len>>24)&0xFF;
438 readCmd[5] = (len>>16)&0xFF;
439 readCmd[6] = (len>>8)&0xFF;
440 readCmd[7] = (len>>0)&0xFF;
442 fStream.write(readCmd,
sizeof(readCmd));
456 uint8_t writeCmd[9] = {
'W',
'R',
'F',
' ' };
457 writeCmd[4] = (len>>24)&0xFF;
458 writeCmd[5] = (len>>16)&0xFF;
459 writeCmd[6] = (len>>8)&0xFF;
460 writeCmd[7] = (len>>0)&0xFF;
462 fStream.write(writeCmd,
sizeof(writeCmd));
463 fStream.write(ptr, len);
529 while ((ret =
readLine(size)) !=
nullptr && ret[0] !=
'\0')
531 return (ret !=
nullptr && ret[0] ==
'\0');
550 if (size > 4 && strcmp((
char*)&ret[size-4],
" DIR") == 0)
556 if (strcmp((
char*)ret,
".") == 0)
558 if (strcmp((
char*)ret,
"..") == 0)
561 if (strcmp((
char*)ret,
"~1.TRA") == 0)
563 if (strcmp((
char*)ret,
"TRASHE~1") == 0)
565 if (strcmp((
char*)ret,
"SPOTLI~1") == 0)
567 entry.
name = (
char*)ret;
576 bool play(
const char* snd,
const char* dir =
nullptr)
583 if (strncmp(str,
"Playing ", 8) == 0)
602 if (strncmp(str,
"Playing ", 8) == 0)
622 if (strncmp(str,
"Playing ", 8) == 0)
642 if (strncmp(str,
"Playing ", 8) == 0)
662 if (strncmp(str,
"Playing ", 8) == 0)
788 size_t len = strlen(str);
790 fBuffer[fPos++] = *str++;
798 size_t len = strlen(str);
800 fBuffer[fPos++] = toupper(*str++);
826 void setBassEnhancer(
int trebleControl,
int freqLimit,
int bassEnhancer,
int lowerLimit)
828 trebleControl = min(max(trebleControl, -8), 7);
829 if (trebleControl != 0)
831 freqLimit = min(max(freqLimit, 0), 15);
832 bassEnhancer = min(max(bassEnhancer, 0), 15);
833 lowerLimit = min(max(lowerLimit, 0), 15);
835 (trebleControl<<12) |
844 void sendCommand(
const char* cmd =
nullptr,
const char* arg1 =
nullptr,
const char* arg2 =
nullptr)
857 fBuffer[fPos++] =
' ';
864 fBuffer[fPos++] =
' ';
869 fBuffer[fPos++] =
'\r';
870 fStream.write(fBuffer, fPos);
904 fBuffer[fPos++] =
' ';
905 fBuffer[fPos++] = (char)arg;
907 fBuffer[fPos++] =
'\r';
908 fStream.write(fBuffer, fPos);
923 fBuffer[fPos++] =
' ';
924 fBuffer[fPos++] = (char)arg;
925 fBuffer[fPos++] = (char)(word & 0xFF);
926 fBuffer[fPos++] = (char)(word >> 8);
928 fBuffer[fPos++] =
'\r';
929 fStream.write(fBuffer, fPos);
939 if (fStream.readBytes(&data, 1) == 1)
953 if (altresponse !=
nullptr &&
954 (strlen(altresponse) == size &&
955 memcmp(altresponse, str, size) == 0))
973 if (fStream.available())
975 buffer[pos++] = fStream.read();
984 bool skipPrompt =
false;
987 if (fStream.available())
989 int ch = fStream.read();
996 fBuffer[fPos] =
'\0';
999 if (*fBuffer !=
'\0')
1015 fBuffer[fPos++] = ch;
1016 fBuffer[fPos] =
'\0';
1017 if (!skipPrompt && strcmp(fBuffer,
"D:\\>") == 0)
1026 return (uint8_t*)fBuffer;
1034 if (fStream.available())
1036 int ch = fStream.read();
1043 fBuffer[fPos] =
'\0';
1050 fBuffer[fPos++] = ch;
1051 fBuffer[fPos] =
'\0';
1055 return (uint8_t*)fBuffer;
1061 bool skipPrompt =
false;
1064 if (fStream.available())
1066 int ch = fStream.read();
1073 fBuffer[fPos] =
'\0';
1076 if (*fBuffer !=
'\0')
1092 fBuffer[fPos++] = ch;
1093 fBuffer[fPos] =
'\0';
1094 if (!skipPrompt && strcmp(fBuffer,
"D:\\>") == 0)
1103 return (uint8_t*)fBuffer;
1108 bool fAvailable =
false;
1109 bool fDriveInserted =
false;
1110 bool fPlaying =
false;