Skip to content
Snippets Groups Projects
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);
      */
}