/* * Author: klaute -Kai Lauterbach - @kailauterbach - me@klaute.de * Date: 08/2016 * License: GPLv3 */ /*****************************************************************************/ extern void USB_serialStreamWriteC(char*, uint16_t); extern void USB_serialStreamWrite(char*); /*****************************************************************************/ // send the key configuration to the USB host void cc_getConfig() { char* sBody = " "; sprintf(sBody, "%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_CONFIG); USB_serialStreamWrite(sBody); for (uint8_t key = 0; key < EEP_KEY_CNT; key++) { char* sKey = " "; sprintf(sKey, "%c", key); USB_serialStreamWriteC(sKey, 1); for (uint8_t seqnum = 0; seqnum < EEP_KEY_SEQ_LEN; seqnum++) { char* sSeq = " "; sprintf(sSeq, "%c%c", key_config[key][seqnum][0], key_config[key][seqnum][1]); USB_serialStreamWriteC(sSeq, 2); } } sBody = " "; sprintf(sBody, "%c%c", MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); } /*****************************************************************************/ // receive the key configuration for one key void cc_setKeyConfig() { uint8_t key = cc_read_data[0]; uint8_t seqnum = 0; for (uint8_t pos = 1; pos < EEP_KEY_SEQ_LEN; pos += EEP_KEY_TUPLE_LEN) { key_config[key][seqnum][0] = cc_read_data[pos]; // first byte f the tuple key_config[key][seqnum][1] = cc_read_data[pos+1]; // second byte f the tuple seqnum++; } // TODO should be called by an other function ch_writeConfig(); char* sBody = " "; sprintf(sBody, "%c%c%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_ANSWER_OK, MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); } /*****************************************************************************/ void cc_setLEDState() { uint8_t led = cc_read_data[0]; // LED number uint8_t state = cc_read_data[1]; // state if (led < 0 || led >= EEP_KEY_CNT) { char* sBody = " "; sprintf(sBody, "%c%c%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_ANSWER_NOK, MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); return; } if (state == 0) lm_ledOff(led); else lm_ledOn(led); char* sBody = " "; sprintf(sBody, "%c%c%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_ANSWER_OK, MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); } /*****************************************************************************/ void cc_setOSType() { cn_writeOSType(cc_read_data[0]); char* sBody = " "; sprintf(sBody, "%c%c%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_ANSWER_OK, MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); } /*****************************************************************************/ void cc_startBootloader() { // enable the watchdog without a time interval to use wdt_enable(0); // trigger watchdog while(1) {}; } /*****************************************************************************/ // Wert: | 0x80 | 0x40 | 0x20 | 0x10 | 0x08 | 0x04 | 0x02 | 0x01 // Wert: | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 // Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 // Descr: | delay | - | fn | meta | altgr | alt | ctrl | shift // max 40 byte / 20 tupel uint8_t sample_seq[] = { 0x01, 0x0b, // H 0x80, 0x0f, // delay 16 cycles 0x00, 0x04, // a 0x00, 0x0f, // l 0x80, 0x80, // delay 128 cycles 0x00, 0x0f, // l 0x00, 0x12, // o 0x80, 0x0f, // delay 16 cycles 0x10, 0x00, // meta modifier 0x80, 0x80, // delay 128 0x10, 0x00, // meta modifier 0xff, 0xff, // in case that length of the sequence is less than 40 byte add a (0xff, 0xff) tuple - only allowed firmware internal 0xff, 0xff, // one 0xff 0xff tuple is required, the other tuples are added to clean up the eeprom content 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; // Example hexadecimal data: // 2 byte: message header // 1 byte: 0x14 = set configuration command identifier // 1 byte: 0x00 = key number to modify // 40 byte: sequence data (tuples) full filled using (0xff, 0xff) tuples // 2 byte: message footer // 3C3E1400010B80FF000A000F8080000F001280FF100080801000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D0A void cc_saveFullSampleCfg() { for (uint8_t k = 0; k < EEP_KEY_CNT; k++) { for (uint8_t s = 0; s < 40; s++) { ch_writeKeyConfigMV(k, s, sample_seq[2*s], sample_seq[2*s+1]); } } ch_readConfig(); char* sBody = " "; sprintf(sBody, "%c%c%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_ANSWER_OK, MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); } /*****************************************************************************/ void cc_setKeyStrokeDelay() { ch_setKeyStrokeDelay(cc_read_data[0]); char* sBody = " "; sprintf(sBody, "%c%c%c%c%c", MSG_SOM1, MSG_SOM2, MSG_TYPE_ANSWER_OK, MSG_EOM1, MSG_EOM2); USB_serialStreamWrite(sBody); } /*****************************************************************************/