#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); */ }