Splitting code into their own .cpp and header files

This commit is contained in:
Dionysus 2024-06-06 01:04:24 -04:00
parent 9d19af9c95
commit b0b1ee297d
Signed by: acidvegas
GPG Key ID: EF4B922DB85DC9DE
7 changed files with 251 additions and 216 deletions

View File

@ -1,5 +1,4 @@
#include <RadioLib.h>
#include "pins.h"
#include "Lora.h"
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
@ -44,19 +43,19 @@ bool setupRadio() {
return false;
}
// set output power to 10 dBm (accepted range is -17 - 22 dBm)
// Set output power to 17 dBm (accepted range is -17 - 22 dBm)
if (radio.setOutputPower(17) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) {
Serial.println(F("Selected output power is invalid for this module!"));
return false;
}
// set over current protection limit to 140 mA (accepted range is 45 - 140 mA) (set value to 0 to disable overcurrent protection)
// Set over current protection limit to 140 mA (accepted range is 45 - 140 mA)
if (radio.setCurrentLimit(140) == RADIOLIB_ERR_INVALID_CURRENT_LIMIT) {
Serial.println(F("Selected current limit is invalid for this module!"));
return false;
}
// set LoRa preamble length to 15 symbols (accepted range is 0 - 65535)
// Set LoRa preamble length to 15 symbols (accepted range is 0 - 65535)
if (radio.setPreambleLength(15) == RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH) {
Serial.println(F("Selected preamble length is invalid for this module!"));
return false;
@ -67,9 +66,6 @@ bool setupRadio() {
return false;
}
// set the function that will be called when new packet is received
//radio.setDio1Action(setFlag);
return true;
}
@ -77,14 +73,8 @@ bool setupRadio() {
bool transmit() {
int state = radio.transmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF};
int state = radio.transmit(byteArr, 8);
*/
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("Radio tramsmittion successful!"));
Serial.println(F("Radio transmission successful!"));
Serial.print(F("[SX1262] Datarate:\t"));
Serial.print(radio.getDataRate());
Serial.println(F(" bps"));
@ -112,22 +102,18 @@ void recvLoop() {
if (state == RADIOLIB_ERR_NONE) {
Serial.print(F("[RADIO] Received packet!"));
Serial.print(F(" Data:"));
Serial.print(recv);
Serial.print(F(" RSSI:"));
Serial.print(radio.getRSSI());
Serial.print(F(" dBm"));
// snprintf(dispRecvicerBuff[1], sizeof(dispRecvicerBuff[1]), "RSSI:%.2f dBm", radio.getRSSI());
Serial.print(F(" SNR:"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
Serial.println(F("CRC error!"));
} else {
Serial.print(F("failed, code "));
Serial.print(F("Failed, code "));
Serial.println(state);
}
} else {

11
src/Lora.h Normal file
View File

@ -0,0 +1,11 @@
#pragma once
#include <RadioLib.h>
#include "pins.h"
extern SX1262 radio;
bool setupRadio();
bool transmit();
void recvLoop();

75
src/Speaker.cpp Normal file
View File

@ -0,0 +1,75 @@
#include "Speaker.h"
void setupI2S() {
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.intr_alloc_flags = 0,
.dma_buf_count = 8,
.dma_buf_len = 64,
.use_apll = false,
.tx_desc_auto_clear = true,
.fixed_mclk = 0
};
i2s_pin_config_t pin_config = {
.bck_io_num = BOARD_I2S_BCK,
.ws_io_num = BOARD_I2S_WS,
.data_out_num = BOARD_I2S_DOUT,
.data_in_num = I2S_PIN_NO_CHANGE
};
i2s_driver_install(BOARD_I2S_PORT, &i2s_config, 0, NULL);
i2s_set_pin(BOARD_I2S_PORT, &pin_config);
i2s_set_clk(BOARD_I2S_PORT, SAMPLE_RATE, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO);
}
void playTone(float frequency, int duration, int volume) {
volume = constrain(volume, 0, 32767);
const int wave_period = SAMPLE_RATE / frequency;
int16_t sample_buffer[wave_period];
for (int i = 0; i < wave_period; ++i)
sample_buffer[i] = (i < wave_period / 2) ? volume : -volume;
int total_samples = SAMPLE_RATE * duration / 1000;
int samples_written = 0;
while (samples_written < total_samples) {
int to_write = min(wave_period, total_samples - samples_written);
i2s_write(BOARD_I2S_PORT, sample_buffer, to_write * sizeof(int16_t), (size_t *)&to_write, portMAX_DELAY);
samples_written += to_write;
}
}
void playRTTTL(const char* rtttl) {
static AudioGeneratorRTTTL *rtttlGenerator = new AudioGeneratorRTTTL();
static AudioOutputI2S *audioOutput = new AudioOutputI2S();
static AudioFileSourcePROGMEM *fileSource = new AudioFileSourcePROGMEM(rtttl, strlen(rtttl));
audioOutput->begin();
rtttlGenerator->begin(fileSource, audioOutput);
while (rtttlGenerator->isRunning())
rtttlGenerator->loop();
rtttlGenerator->stop();
fileSource->close();
}
void playNotificationSound() {
playTone(1000, 150);
delay(100);
playTone(1500, 150);
delay(100);
playTone(2000, 150);
delay(100);
playTone(500, 150);
}

View File

@ -8,80 +8,10 @@
#include "pins.h"
#define BOARD_I2S_PORT I2S_NUM_0
#define SAMPLE_RATE 44100
void setupI2S() {
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.intr_alloc_flags = 0,
.dma_buf_count = 8,
.dma_buf_len = 64,
.use_apll = false,
.tx_desc_auto_clear = true,
.fixed_mclk = 0
};
i2s_pin_config_t pin_config = {
.bck_io_num = BOARD_I2S_BCK,
.ws_io_num = BOARD_I2S_WS,
.data_out_num = BOARD_I2S_DOUT,
.data_in_num = I2S_PIN_NO_CHANGE
};
i2s_driver_install(BOARD_I2S_PORT, &i2s_config, 0, NULL);
i2s_set_pin(BOARD_I2S_PORT, &pin_config);
i2s_set_clk(BOARD_I2S_PORT, SAMPLE_RATE, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO);
}
void playTone(float frequency, int duration, int volume = 16383) {
volume = constrain(volume, 0, 32767);
const int wave_period = SAMPLE_RATE / frequency;
int16_t sample_buffer[wave_period];
for (int i = 0; i < wave_period; ++i)
sample_buffer[i] = (i < wave_period / 2) ? volume : -volume;
int total_samples = SAMPLE_RATE * duration / 1000;
int samples_written = 0;
while (samples_written < total_samples) {
int to_write = min(wave_period, total_samples - samples_written);
i2s_write(BOARD_I2S_PORT, sample_buffer, to_write * sizeof(int16_t), (size_t *)&to_write, portMAX_DELAY);
samples_written += to_write;
}
}
void playRTTTL(const char* rtttl) {
static AudioGeneratorRTTTL *rtttlGenerator = new AudioGeneratorRTTTL();
static AudioOutputI2S *audioOutput = new AudioOutputI2S();
static AudioFileSourcePROGMEM *fileSource = new AudioFileSourcePROGMEM(rtttl, strlen(rtttl));
audioOutput->begin();
rtttlGenerator->begin(fileSource, audioOutput);
while (rtttlGenerator->isRunning())
rtttlGenerator->loop();
rtttlGenerator->stop();
fileSource->close();
}
void playNotificationSound() {
playTone(1000, 150);
delay(100);
playTone(1500, 150);
delay(100);
playTone(2000, 150);
delay(100);
playTone(500, 150);
}
void setupI2S();
void playTone(float frequency, int duration, int volume = 16383);
void playRTTTL(const char* rtttl);
void playNotificationSound();

120
src/Storage.cpp Normal file
View File

@ -0,0 +1,120 @@
#include "Storage.h"
Preferences preferences;
String irc_nickname;
String irc_username;
String irc_realname;
String irc_server;
int irc_port;
bool irc_tls;
String irc_channel;
String irc_nickserv;
String wifi_ssid;
String wifi_password;
void loadPreferences() {
preferences.begin("config", false);
// IRC preferences
if (!preferences.isKey("irc_nickname"))
preferences.putString("irc_nickname", "ACID_" + String(random(1000, 10000)));
irc_nickname = preferences.getString("irc_nickname");
if (!preferences.isKey("irc_username"))
preferences.putString("irc_username", "tdeck");
irc_username = preferences.getString("irc_username");
if (!preferences.isKey("irc_realname"))
preferences.putString("irc_realname", "ACID DROP Firmware");
irc_realname = preferences.getString("irc_realname");
if (!preferences.isKey("irc_server"))
preferences.putString("irc_server", "irc.supernets.org");
irc_server = preferences.getString("irc_server");
if (!preferences.isKey("irc_port"))
preferences.putInt("irc_port", 6667);
irc_port = preferences.getInt("irc_port");
if (!preferences.isKey("irc_tls"))
preferences.putBool("irc_tls", false);
irc_tls = preferences.getBool("irc_tls");
if (!preferences.isKey("irc_channel"))
preferences.putString("irc_channel", "#comms");
irc_channel = preferences.getString("irc_channel");
if (!preferences.isKey("irc_nickserv"))
preferences.putString("irc_nickserv", "");
irc_nickserv = preferences.getString("irc_nickserv");
// WiFi preferences
if (!preferences.isKey("wifi_ssid"))
preferences.putString("wifi_ssid", "");
wifi_ssid = preferences.getString("wifi_ssid");
if (!preferences.isKey("wifi_password"))
preferences.putString("wifi_password", "");
wifi_password = preferences.getString("wifi_password");
preferences.end();
}
bool mountSD() {
if (SD.begin(BOARD_SDCARD_CS, SPI, 800000U)) {
uint8_t cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
return false;
} else {
Serial.print("SD Card Type: ");
if (cardType == CARD_MMC)
Serial.println("MMC");
else if (cardType == CARD_SD)
Serial.println("SDSC");
else if (cardType == CARD_SDHC)
Serial.println("SDHC");
else
Serial.println("UNKNOWN");
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
uint32_t cardTotal = SD.totalBytes() / (1024 * 1024);
uint32_t cardUsed = SD.usedBytes() / (1024 * 1024);
Serial.printf("SD Card Size: %lu MB\n", cardSize);
Serial.printf("Total space: %lu MB\n", cardTotal);
Serial.printf("Used space: %lu MB\n", cardUsed);
return true;
}
}
return false;
}
void setupSD() {
pinMode(BOARD_SDCARD_CS, OUTPUT);
digitalWrite(BOARD_SDCARD_CS, HIGH);
pinMode(BOARD_SPI_MISO, INPUT_PULLUP);
SPI.begin(BOARD_SPI_SCK, BOARD_SPI_MISO, BOARD_SPI_MOSI);
}
void wipeNVS() {
esp_err_t err = nvs_flash_erase();
if (err == ESP_OK)
Serial.println("NVS flash erase successful.");
else
Serial.println("Error erasing NVS flash!");
err = nvs_flash_init();
if (err == ESP_OK)
Serial.println("NVS flash init successful.");
else
Serial.println("Error initializing NVS flash!");
}

26
src/Storage.h Normal file
View File

@ -0,0 +1,26 @@
#pragma once
#include <Arduino.h>
#include <Preferences.h>
#include "nvs_flash.h"
#include <SD.h>
#include "pins.h"
extern Preferences preferences;
extern String irc_nickname;
extern String irc_username;
extern String irc_realname;
extern String irc_server;
extern int irc_port;
extern bool irc_tls;
extern String irc_channel;
extern String irc_nickserv;
extern String wifi_ssid;
extern String wifi_password;
void loadPreferences();
bool mountSD();
void setupSD();
void wipeNVS();

View File

@ -5,7 +5,6 @@
// Aurduino includes
#include <esp_wifi.h> // Needed for Mac spoofing
#include "nvs_flash.h"
#include <Pangodream_18650_CL.h> // Power management
#include <Preferences.h>
#include <SD.h>
@ -17,7 +16,9 @@
// Local includes
#include "bootScreen.h"
#include "Lora.h"
#include "pins.h"
#include "Storage.h"
#include "Speaker.h"
@ -39,7 +40,6 @@ struct WiFiNetwork {
// Initialize components and objects
Pangodream_18650_CL BL(BOARD_BAT_ADC, CONV_FACTOR, READS);
Preferences preferences;
TFT_eSPI tft = TFT_eSPI();
WiFiClient* client;
@ -50,16 +50,7 @@ std::vector<bool> mentions;
std::vector<WiFiNetwork> wifiNetworks;
// Global variables to cache preferences and buffers
String irc_nickname;
String irc_username;
String irc_realname;
String irc_server;
int irc_port;
bool irc_tls;
String irc_channel;
String irc_nickserv;
String wifi_ssid;
String wifi_password;
String inputBuffer = "";
// Leftover crack variables (will be removed when preferences are done)
@ -141,14 +132,11 @@ void setup() {
setBrightness(8); // Set the screen brightness to 50%)
// Give power to the SD card
pinMode(BOARD_SDCARD_CS, OUTPUT);
digitalWrite(BOARD_SDCARD_CS, HIGH);
pinMode(BOARD_SPI_MISO, INPUT_PULLUP);
SPI.begin(BOARD_SPI_SCK, BOARD_SPI_MISO, BOARD_SPI_MOSI);
//setupSD();
//mountSD();
// Turn on power to the radio
pinMode(RADIO_CS_PIN, OUTPUT);
digitalWrite(RADIO_CS_PIN, HIGH);
//setupRadio();
// Start the I2C bus for the keyboard
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
@ -263,55 +251,6 @@ void loop() {
}
}
void loadPreferences() {
preferences.begin("config", false);
// IRC preferences
if (!preferences.isKey("irc_nickname"))
preferences.putString("irc_nickname", "ACID_" + String(random(1000, 10000)));
irc_nickname = preferences.getString("irc_nickname");
if (!preferences.isKey("irc_username"))
preferences.putString("irc_username", "tdeck");
irc_username = preferences.getString("irc_username");
if (!preferences.isKey("irc_realname"))
preferences.putString("irc_realname", "ACID DROP Firmware");
irc_realname = preferences.getString("irc_realname");
if (!preferences.isKey("irc_server"))
preferences.putString("irc_server", "irc.supernets.org");
irc_server = preferences.getString("irc_server");
if (!preferences.isKey("irc_port"))
preferences.putInt("irc_port", 6667);
irc_port = preferences.getInt("irc_port");
if (!preferences.isKey("irc_tls"))
preferences.putBool("irc_tls", false);
irc_tls = preferences.getBool("irc_tls");
if (!preferences.isKey("irc_channel"))
preferences.putString("irc_channel", "#comms");
irc_channel = preferences.getString("irc_channel");
if (!preferences.isKey("irc_nickserv"))
preferences.putString("irc_nickserv", "");
irc_nickserv = preferences.getString("irc_nickserv");
// WiFi preferences
if (!preferences.isKey("wifi_ssid"))
preferences.putString("wifi_ssid", "");
wifi_ssid = preferences.getString("wifi_ssid");
if (!preferences.isKey("wifi_password"))
preferences.putString("wifi_password", "");
wifi_password = preferences.getString("wifi_password");
preferences.end();
}
// ------------------------------------------------------------------------------------------------
@ -866,43 +805,6 @@ void setBrightness(uint8_t value) {
}
bool setupSD() {
digitalWrite(BOARD_SDCARD_CS, HIGH);
digitalWrite(RADIO_CS_PIN, HIGH);
digitalWrite(BOARD_TFT_CS, HIGH);
if (SD.begin(BOARD_SDCARD_CS, SPI, 800000U)) {
uint8_t cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD_MMC card attached");
return false;
} else {
Serial.print("SD_MMC Card Type: ");
if (cardType == CARD_MMC)
Serial.println("MMC");
else if (cardType == CARD_SD)
Serial.println("SDSC");
else if (cardType == CARD_SDHC)
Serial.println("SDHC");
else
Serial.println("UNKNOWN");
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
uint32_t cardTotal = SD.totalBytes() / (1024 * 1024);
uint32_t cardUsed = SD.usedBytes() / (1024 * 1024);
Serial.printf("SD Card Size: %lu MB\n", cardSize);
Serial.printf("Total space: %lu MB\n", cardTotal);
Serial.printf("Used space: %lu MB\n", cardUsed);
return true;
}
}
return false;
}
void turnOffScreen() {
Serial.println("Screen turned off");
tft.writecommand(TFT_DISPOFF);
@ -1539,18 +1441,3 @@ void printDeviceInfo() {
tft.setCursor(0, line * 16); tft.setTextColor(TFT_CYAN); tft.print("WiFi Info: "); tft.setTextColor(TFT_WHITE); tft.println("Not connected"); line++;
}
}
void wipeNVS() {
esp_err_t err = nvs_flash_erase();
if (err == ESP_OK)
Serial.println("NVS flash erase successful.");
else
Serial.println("Error erasing NVS flash!");
err = nvs_flash_init();
if (err == ESP_OK)
Serial.println("NVS flash init successful.");
else
Serial.println("Error initializing NVS flash!");
}