/** @file   vt100.c
 *  @brief  VT100 Terminalausgabe
 */
#include "vt100.h"

/** @fn     void SerialMenue(void)
 *  @brief  Auswahlmenue über serielle Schnittstelle ausgeben
 *  @param  none
 *  @retval none
 */
void SerialMenue(void)
{
    SerialWriteString("(1) Einstellungen anzeigen\r\n");
    if(bState.WriteMsgEEprom)
        SerialWriteString("\033[5m(2) Texte speichern\033[m\r\n");
    else
        SerialWriteString("(2) Texte speichern\r\n");
    SerialWriteString("(3) Texte anzeigen\r\n");
    SerialWriteString("(4) Texte ändern\r\n");
    SerialWriteString("\r\nEingabe: ");
    bSerialState.Ausgabe = SERMENUE;
}
/** @fn     void SerialSetup(void)
 *  @brief  Aktuelle Einstellungen über serielle Schnittstelle ausgeben
 *
 *  @param  none
 *  @retval none
 */
void SerialSetup(void)
{   
    sprintf(out,"%s",CLRSCR);
    SerialWriteString(out);
    SerialWriteString("Einstellungen\r\n\r\n");
    sprintf(out,"WpM             : %i\r\n", bConfig.WpM);
    SerialWriteString(out);
    sprintf(out,"KeyerMode       : %i\r\n", bConfig.KeyerMode);
    SerialWriteString(out);
    sprintf(out,"SidetoneFreq    : %u\r\n", bConfig.SidetoneFreq);
    SerialWriteString(out);
    sprintf(out,"TRX1            : %i\r\n", bConfig.Trx1);
    SerialWriteString(out);
    sprintf(out,"TRX2            : %i\r\n", bConfig.Trx2);
    SerialWriteString(out);
    sprintf(out,"SidetoneEnabled : %i\r\n", bConfig.SidetoneEnabled);
    SerialWriteString(out);
    sprintf(out,"Ratio           : %i\r\n", bConfig.Ratio);
    SerialWriteString(out);
    sprintf(out,"WpMBpM          : %i\r\n", bConfig.WpMBpM);
    SerialWriteString(out);
    sprintf(out,"Reverse         : %i\r\n", bConfig.Reverse);
    SerialWriteString(out);
    sprintf(out,"Memory          : %i\r\n", bConfig.Memory);
    SerialWriteString(out);
    sprintf(out,"MemButtonMode   : %i\r\n", bConfig.MemButtonMode);
    SerialWriteString(out);
    sprintf(out,"RiseTime        : %i\r\n", bConfig.RiseTime);
    SerialWriteString(out);
    sprintf(out,"RiseTimeCounter : %i\r\n", bConfig.RiseTimeCounter);
    SerialWriteString(out);
    sprintf(out,"DebounceTime    : %i\r\n", bConfig.DebounceTime);
    SerialWriteString(out);
    SerialWriteString("\r\nTaste ...");
    bSerialState.Ausgabe = SERSETUP;
}
/** @fn     void SerialAbout(void)
 *  @brief  Versionsinformation über serielle Schnittstelle ausgeben
 *
 *  @param  none
 *  @retval none
 */
void SerialAbout(void)
{
    sprintf(out,"%s", CLRSCR);
    SerialWriteString(out);
    sprintf(out,"%s %s %s\r\n\r\n",PRG,VER,CALL);
    SerialWriteString(out);
}
/** @fn     void SerialReset(void)
 *  @brief  Löscht die Terminalanzeige und gibt Versionsinfo und Menue aus
 *
 *  @param  none
 *  @retval none
 */  
void SerialReset(void)
{
    SerialAbout();
    SerialMenue();
    bSerialState.Eingabe = SERMSG0;
    i = 0;
    o = 0;
}
/** @fn     void SerialReceive(char c)
 *  @brief  Wird vom UART Interrupt aufgerufen, wenn ein Zeichen empfangen wurde
 *
 *  @param  c Zeichen, das empfangen wurde
 *  @retval none
 */
void SerialReceive(char c)
{
    // CTRL Steuercodes
    if(c == 0x1a) SerialReset();
    if(c == 0x03) SerialReset();
    switch(bSerialState.Ausgabe)
    {
        case SERMENUE:
            switch(c)
            {
                case 0x30:
                break;
                case 0x31:
                    SerialSetup();
                break;
                case 0x32:
                    bState.WriteMsgEEprom = 2;
                break;
                case 0x33:
                    SerialMsgOut();
                break;
                case 0x34:
                    sprintf(out,"%s",CLRSCR);
                    SerialWriteString(out);
                    SerialWriteString("Welcher Speicher? (1-5)");
                    bSerialState.Eingabe = SERMSG0;
                    bSerialState.Ausgabe = SERMSGMENUE;
                break;
            }
        break;
        case SERMSG:
            SerialReset();
        break;
        case SERSETUP:
            SerialReset();
        break;
        case SERMSGMENUE:
            SerialMsgMenue(c);
        break;
        default:
            SerialReset();
    }
}
/** @fn     void SerialMsgOut(char c)
 *  @brief  Zeigt die 5 Textspeicher im Terminal an
 *
 *  @param  none
 *  @retval none
 */
void SerialMsgOut(void)
{
    sprintf(out,"%s",CLRSCR);
    SerialWriteString(out);
    SerialWriteString("Textspeicher\r\n\r\n");
    sprintf(out,"1: %s\r\n",bMessage.Msg1);
    SerialWriteString(out);
    sprintf(out,"2: %s\r\n",bMessage.Msg2);
    SerialWriteString(out);
    sprintf(out,"3: %s\r\n",bMessage.Msg3);
    SerialWriteString(out);
    sprintf(out,"4: %s\r\n",bMessage.Msg4);
    SerialWriteString(out);
    sprintf(out,"5: %s\r\n",bMessage.Msg5);
    SerialWriteString(out);
    bSerialState.Ausgabe = SERMSG;
    SerialWriteString("\r\nTaste ...");
}
/** @fn     void SerialMsgMenue(char c)
 *  @brief  Zeigt einen Textspeicher an, der geändert werden soll
 *
 *  @param  c Nummer des Textspeichers
 *  @retval none
 */
void SerialMsgMenue(char c)
{
    bSerialState.Ausgabe = SERMSGMENUE;
    if(bSerialState.Eingabe == SERMSG0)
    {
        switch(c)
        {
            case 0x31:
                sprintf(out,"\r\n%s\r\n",bMessage.Msg1);
                SerialWriteString(out);
                bSerialState.Eingabe = SERMSG1;
            break;
            case 0x32:
                sprintf(out,"\r\n%s\r\n",bMessage.Msg2);
                SerialWriteString(out);
                bSerialState.Eingabe = SERMSG2;
            break;
            case 0x33:
                sprintf(out,"\r\n%s\r\n",bMessage.Msg3);
                SerialWriteString(out);
                bSerialState.Eingabe = SERMSG3;
            break;
            case 0x34:
                sprintf(out,"\r\n%s\r\n",bMessage.Msg4);
                SerialWriteString(out);
                bSerialState.Eingabe = SERMSG4;
            break;
            case 0x35:
                sprintf(out,"\r\n%s\r\n",bMessage.Msg5);
                SerialWriteString(out);
                bSerialState.Eingabe = SERMSG5;
            break;
 
        }
        i = 0; inp[i] = 0x00;
    } else 
    if(bSerialState.Eingabe > SERMSG0)
    {
        if(c == '\r')
        {
            SerialWriteString("\r\n\r\nOk! Druecke ESC\r\n");
            bState.WriteMsgEEprom = 1;
            inp[i] = 0x00;
            switch(bSerialState.Eingabe)
            {
                case SERMSG1:
                    sprintf(bMessage.Msg1,"%s",inp);
                break;
                case SERMSG2:
                    sprintf(bMessage.Msg2,"%s",inp);
                break;
                case SERMSG3:
                    sprintf(bMessage.Msg3,"%s",inp);
                break;
                case SERMSG4:
                    sprintf(bMessage.Msg4,"%s",inp);
                break;
                case SERMSG5:
                    sprintf(bMessage.Msg5,"%s",inp);
                break;
            }
        } else if (c == 0x08) {
            if(i > 0) i--;
            SerialWriteChar(0x7f);
        } else {
            if(i < 60) 
            {
                if((c > 96) && (c < 123))
                    c = c - 32;
                inp[i++] = c;
            } else
                SerialWriteChar(0x08);
        }
    }
    if(c == 0x1b) SerialReset();
}