/** @file functions.c * @brief Diverse Funktionen * @author Tom, DL7BJ */ #include "functions.h" // EEProm Speicher uint8_t Dummy; uint8_t ee_Dummy EEMEM = 0x55; // Dummy for Address 0 uint8_t ee_TRX EEMEM = 0; // TRX 1 oder 2 oder beide uint8_t ee_KeyerMode EEMEM = 1; // Iambic A, Iambic B oder Ultimatic uint8_t ee_SidetoneEnabled EEMEM = 1; // Mithörton eingeschaltet uint8_t ee_WpMBpM EEMEM = 0; // WpM oder BpM Anzeige uint8_t ee_Reverse EEMEM = 0; // linkes/rechtes Paddle vertauschen uint8_t ee_WinkeyerEnabled EEMEM = 0; // Winkeyer Emulation uint8_t ee_Ratio EEMEM = 30; // Punkt/Strich Verhältnis 1:3 uint8_t ee_Memory EEMEM = 0; // Punkt/Strich Speicher uint16_t ee_SidetoneFreq EEMEM = 600; // Frequenz des Mithörtons uint8_t ee_WpM EEMEM = 12; // WpM uint8_t ee_RiseTime EEMEM = 5; // Anstiegszeit Sinuston uint8_t ee_RiseTimeCounter EEMEM = 5; // Anzahl Sinusschwingungen für den Anstieg uint8_t ee_DebounceTime EEMEM = 6; // Entprellzeit für Straight Key Eingang // Stringkonstanten für VT100 Terminals const char CLRSCR[] = "\033[2J"; /** @brief Ein paar Millisekunden warten * * @param Zeit in Millisekunden, die gewartet werden soll * @return void */ void DelayMilliSeconds(uint16_t ms) { volatile static uint16_t ctr; ResetMilliSeconds(); do { ATOMIC_BLOCK(ATOMIC_FORCEON) { ctr = t_delayms; } } while (ctr < ms); } /** @brief Wert des Zählers für Millisekunden lesen * * @param none * @return milliseconds */ uint16_t GetMilliSeconds(void) { volatile static uint16_t ctr; ATOMIC_BLOCK(ATOMIC_FORCEON) { ctr = t_delayms; } return ctr; } /** @brief Setzt den Zähler für Millisekunden auf 0 * * @param none * @return none */ void ResetMilliSeconds(void) { ATOMIC_BLOCK(ATOMIC_FORCEON) { t_delayms = 0; } } /** @brief SREG wieder herstellen und Interrupts erlauben * @param none * @return none */ void IntEnable(void) { SREG = sreg_tmp; sei(); } /** @brief SREG sichern und Interrupts verbieten * @param none * @return none */ void IntDisable(void) { sreg_tmp = SREG; cli(); } /** @brief Pin Change Interrupt abschalten * @param none * @return none */ void DisablePinChangeIRQ(void) { cbi(PCICR,PCIE2); } /** @brief Pin Change Interrupt einschalten * @param none * @return none */ void EnablePinChangeIRQ(void) { sbi(PCICR,PCIE2); } /** @brief EEPROM schreiben * @param none * @return none */ void WriteEEprom(void) { IntDisable(); eeprom_write_byte(&ee_Dummy,0x55); eeprom_write_byte(&ee_WpM, bConfig.WpM); eeprom_write_byte(&ee_KeyerMode, bConfig.KeyerMode); eeprom_write_word(&ee_SidetoneFreq, bConfig.SidetoneFreq); eeprom_write_byte(&ee_TRX, bConfig.TRX); eeprom_write_byte(&ee_SidetoneEnabled, bConfig.SidetoneEnabled); eeprom_write_byte(&ee_WpMBpM, bConfig.WpMBpM); eeprom_write_byte(&ee_Reverse, bConfig.Reverse); eeprom_write_byte(&ee_WinkeyerEnabled, bConfig.WinkeyerEnabled); eeprom_write_byte(&ee_Ratio, bConfig.Ratio); eeprom_write_byte(&ee_Memory, bConfig.Memory); eeprom_write_byte(&ee_RiseTime, bConfig.RiseTime); eeprom_write_byte(&ee_RiseTimeCounter, bConfig.RiseTimeCounter); eeprom_write_byte(&ee_DebounceTime, bConfig.DebounceTime); IntEnable(); } void ReadEEpromWpM(void) { IntDisable(); bConfig.WpM = eeprom_read_byte(&ee_WpM); IntEnable(); } void WriteEEpromWpM(void) { IntDisable(); eeprom_write_byte(&ee_WpM, bConfig.WpM); IntEnable(); } /** @brief Standardeinstellungen (bei neuem Controller) * * @param none * @return none */ void SetEEprom(void) { Dummy = 0x55; bConfig.WpM = 15; bConfig.KeyerMode = 2; bConfig.SidetoneFreq = 600; bConfig.TRX = 1; bConfig.SidetoneEnabled = 1; bConfig.WpMBpM = 1; bConfig.Reverse = 0; bConfig.WinkeyerEnabled = 0; bConfig.Ratio = 30; bConfig.Memory = 0; bConfig.RiseTime = 5; bConfig.RiseTimeCounter = 5; bConfig.DebounceTime = 5; WriteEEprom(); } /** @brief EEprom lesen * @param none * @return none */ void ReadEEprom(void) { IntDisable(); Dummy = eeprom_read_byte(&ee_Dummy); IntEnable(); if(Dummy != 0x55) { SetEEprom(); } IntDisable(); bConfig.WpM = eeprom_read_byte(&ee_WpM); bConfig.KeyerMode = eeprom_read_byte(&ee_KeyerMode); bConfig.SidetoneFreq = eeprom_read_word(&ee_SidetoneFreq); bConfig.TRX = eeprom_read_byte(&ee_TRX); bConfig.SidetoneEnabled = eeprom_read_byte(&ee_SidetoneEnabled); bConfig.WpMBpM = eeprom_read_byte(&ee_WpMBpM); bConfig.Reverse = eeprom_read_byte(&ee_Reverse); bConfig.WinkeyerEnabled = eeprom_read_byte(&ee_WinkeyerEnabled); bConfig.Ratio = eeprom_read_byte(&ee_Ratio); bConfig.Memory = eeprom_read_byte(&ee_Memory); bConfig.RiseTime = eeprom_read_byte(&ee_RiseTime); bConfig.RiseTimeCounter = eeprom_read_byte(&ee_RiseTimeCounter); bConfig.DebounceTime = eeprom_read_byte(&ee_DebounceTime); IntEnable(); if(bConfig.WpM > 50) { bConfig.WpM = 15; WriteEEpromWpM(); } if(bConfig.RiseTime > 10) { bConfig.RiseTime = 10; WriteEEprom(); } if(bConfig.RiseTimeCounter > 6) { bConfig.RiseTimeCounter = 6; WriteEEprom(); } if(bConfig.DebounceTime > 22) { bConfig.DebounceTime = 25; WriteEEprom(); } } /** @brief Aktuelle Einstellungen über serielle Schnittstelle ausgeben * @param none * @return none */ void SerialInfo(void) { sprintf(sdebug,"WpM : %i\r\n", bConfig.WpM); SerialWriteString(sdebug); sprintf(sdebug,"KeyerMode : %i\r\n", bConfig.KeyerMode); SerialWriteString(sdebug); sprintf(sdebug,"SidetoneFreq : %u\r\n", bConfig.SidetoneFreq); SerialWriteString(sdebug); sprintf(sdebug,"TRX : %i\r\n", bConfig.TRX); SerialWriteString(sdebug); sprintf(sdebug,"SidetoneEnabled : %i\r\n", bConfig.SidetoneEnabled); SerialWriteString(sdebug); sprintf(sdebug,"Ratio : %i\r\n", bConfig.Ratio); SerialWriteString(sdebug); sprintf(sdebug,"WpMBpM : %i\r\n", bConfig.WpMBpM); SerialWriteString(sdebug); sprintf(sdebug,"Reverse : %i\r\n", bConfig.Reverse); SerialWriteString(sdebug); sprintf(sdebug,"Memory : %i\r\n", bConfig.Memory); SerialWriteString(sdebug); sprintf(sdebug,"Winkeyer : %i\r\n", bConfig.WinkeyerEnabled); SerialWriteString(sdebug); sprintf(sdebug,"RiseTime : %i\r\n", bConfig.RiseTime); SerialWriteString(sdebug); sprintf(sdebug,"RiseTimeCounter : %i\r\n", bConfig.RiseTimeCounter); SerialWriteString(sdebug); sprintf(sdebug,"DebounceTime : %i\r\n", bConfig.DebounceTime); SerialWriteString(sdebug); } /** @brief Versionsinformation über serielle Schnittstelle ausgeben * @param none * @return none */ void SerialAbout(void) { sprintf(sdebug,"%s", CLRSCR); SerialWriteString(sdebug); sprintf(sdebug,"%s %s %s\r\n\r\n", PRG,VER,CALL); SerialWriteString(sdebug); } /** @brief Ein Zeichen über serielle Schnittstelle ausgeben * @param Zeichen * @return none */ void SerialWriteChar(unsigned char data) { while(!(UCSR0A & (1<