387 lines
7.9 KiB
C
387 lines
7.9 KiB
C
#include <app.h>
|
|
#include <main.h>
|
|
#include <st7735.h>
|
|
#include <RotaryCoder.h>
|
|
#include <KT0915.h>
|
|
|
|
uint8_t app_setup(void){
|
|
|
|
}
|
|
/*
|
|
Shows the static content on display
|
|
*/
|
|
void showTemplate()
|
|
{
|
|
|
|
int maxX1 = tft.width() - 2;
|
|
int maxY1 = tft.height() - 5;
|
|
|
|
tft.fillScreen(COLOR_BLACK);
|
|
|
|
tft.drawRect(2, 2, maxX1, maxY1, COLOR_YELLOW);
|
|
tft.drawLine(2, 40, maxX1, 40, COLOR_YELLOW);
|
|
tft.drawLine(2, 60, maxX1, 60, COLOR_YELLOW);
|
|
}
|
|
|
|
void clearStatus()
|
|
{
|
|
|
|
char *unit;
|
|
char *bandMode;
|
|
|
|
int maxX1 = tft.width() - 6;
|
|
int maxY1 = tft.height() - 6;
|
|
|
|
tft.fillRect(3, 3, maxX1, 35, COLOR_BLACK);
|
|
// tft.fillRect(3,61,maxX1, maxY1 - 61, COLOR_BLACK);
|
|
|
|
if (band[bandIdx].mode == MODE_FM)
|
|
{
|
|
unit = (char *)"MHz";
|
|
bandMode = (char *)"FM";
|
|
}
|
|
else
|
|
{
|
|
unit = (char *)"KHz";
|
|
bandMode = (char *)"AM";
|
|
}
|
|
tft.setFont(&Serif_plain_7);
|
|
printValue(135, 15, oldMode, bandMode, 7, COLOR_YELLOW);
|
|
printValue(135, 36, oldUnit, unit, 7, COLOR_YELLOW);
|
|
}
|
|
|
|
/*
|
|
Prevents blinking during the frequency display.
|
|
Erases the old digits if it has changed and print the new digit values.
|
|
*/
|
|
void printValue(int col, int line, char *oldValue, char *newValue, uint8_t space, uint16_t color)
|
|
{
|
|
int c = col;
|
|
char *pOld;
|
|
char *pNew;
|
|
|
|
pOld = oldValue;
|
|
pNew = newValue;
|
|
|
|
// prints just changed digits
|
|
while (*pOld && *pNew)
|
|
{
|
|
if (*pOld != *pNew)
|
|
{
|
|
// Erases olde value
|
|
tft.setTextColor(COLOR_BLACK);
|
|
tft.setCursor(c, line);
|
|
tft.print(*pOld);
|
|
// Writes new value
|
|
tft.setTextColor(color);
|
|
tft.setCursor(c, line);
|
|
tft.print(*pNew);
|
|
}
|
|
pOld++;
|
|
pNew++;
|
|
c += space;
|
|
}
|
|
|
|
// Is there anything else to erase?
|
|
tft.setTextColor(COLOR_BLACK);
|
|
while (*pOld)
|
|
{
|
|
tft.setCursor(c, line);
|
|
tft.print(*pOld);
|
|
pOld++;
|
|
c += space;
|
|
}
|
|
|
|
// Is there anything else to print?
|
|
tft.setTextColor(color);
|
|
while (*pNew)
|
|
{
|
|
tft.setCursor(c, line);
|
|
tft.print(*pNew);
|
|
pNew++;
|
|
c += space;
|
|
}
|
|
|
|
// Save the current content to be tested next time
|
|
strcpy(oldValue, newValue);
|
|
}
|
|
|
|
/*
|
|
Shows frequency information on Display
|
|
*/
|
|
void showFrequency()
|
|
{
|
|
char freq[15];
|
|
char aux[15];
|
|
|
|
currentFrequency = rx.getFrequency();
|
|
|
|
// Serial.println(currentFrequency);
|
|
|
|
tft.setFont(&DSEG7_Classic_Mini_Regular_30);
|
|
tft.setTextSize(1);
|
|
|
|
if (band[bandIdx].mode == MODE_FM) // FM
|
|
{
|
|
sprintf(aux, "%6.6lu", currentFrequency);
|
|
freq[0] = aux[0];
|
|
freq[1] = aux[1];
|
|
freq[2] = aux[2];
|
|
freq[3] = '\0';
|
|
freq[4] = aux[3];
|
|
freq[5] = aux[4];
|
|
freq[6] = '\0';
|
|
|
|
printValue(2, 36, &oldFreq[0], &freq[0], 23, COLOR_RED);
|
|
printValue(82, 36, &oldFreq[4], &freq[4], 23, COLOR_RED);
|
|
tft.setCursor(80, 35);
|
|
tft.print('.');
|
|
}
|
|
else // AM
|
|
{
|
|
sprintf(aux, "%5lu", currentFrequency);
|
|
freq[0] = aux[0];
|
|
freq[1] = aux[1];
|
|
freq[2] = aux[2];
|
|
freq[3] = aux[3];
|
|
freq[4] = aux[4];
|
|
freq[5] = '\0';
|
|
printValue(2, 36, &oldFreq[0], &freq[0], 23, COLOR_RED);
|
|
}
|
|
}
|
|
|
|
/*
|
|
Show some basic information on display
|
|
*/
|
|
void showStatus()
|
|
{
|
|
resetBuffer();
|
|
clearStatus();
|
|
showFrequency();
|
|
showVolume();
|
|
showBandwidth();
|
|
}
|
|
|
|
/* *******************************
|
|
Shows RSSI status
|
|
*/
|
|
void showRSSI()
|
|
{
|
|
/*
|
|
char rssi[15];
|
|
|
|
// Check AM or FM
|
|
sprintf(rssi, "%3.3udBuV", (band[bandIdx].mode == MODE_FM)? rx.getFmRssi():rx.getAmRssi());
|
|
tft.setFont(&Serif_plain_14);
|
|
tft.setTextSize(1);
|
|
printValue(5, 55, oldRssi, rssi, 11, COLOR_WHITE);
|
|
*/
|
|
}
|
|
|
|
void showBandwidth()
|
|
{
|
|
char sBw[15];
|
|
|
|
if (band[bandIdx].mode != MODE_AM)
|
|
return;
|
|
|
|
sprintf(sBw, "%cKHz", am_bw[bwIdx]);
|
|
|
|
tft.setFont(&Serif_plain_14);
|
|
tft.setTextSize(1);
|
|
printValue(5, 80, oldBW, sBw, 11, COLOR_WHITE);
|
|
}
|
|
|
|
void showStereo()
|
|
{
|
|
// char stereo[10];
|
|
// sprintf(stereo, "%s", (rx.isFmStereo()) ? "St" : "Mo");
|
|
// tft.setFont(&Serif_plain_14);
|
|
// tft.setTextSize(1);
|
|
// printValue(125, 55, oldStereo, stereo, 15, COLOR_WHITE);
|
|
}
|
|
|
|
/*
|
|
Shows the volume level on LCD
|
|
*/
|
|
void showVolume()
|
|
{
|
|
// char sVolume[15];
|
|
// sprintf(sVolume, "Vol: %2.2u", rx.getVolume());
|
|
// printValue(80, 56, oldVolume, sVolume, 6, 1);
|
|
}
|
|
|
|
/*********************************************************
|
|
|
|
*********************************************************/
|
|
|
|
void showSplash()
|
|
{
|
|
// Splash
|
|
tft.setFont(&Serif_plain_14);
|
|
tft.setTextSize(1);
|
|
tft.setTextColor(COLOR_YELLOW);
|
|
tft.setCursor(45, 23);
|
|
tft.print("KT0915");
|
|
tft.setCursor(15, 50);
|
|
tft.print("Arduino Library");
|
|
tft.setCursor(25, 80);
|
|
tft.print("By PU2CLR");
|
|
tft.setFont(&Serif_plain_14);
|
|
tft.setTextSize(0);
|
|
tft.setCursor(12, 110);
|
|
tft.print("Ricardo L. Caratti");
|
|
delay(4000);
|
|
}
|
|
|
|
void bandUp()
|
|
{
|
|
// save the current frequency for the band
|
|
band[bandIdx].default_frequency = currentFrequency;
|
|
|
|
if (bandIdx < lastBand)
|
|
{
|
|
bandIdx++;
|
|
}
|
|
else
|
|
{
|
|
bandIdx = 0;
|
|
}
|
|
useBand();
|
|
}
|
|
|
|
void bandDown()
|
|
{
|
|
// save the current frequency for the band
|
|
band[bandIdx].default_frequency = currentFrequency;
|
|
|
|
if (bandIdx > 0)
|
|
{
|
|
bandIdx--;
|
|
}
|
|
else
|
|
{
|
|
bandIdx = lastBand;
|
|
}
|
|
useBand();
|
|
}
|
|
|
|
void useBand()
|
|
{
|
|
|
|
if (band[bandIdx].mode == MODE_FM)
|
|
{
|
|
rx.setFM(band[bandIdx].minimum_frequency, band[bandIdx].maximum_frequency, band[bandIdx].default_frequency, band[bandIdx].step);
|
|
rx.setDeEmphasis(DE_EMPHASIS_75);
|
|
// rx.setSoftMute(TURN_OFF);
|
|
rx.setFmAfc(TURN_ON);
|
|
rx.setMono(TURN_OFF); // Force stereo
|
|
}
|
|
else
|
|
{
|
|
rx.setAM(band[bandIdx].minimum_frequency, band[bandIdx].maximum_frequency, band[bandIdx].default_frequency, band[bandIdx].step);
|
|
rx.setAmAfc(TURN_ON);
|
|
rx.setSoftMute(TURN_OFF);
|
|
rx.setAmSpace(0); // Sets Am space channel to 1Khz.
|
|
}
|
|
delay(100);
|
|
currentFrequency = band[bandIdx].default_frequency;
|
|
rx.setFrequency(currentFrequency);
|
|
showStatus();
|
|
}
|
|
|
|
/**
|
|
* Used to test the receiver functions implemented by the library
|
|
*/
|
|
void doBandwidth()
|
|
{
|
|
if (bwIdx == 3)
|
|
bwIdx = 0;
|
|
bwIdx++;
|
|
rx.setAmBandwidth(bwIdx);
|
|
showBandwidth();
|
|
showFrequency();
|
|
delay(300);
|
|
}
|
|
|
|
void doStereo()
|
|
{
|
|
rx.setMono((bSt = !bSt));
|
|
bShow = true;
|
|
showStereo();
|
|
delay(100);
|
|
}
|
|
|
|
/**
|
|
Process seek command.
|
|
The seek direction is based on the last encoder direction rotation.
|
|
*/
|
|
void doSeek()
|
|
{
|
|
delay(200);
|
|
bShow = true;
|
|
showFrequency();
|
|
}
|
|
|
|
/*
|
|
Button - Volume control
|
|
*/
|
|
void volumeButton(byte d)
|
|
{
|
|
|
|
if (d == 1)
|
|
rx.setVolumeUp();
|
|
else
|
|
rx.setVolumeDown();
|
|
|
|
showVolume();
|
|
delay(MIN_ELAPSED_TIME); // waits a little more for releasing the button.
|
|
}
|
|
|
|
void doFilter()
|
|
{
|
|
}
|
|
|
|
void APP_loop()
|
|
{
|
|
|
|
// Check if the encoder has moved.
|
|
if (encoderCount != 0)
|
|
{
|
|
if (encoderCount == 1)
|
|
{
|
|
rx.setFrequencyUp();
|
|
}
|
|
else
|
|
{
|
|
rx.setFrequencyDown();
|
|
}
|
|
showFrequency();
|
|
bShow = true;
|
|
encoderCount = 0;
|
|
}
|
|
|
|
// Check button commands
|
|
if ((millis() - elapsedButton) > MIN_ELAPSED_TIME)
|
|
{
|
|
// check if some button is pressed
|
|
if (digitalRead(BAND_MODE_SWITCH_UP) == LOW)
|
|
bandUp();
|
|
else if (digitalRead(BAND_MODE_SWITCH_DOWN) == LOW)
|
|
bandDown();
|
|
else if (digitalRead(VOL_UP) == LOW)
|
|
volumeButton(1);
|
|
else if (digitalRead(VOL_DOWN) == LOW)
|
|
volumeButton(-1);
|
|
else if (digitalRead(SWITCH_BW) == LOW)
|
|
doBandwidth();
|
|
}
|
|
|
|
if ((millis() - pollin_elapsed) > POLLING_TIME)
|
|
{
|
|
showRSSI();
|
|
pollin_elapsed = millis();
|
|
}
|
|
|
|
delay(100);
|
|
} |