aboutsummaryrefslogtreecommitdiffstats
path: root/quantum/process_keycode/process_leader.c
blob: e53d221e75ad6f49ee287c509e3dde3ba526597b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "process_leader.h"

__attribute__ ((weak))
void leader_start(void) {}

__attribute__ ((weak))
void leader_end(void) {}

// Leader key stuff
bool leading = false;
uint16_t leader_time = 0;

uint16_t leader_sequence[5] = {0, 0, 0, 0, 0};
uint8_t leader_sequence_size = 0;

bool process_leader(uint16_t keycode, keyrecord_t *record) {
  // Leader key set-up
  if (record->event.pressed) {
    if (!leading && keycode == KC_LEAD) {
      leader_start();
      leading = true;
      leader_time = timer_read();
      leader_sequence_size = 0;
      leader_sequence[0] = 0;
      leader_sequence[1] = 0;
      leader_sequence[2] = 0;
      leader_sequence[3] = 0;
      leader_sequence[4] = 0;
      return false;
    }
    if (leading && timer_elapsed(leader_time) < LEADER_TIMEOUT) {
      leader_sequence[leader_sequence_size] = keycode;
      leader_sequence_size++;
      return false;
    }
  }
  return true;
}
0 #define SYSR_TOK_B_CHAN 1 /* nr. of B-Channels; DataLen=1; def: 2 */ #define SYSR_TOK_FAX_CHAN 2 /* nr. of FAX Channels; DataLen=1; def: 0 */ #define SYSR_TOK_MAC_ADDR 3 /* MAC-Address; DataLen=6; def: auto */ #define SYSR_TOK_ESC 255 /* undefined data size yet */ /* default values, if not corrected by token: */ #define SYSR_TOK_B_CHAN_DEF 2 /* assume 2 B-Channels */ #define SYSR_TOK_FAX_CHAN_DEF 1 /* assume 1 FAX Channel */ /* syntax of new SYSR token stream: * channel: CHAN_SYSTEM * msgsize: MIN_RDY_MSG_SIZE <= x <= MAX_RDY_MSG_SIZE * RDY_MAGIC_SIZE <= x <= (RDY_MAGIC_SIZE+MAX_N_TOK_BYTES) * msg : 0 1 2 3 {4 5 6 ..} * S Y S R MAX_N_TOK_BYTES bytes of TokenStream * * TokenStream := empty * | {NonEndTokenChunk} EndToken RotlCRC * NonEndTokenChunk:= NonEndTokenId DataLen [Data] * NonEndTokenId := 0x01 .. 0xFE 1 BYTE * DataLen := 0x00 .. 0xFF 1 BYTE * Data := DataLen bytes * EndToken := 0x00 * RotlCRC := special 1 byte CRC over all NonEndTokenChunk bytes * s. RotlCRC algorithm * * RotlCRC algorithm: * ucSum= 0 1 unsigned char * for all NonEndTokenChunk bytes: * ROTL(ucSum,1) rotate left by 1 * ucSum += Char; add current byte with swap around * RotlCRC= ~ucSum; invert all bits for result * * note: * - for 16-bit FIFO add padding 0 byte to achieve even token data bytes! */ /*--------------------------------------error logger------------------------*/ /* note: pof needs final 0 ! */ #define ERRLOG_CMD_REQ "ERRLOG ON" #define ERRLOG_CMD_REQ_SIZE 10 /* with final 0 byte ! */ #define ERRLOG_CMD_STOP "ERRLOG OFF" #define ERRLOG_CMD_STOP_SIZE 11 /* with final 0 byte ! */ #define ERRLOG_ENTRY_SIZE 64 /* sizeof(tErrLogEntry) */ /* remaining text size = 55 */ #define ERRLOG_TEXT_SIZE (ERRLOG_ENTRY_SIZE-2*4-1) typedef struct ErrLogEntry_tag { /*00 */ unsigned long ulErrType; /*04 */ unsigned long ulErrSubtype; /*08 */ unsigned char ucTextSize; /*09 */ unsigned char ucText[ERRLOG_TEXT_SIZE]; /* ASCIIZ of len ucTextSize-1 */ /*40 */ } tErrLogEntry; #if defined(__TURBOC__) #if sizeof(tErrLogEntry) != ERRLOG_ENTRY_SIZE #error size of tErrLogEntry != ERRLOG_ENTRY_SIZE #endif /* */ #endif /* */ /*--------------------------------------DPRAM boot spooler------------------*/ /* this is the struture used between pc and * hyperstone to exchange boot data */ #define DPRAM_SPOOLER_DATA_SIZE 0x20 typedef struct DpramBootSpooler_tag { /*00 */ unsigned char Len; /*01 */ volatile unsigned char RdPtr; /*02 */ unsigned char WrPtr; /*03 */ unsigned char Data[DPRAM_SPOOLER_DATA_SIZE]; /*23 */ } tDpramBootSpooler; #define DPRAM_SPOOLER_MIN_SIZE 5 /* Len+RdPtr+Wrptr+2*data */ #define DPRAM_SPOOLER_DEF_SIZE 0x23 /* current default size */ /*--------------------------------------HYCARD/ERGO DPRAM SoftUart----------*/ /* at DPRAM offset 0x1C00: */ #define SIZE_RSV_SOFT_UART 0x1B0 /* 432 bytes reserved for SoftUart */ #endif /* __INCE1PC_H__ */