You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

480 lines
16 KiB
C

/** @file controls.c
* @brief Display und Bedienelemente
* @author Tom, DL7BJ
*/
#include "controls.h"
// Stringkonstanten für das Display
static const char* const sTrx1 PROGMEM = "TRX 1";
static const char* const sTrx2 PROGMEM = "TRX 2";
static const char* const IambicA PROGMEM = "Iambic A";
static const char* const IambicB PROGMEM = "Iambic B";
static const char* const Ultimatic PROGMEM = "Ultimat.";
static const char* const Memory PROGMEM = "Memory";
static const char* const Ratio PROGMEM = "Ratio";
static const char* const Weight PROGMEM = "Weight";
static const char* const ReverseRL PROGMEM = " L - R °";
static const char* const ReverseLR PROGMEM = " L ° R -";
static const char* const SideToneOnOff PROGMEM = "Mithörton";
static const char* const SideToneFreq PROGMEM = "Frequenz";
static const char* const RiseTime PROGMEM = "Anstieg";
static const char* const DebounceTime PROGMEM = "Entprl.";
static const char* const Yes PROGMEM = "J";
static const char* const No PROGMEM = "N";
static const char* const Hz PROGMEM = "Hz";
static const char* const Einstellungen PROGMEM = "Einstellungen";
static const char* const Ton PROGMEM = "Ton";
static const char* const TonAn PROGMEM = "Ton an";
static const char* const TonAus PROGMEM = "Ton aus";
static const char* const MemAus PROGMEM = "Mem AUS";
static const char* const MemAn PROGMEM = "Mem EIN";
void Drehencoder(void)
{
int st = 0;
static int last;
if(!(bMenuCtrl.Config))
{
EncoderMinMax(5,50);
st = EncoderRead(1);
if(bConfig.WpM != st)
{
bConfig.WpM = st; // neuen Wert in bConfig speichern
bState.WpMChanged = 1; // Status für Timer 0 setzen
bMenuCtrl.Update = 1; // Status für UpdateDisplay setzen
EncoderPos = st; // neuen Werte in EncoderPos speichern
WpM = bConfig.WpM; // neuen Wert in WpM übernehmen
cli();
StoreEEpromTimer = 0; // Timer 0 Variable löschen für Update EEprom
sei();
SetRatio();
SetWeight();
}
}
if((bMenuCtrl.buttonPressed == 1) && (bMenuCtrl.Config == 0))
{
bMenuCtrl.Config = 1;
MenuCtrlTimer = 0;
bMenuCtrl.buttonPressed = 0;
EncoderPos = EncoderRead(1);
bMenuCtrl.CurMenue = EncoderPosConfig;
EncoderWrite(EncoderPosConfig);
bMenuCtrl.Update = 1;
}
if((bMenuCtrl.buttonPressedLong == 1) && (bMenuCtrl.Config == 1))
{
if(bMenuCtrl.SubMenue == 1)
{
bMenuCtrl.SubMenue = 0;
bMenuCtrl.Update = 1;
bMenuCtrl.buttonPressedLong = 0;
bMenuCtrl.m_buttonPressed = 0;
EncoderWrite(EncoderPosSubConfig);
Boop();
} else {
bMenuCtrl.Config = 0;
bMenuCtrl.Update = 1;
bMenuCtrl.buttonPressedLong = 0;
bMenuCtrl.buttonPressed = 0;
bMenuCtrl.m_buttonPressed = 0;
MenuCtrlTimer = 0;
EncoderPosConfig = EncoderRead(1);
EncoderWrite(EncoderPos);
bMenuCtrl.ClrScr = 1;
WriteEEprom();
Beep();
}
}
if(bMenuCtrl.Config == 1)
{
if((!bMenuCtrl.buttonPressed) && (bMenuCtrl.SubMenue == 0))
{
EncoderMinMax(1,M_MAX);
st = EncoderRead(1);
if(last != st)
{
bMenuCtrl.CurMenue = st;
bMenuCtrl.Update = 1;
}
last = st;
}
if(bMenuCtrl.buttonPressed)
{
bMenuCtrl.m_buttonPressed = 1;
bMenuCtrl.buttonPressed = 0;
}
if((bMenuCtrl.m_buttonPressed == 1) && (bMenuCtrl.SubMenue == 0))
{
UpdateDisplay();
bMenuCtrl.Update = 1;
switch(bMenuCtrl.CurMenue)
{
case M_TRX1:
if(bConfig.Trx1)
bConfig.Trx1 = 0;
else
bConfig.Trx1 = 1;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_TRX2:
if(bConfig.Trx2)
bConfig.Trx2 = 0;
else
bConfig.Trx2 = 1;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_IAMBICA:
bConfig.KeyerMode = IAMBIC_A;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_IAMBICB:
bConfig.KeyerMode = IAMBIC_B;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_ULTIMATIC:
bConfig.KeyerMode = ULTIMATIC;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_REVERSE:
if(bConfig.Reverse == 1)
bConfig.Reverse = 0;
else
bConfig.Reverse = 1;
if(bConfig.Reverse == 1)
PaddleMode = PADDLE_REVERSE;
else
PaddleMode = PADDLE_NORMAL;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_RATIO:
bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1);
break;
case M_WEIGHT:
bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1);
break;
case M_MEMORY:
bConfig.Memory = (bConfig.Memory == 1) ? 0 : 1;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_WPMBPM:
bConfig.WpMBpM = (bConfig.WpMBpM == 1) ? 0 : 1;
bMenuCtrl.m_buttonPressed = 0;
break;
case M_TON:
if(bConfig.SidetoneEnabled == 1)
SidetoneDisable();
else
SidetoneEnable();
bMenuCtrl.m_buttonPressed = 0;
break;
case M_TON_FREQ:
bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1);
break;
case M_RISETIME:
bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1);
break;
case M_DEBOUNCE:
bMenuCtrl.SubMenue = 1;
EncoderPosSubConfig = EncoderRead(1);
break;
case M_MEMBUTTONMODE:
bConfig.MemButtonMode = (bConfig.MemButtonMode == 1) ? 0 : 1;
bMenuCtrl.m_buttonPressed = 0;
break;
}
}
// Einstellungen für variable Werte
if((bMenuCtrl.m_buttonPressed == 1) && (bMenuCtrl.SubMenue == 1))
{
UpdateDisplay();
switch(bMenuCtrl.CurMenue)
{
case M_RATIO:
EncoderMinMax(15,45);
EncoderWrite(bConfig.Ratio);
st = EncoderRead(1);
if(st != bConfig.Ratio)
bMenuCtrl.Update = 1;
bConfig.Ratio = st;
if(bConfig.Ratio > 40) bConfig.Ratio = 45;
if(bConfig.Ratio < 15) bConfig.Ratio = 15;
SetRatio();
break;
case M_WEIGHT:
EncoderMinMax (25,75);
EncoderWrite(bConfig.Weight);
st = EncoderRead(1);
if(st != bConfig.Weight)
bMenuCtrl.Update = 1;
bConfig.Weight = st;
if(bConfig.Weight > 75) bConfig.Weight = 75;
if(bConfig.Weight < 25) bConfig.Weight = 25;
SetWeight();
break;
case M_TON_FREQ:
EncoderMinMax(30,100);
EncoderWrite(bConfig.SidetoneFreq/10);
st = EncoderRead(1);
if(st != bConfig.SidetoneFreq/10)
{
bConfig.SidetoneFreq = st * 10;
if(bConfig.SidetoneFreq > 1000) bConfig.SidetoneFreq = 1000;
if(bConfig.SidetoneFreq < 300) bConfig.SidetoneFreq = 300;
bMenuCtrl.Update = 1;
Tone(bConfig.SidetoneFreq, 250);
}
break;
case M_RISETIME:
EncoderMinMax(1,10);
EncoderWrite(bConfig.RiseTime);
st = EncoderRead(1);
if(st != bConfig.RiseTime)
{
bConfig.RiseTime = st;
if(bConfig.RiseTime > 10) bConfig.RiseTime = 10;
if(bConfig.RiseTime < 1) bConfig.RiseTime = 1;
bMenuCtrl.Update = 1;
}
break;
case M_DEBOUNCE:
EncoderMinMax(1,25);
EncoderWrite(bConfig.DebounceTime);
st = EncoderRead(1);
if(st != bConfig.DebounceTime)
{
bConfig.DebounceTime = st;
if(bConfig.DebounceTime > 25) bConfig.DebounceTime = 25;
if(bConfig.DebounceTime < 1) bConfig.DebounceTime = 1;
bMenuCtrl.Update = 1;
}
break;
}
}
}
}
void ConfigMenue(void)
{
char line[22];
lcd_clrscr();
lcd_charMode(NORMAL);
lcd_gotoxy(0,0);
lcd_puts(CLEARLINE);
lcd_gotoxy(0,0);
if(bMenuCtrl.SubMenue == 0)
sprintf(line,"%s - %i",Einstellungen, bMenuCtrl.CurMenue);
else
sprintf(line,"%s * %i",Einstellungen, bMenuCtrl.CurMenue);
lcd_puts(line);
lcd_charMode(DOUBLESIZE);
lcd_gotoxy(0,3);
lcd_puts(CLEARLINE);
switch(bMenuCtrl.CurMenue)
{
case M_TRX1:
lcd_gotoxy(0,3);
if(bConfig.Trx1)
sprintf(line,"[%s]", sTrx1);
else
sprintf(line," %s ", sTrx1);
lcd_puts(line);
break;
case M_TRX2:
lcd_gotoxy(0,3);
if(bConfig.Trx2)
sprintf(line,"[%s]", sTrx2);
else
sprintf(line," %s ", sTrx2);
lcd_puts(line);
break;
case M_IAMBICA:
lcd_gotoxy(0,3);
if(bConfig.KeyerMode == IAMBIC_A)
sprintf(line,"[%s]", IambicA);
else
sprintf(line," %s ", IambicA);
lcd_puts(line);
break;
case M_IAMBICB:
lcd_gotoxy(0,3);
if(bConfig.KeyerMode == IAMBIC_B)
sprintf(line,"[%s]", IambicB);
else
sprintf(line," %s ", IambicB);
lcd_puts(line);
break;
case M_ULTIMATIC:
lcd_gotoxy(0,3);
if(bConfig.KeyerMode == ULTIMATIC)
sprintf(line,"[%s]", Ultimatic);
else
sprintf(line," %s ", Ultimatic);
lcd_puts(line);
break;
case M_REVERSE:
lcd_gotoxy(0,3);
if(bConfig.Reverse == 0)
sprintf(line,"%s", ReverseLR);
else
sprintf(line,"%s", ReverseRL);
lcd_puts(line);
break;
case M_RATIO:
lcd_gotoxy(0,3);
sprintf(line,"%s %.1f", Ratio, (float)bConfig.Ratio/10);
lcd_puts(line);
break;
case M_WEIGHT:
lcd_gotoxy(0,3);
sprintf(line,"%s %i",Weight,bConfig.Weight);
lcd_puts(line);
break;
case M_MEMORY:
lcd_gotoxy(0,3);
if(bConfig.Memory == 1)
sprintf(line,"[%s]", Memory);
else
sprintf(line," %s ", Memory);
lcd_puts(line);
break;
case M_TON_FREQ:
lcd_gotoxy(0,3);
sprintf(line,"%s %uHz", Ton, bConfig.SidetoneFreq);
lcd_puts(line);
break;
case M_TON:
lcd_gotoxy(0,3);
if(bConfig.SidetoneEnabled == 1)
sprintf(line,"%s", TonAn);
else
sprintf(line,"%s", TonAus);
lcd_puts(line);
break;
case M_WPMBPM:
lcd_gotoxy(0,3);
if(bConfig.WpMBpM == 0)
sprintf(line,"%s", "[WpM] BpM");
else
sprintf(line,"%s", "WpM [BpM]");
lcd_puts(line);
break;
case M_RISETIME:
lcd_gotoxy(0,3);
sprintf(line,"%s %ims",RiseTime, bConfig.RiseTime);
lcd_puts(line);
break;
case M_DEBOUNCE:
lcd_gotoxy(0,3);
sprintf(line,"%s %ims",DebounceTime, bConfig.DebounceTime);
lcd_puts(line);
break;
case M_MEMBUTTONMODE:
lcd_gotoxy(0,3);
if(bConfig.MemButtonMode == 1)
sprintf(line,"[%s]","TRX Sw.");
else
sprintf(line,"[%s]","Textsp.");
lcd_puts(line);
break;
}
bMenuCtrl.Update = 0;
lcd_charMode(NORMAL);
}
void DisplayVersion(void)
{
lcd_init(LCD_DISP_ON);
lcd_charMode(DOUBLESIZE);
lcd_home();
lcd_puts(PRG);
lcd_gotoxy(1,2);
lcd_puts(VER);
lcd_gotoxy(2,4);
lcd_puts(CALL);
SidetoneOff();
DelayMilliSeconds(1000);
}
/** \brief UpdateDisplay
*
* Aktualisierung der Anzeigen auf dem Display je nach
* aktueller Funktion.
*
* DOUBLESIZE 4x10 character
* NORMALSIZE 8x21 character
*/
void UpdateDisplay(void)
{
char line[22];
if(bMenuCtrl.Update)
{
if(bMenuCtrl.ClrScr)
{
lcd_clrscr();
bMenuCtrl.ClrScr = 0;
bMenuCtrl.Update = 1;
}
if(!(bMenuCtrl.Config))
{
lcd_charMode(DOUBLESIZE);
lcd_gotoxy(4,3);
if(bConfig.WpMBpM == 0)
sprintf(line,"%i WpM ",bConfig.WpM);
else
sprintf(line,"%i BpM ", bConfig.WpM*5);
lcd_puts(line);
lcd_charMode(NORMAL);
lcd_gotoxy(13,0);
if(bConfig.KeyerMode == IAMBIC_A)
sprintf(line,"%s", IambicA);
if(bConfig.KeyerMode == IAMBIC_B)
sprintf(line,"%s", IambicB);
if(bConfig.KeyerMode == ULTIMATIC)
sprintf(line,"%s", Ultimatic);
lcd_puts(line);
lcd_gotoxy(0,0);
if(bConfig.Trx1 == 1)
sprintf(line, "%s", sTrx1);
else
sprintf(line, " ");
lcd_puts(line);
lcd_gotoxy(6,0);
if(bConfig.Trx2 == 1)
sprintf(line, "%s", sTrx2);
else
sprintf(line, " ");
lcd_puts(line);
lcd_gotoxy(0,6);
sprintf(line, "R 1:%.1f",(float)bConfig.Ratio/10);
lcd_puts(line);
lcd_gotoxy(9,6);
sprintf(line, "W %i", bConfig.Weight);
lcd_puts(line);
lcd_gotoxy(14,6);
if(bConfig.Memory)
sprintf(line,MemAn);
else
sprintf(line,MemAus);
lcd_puts(line);
}
if(bMenuCtrl.Config)
{
ConfigMenue();
}
}
}