/** * @file gravity.cpp * @author Adam Wonak (https://github.com/awonak) * @brief Library for building custom scripts for the Sitka Instruments Gravity module. * @version 0.1 * @date 2025-04-19 * * @copyright Copyright (c) 2025 * */ #include "gravity.h" void Gravity::Init() { InitClock(); InitInputs(); InitOutputs(); InitDisplay(); } void Gravity::InitClock() { clock = new Clock(); clock->Init(); } void Gravity::InitInputs() { shift_button = new Button(); play_button = new Button(); shift_button->Init(SHIFT_BTN_PIN); play_button->Init(PLAY_BTN_PIN); cv1 = new AnalogInput(); cv2 = new AnalogInput(); cv1->Init(CV1_PIN); cv2->Init(CV2_PIN); encoder = new EncoderDir(); // Pin Change Interrupts for Encoder. // Thanks to https://dronebotworkshop.com/interrupts/ // Enable both PCIE2 Bit3 (Port D), and PCIE1 Bit2 (Port C). PCICR |= B00000110; // Select PCINT23 Bit4 = 1 (Pin D4) PCMSK2 |= B00010000; // Select PCINT11 Bit3 (Pin D17/A3) PCMSK1 |= B00001000; } void Gravity::InitOutputs() { // Initialize each of the outputs with it's GPIO pins and probability. outputs[0].Init(OUT_CH1); outputs[1].Init(OUT_CH2); outputs[2].Init(OUT_CH3); outputs[3].Init(OUT_CH4); outputs[4].Init(OUT_CH5); outputs[5].Init(OUT_CH6); } void Gravity::InitDisplay() { display = new Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // OLED Display configuration. display->begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS); delay(1000); display->setRotation(2); // rotates text on OLED 1=90 degrees, 2=180 degrees display->clearDisplay(); display->setTextSize(1); display->setTextColor(WHITE); display->display(); } void Gravity::Process() { // Read peripherials for changes. shift_button->Process(); play_button->Process(); encoder->Process(); cv1->Process(); cv2->Process(); // Update Output states. for (int i; i < OUTPUT_COUNT; i++) { outputs[i].Process(); } } void ReadEncoder() { gravity.encoder->UpdateEncoder(); } // Define Encoder pin ISR. // Pin Change Interrupt on Port C (D17/A3). ISR(PCINT2_vect) { ReadEncoder(); }; // Pin Change Interrupt on Port D (D4). ISR(PCINT1_vect) { ReadEncoder(); }; // Singleton Gravity gravity;