main.cpp 7.60 KiB
#include <Arduino.h>
#include <RotaryEncoder.h>
#include <SD.h>
#include <SPI.h>
#include <USBComposite.h>
#include <oled.h>
char dial[] = {'0','1','2','3','4','5','6','7','8','9','A','a','B','b','C','c',3};
#define PIN_A \
PB4 // ky-040 clk pin, add 100nF/0.1uF capacitors between pin & ground!!!
#define PIN_B \
PB5 // ky-040 dt pin, add 100nF/0.1uF capacitors between pin & ground!!!
#define BUTTON \
PA9 // ky-040 sw pin, add 100nF/0.1uF capacitors between pin & ground!!!
int16_t position = 0;
RotaryEncoder encoder(PIN_A, PIN_B, BUTTON);
void encoderISR() { encoder.readAB(); }
void encoderButtonISR() { encoder.readPushButton(); }
File root;
File myFile;
File curDir;
#define CMD_BUFFER_SIZE 255
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
USBSerial VirtSerial;
USBHID HID;
HIDKeyboard Keyboard(HID, 0);
void printDirectory(File dir) {
while (true) {
File entry = dir.openNextFile();
if (!entry) {
// no more files
break;
}
if (entry.isDirectory()) {
VirtSerial.print(entry.name());
VirtSerial.println("/");
// printDirectory(entry);
} else {
VirtSerial.print("\e[0;34m");
VirtSerial.print(entry.name());
VirtSerial.print("\e[0m");
// files have sizes, directories do not
VirtSerial.print(" ");
VirtSerial.println(entry.size(), DEC);
}
entry.close();
}
}
void ls(void) {
printDirectory(curDir);
curDir.rewindDirectory();
}
void cat(String catFile) {
myFile = SD.open(catFile);
while (myFile.available()) {
char buf = (char)myFile.read();
VirtSerial.print(buf);
}
VirtSerial.println("");
}
void cd(String nextDir) { curDir = SD.open(nextDir); }
void printLogoSerial() {
root = SD.open("/");
myFile = SD.open("logo", FILE_READ);
VirtSerial.println("\e[1;96m");
// VirtSerial.println("\e[5m");
if (myFile) {
while (myFile.available()) {
VirtSerial.print((char)myFile.read());
}
} else {
VirtSerial.println("can't open logo");
}
VirtSerial.print("\e[0m");
}
int initSDCard(int verbose) {
if (verbose == 1) {
if (!SD.begin(PA4)) {
printDebugString("SD card failed");
return 1;
}
printDebugString("SD init done");
return 0;
} else {
if (!SD.begin(PA4)) {
return 1;
}
return 0;
}
}
void newpassword(void) {
VirtSerial.println("new password cannot be added yet: not implemented");
}
void removepassword() {
VirtSerial.println("you cant remove remove passwords: not implemented");
}
void start_console(void) {
// for (size_t i = 0; i < sizeof(BANNER); i++)
// {
// /* code */
// }
while (true) {
char cmdbuf[CMD_BUFFER_SIZE] = {0};
int chars_read = 0;
VirtSerial.write("> ");
for (size_t i = 0; i < CMD_BUFFER_SIZE - 1; i++) {
char buf;
VirtSerial.read((uint8*)&buf, 1);
if (buf != '\r') {
if (buf == '\t') {
VirtSerial.println("Avalable commands:");
VirtSerial.println(
"ls cd remove password new password cat");
VirtSerial.print("> ");
buf = NULL;
}
cmdbuf[i] = buf;
VirtSerial.write(buf);
chars_read++;
continue;
} else {
VirtSerial.println();
break;
}
}
if (chars_read < 1) {
continue;
}
if (strcmp("new password", cmdbuf) == 0) {
newpassword();
} else if (strcmp("remove password", cmdbuf) == 0) {
removepassword();
} else if (strcmp("ls", cmdbuf) == 0) {
ls();
} else if (strcmp("cat", cmdbuf) == 0) {
char cmdbuf[CMD_BUFFER_SIZE] = {0};
int chars_read = 0;
VirtSerial.print("cat file >");
for (size_t i = 0; i < CMD_BUFFER_SIZE - 1; i++) {
char buf;
VirtSerial.read((uint8*)&buf, 1);
if (buf != '\r') {
cmdbuf[i] = buf;
VirtSerial.write(buf);
chars_read++;
continue;
} else {
VirtSerial.println();
break;
}
}
if (chars_read < 1) {
continue;
}
cat(cmdbuf);
} else if (strcmp("cd", cmdbuf) == 0) {
char cmdbuf[CMD_BUFFER_SIZE] = {0};
int chars_read = 0;
VirtSerial.print("enter dir >");
for (size_t i = 0; i < CMD_BUFFER_SIZE - 1; i++) {
char buf;
VirtSerial.read((uint8*)&buf, 1);
if (buf != '\r') {
cmdbuf[i] = buf;
VirtSerial.write(buf);
chars_read++;
continue;
} else {
VirtSerial.println();
break;
}
}
if (chars_read < 1) {
continue;
}
cd(cmdbuf);
} else {
VirtSerial.println();
char out[512] = {0};
snprintf(out, 512, "command not found: %s", cmdbuf);
VirtSerial.println(out);
}
VirtSerial.flush();
}
while (true) {
}
}
void setup(void) {
VirtSerial.begin(9600);
encoder.begin();
attachInterrupt(
digitalPinToInterrupt(PIN_B), encoderISR,
CHANGE); // call encoderISR() every high->low or low->high changes
attachInterrupt(
digitalPinToInterrupt(PIN_A), encoderISR,
CHANGE); // call encoderISR() every high->low or low->high changes
attachInterrupt(digitalPinToInterrupt(BUTTON), encoderButtonISR,
CHANGE); // call pushButtonISR() every high->low changes
// while (!USBComposite);
// HID.begin(HID_BOOT_KEYBOARD);
// Keyboard.begin();
initOled();
printLogoDisplay();
delay(500);
initSDCard(1);
delay(200);
printDebugString("wait for serial");
while (!VirtSerial.available()) {
if (millis() % 100 == 0) {
VirtSerial.print('\t');
}
}
printDebugString("serial done");
delay(200);
VirtSerial.flush();
printLogoSerial();
curDir = SD.open("/");
// start_console();
VirtSerial.print(' ');
}
void loop(void) {
byte newPos = abs((encoder.getPosition() / 2)) % 17;
if (position != newPos) {
position = newPos;
VirtSerial.write('\b');
VirtSerial.print("\e[0;34m");
VirtSerial.print(dial[position]);
VirtSerial.print("\e[0m");
}
if (encoder.getPushButton() == true) {
if (dial[position]!=3)
{
VirtSerial.write('\b');
Serial.print(dial[position]);
VirtSerial.print("\e[0;34m");
VirtSerial.print(dial[position]);
VirtSerial.print("\e[0m");
while (encoder.getPushButton() == true) {
/* code */
}
delay(400);
}else{
VirtSerial.print("\n");
}
}
/*
position = encoder.getPosition();
position = abs((encoder.getPosition()/2))%10;
if (encoder.getPushButton() == true) Serial.println(F("PRESSED"));
VirtSerial.println(abs((position/2))%10);
*/
}