Files
QuadMeUp_Crossbow/crossbow/tx_oled.cpp
Pawel Spychalski 948cc7915b RadioState removed
2018-05-16 13:36:22 +02:00

205 lines
4.6 KiB
C++

#include "tx_oled.h"
TxOled::TxOled(void) {
Adafruit_SSD1306 _display(-1);
}
void TxOled::init() {
_display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
_display.setTextSize(1);
_display.setTextColor(WHITE);
_display.clearDisplay();
_display.display();
}
void TxOled::loop(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState,
Tactile *button0,
Tactile *button1
) {
bool update = false;
//Depending on page, things might be different
switch (_page) {
case TX_PAGE_INIT:
//Second button has notthing to do over here
break;
case TX_PAGE_STATS:
//Second button refreshes this page
if (button1->getState() == TACTILE_STATE_SHORT_PRESS) {
update = true;
}
break;
}
//Short press of button0 always toggles no next page
if (button0->getState() == TACTILE_STATE_SHORT_PRESS) {
_mainPageSequenceIndex++;
if (_mainPageSequenceIndex == TX_OLED_PAGE_COUNT) {
_mainPageSequenceIndex = 0;
}
update = true;
}
if (update) {
page(
rxDeviceState,
txDeviceState,
pageSequence[_mainPageSequenceIndex]
);
}
}
void TxOled::page(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState,
int page
) {
switch (page) {
case TX_PAGE_INIT:
renderPageInit(rxDeviceState, txDeviceState);
break;
case TX_PAGE_STATS:
renderPageStats(rxDeviceState, txDeviceState);
break;
case TX_PAGE_PWR:
renderPagePwr(rxDeviceState, txDeviceState);
break;
case TX_PAGE_BIND:
renderPageBind(rxDeviceState, txDeviceState);
break;
case TX_PAGE_MODE:
renderPageMode(rxDeviceState, txDeviceState);
break;
}
_page = page;
}
void TxOled::renderPagePwr(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState
) {
_display.clearDisplay();
_display.setTextColor(WHITE, BLACK);
_display.setCursor(0, 0);
_display.setTextSize(2);
_display.print("PWR");
//TODO content
_display.setCursor(0, 25);
_display.setTextSize(3);
_display.print(radioNode.loraTxPower);
_display.print("dBm");
_display.display();
}
void TxOled::renderPageBind(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState
) {
_display.clearDisplay();
_display.setTextColor(WHITE, BLACK);
_display.setCursor(0, 0);
_display.setTextSize(2);
_display.print("Bind");
//TODO content
_display.display();
}
void TxOled::renderPageMode(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState
) {
_display.clearDisplay();
_display.setTextColor(WHITE, BLACK);
_display.setCursor(0, 0);
_display.setTextSize(2);
_display.print("Mode");
_display.setCursor(0, 25);
_display.setTextSize(3);
_display.print("Full");
_display.display();
}
void TxOled::renderPageStats(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState
) {
_display.clearDisplay();
_display.setTextColor(WHITE, BLACK);
_display.setCursor(0, 0);
_display.setTextSize(3);
_display.print(radioNode.rssi);
_display.setCursor(18, 28);
_display.setTextSize(2);
_display.print(radioNode.snr);
_display.setCursor(74, 0);
_display.setTextSize(3);
_display.print(rxDeviceState->rssi);
_display.setCursor(92, 28);
_display.setTextSize(2);
_display.print(rxDeviceState->snr);
_display.setCursor(54, 48);
_display.setTextSize(2);
_display.print(txDeviceState->roundtrip);
_display.display();
}
void TxOled::renderPageInit(
RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState
) {
_display.clearDisplay();
_display.setTextColor(WHITE, BLACK);
_display.setTextSize(2);
_display.setCursor(0, 0);
_display.print("Rdy ");
_display.print(radioNode.loraTxPower);
_display.print("dBm");
_display.setTextSize(1);
_display.setCursor(0, 32);
_display.print("Bandwitdh: ");
_display.print(radioNode.loraBandwidth / 1000);
_display.print("kHz");
_display.setCursor(0, 42);
_display.print("SF: ");
_display.print(radioNode.loraSpreadingFactor);
_display.setCursor(64, 42);
_display.print("CR: ");
_display.print(radioNode.loraCodingRate);
_display.setCursor(0, 52);
_display.print("Rate: ");
_display.print(1000 / TX_TRANSMIT_SLOT_RATE);
_display.print("Hz");
_display.display();
}