uint8_t matrix_scan(void) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { select_col(col); _delay_us(3); uint8_t rows = read_rows(col); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); bool curr_bit = rows & (1<<row); if (prev_bit != curr_bit) { matrix_debouncing[row] ^= ((matrix_row_t)1<<col); debouncing = DEBOUNCING_DELAY; } } unselect_cols(); } if (debouncing) { if (--debouncing) { _delay_ms(1); } else { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { matrix[i] = matrix_debouncing[i]; } } } matrix_scan_quantum(); return 1; }
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { bool matrix_changed = false; // Select col and wait for col selecton to stabilize select_col(current_col); wait_us(30); // For each row... for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) { // Store last value of row prior to reading matrix_row_t last_row_value = current_matrix[row_index]; // Check row pin state if (readPin(row_pins[row_index])) { // Pin HI, clear col bit current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); } else { // Pin LO, set col bit current_matrix[row_index] |= (ROW_SHIFTER << current_col); } // Determine if the matrix changed state if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) { matrix_changed = true; } } // Unselect col unselect_col(current_col); return matrix_changed; }
uint8_t matrix_scan(void) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { // 0-16 select_col(col); _delay_us(30); // without this wait it won't read stable value. uint16_t rows = read_rows(); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { // 0-5 bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); bool curr_bit = rows & (1<<row); if (prev_bit != curr_bit) { matrix_debouncing[row] ^= ((matrix_row_t)1<<col); if (debouncing) { dprint("bounce!: "); dprintf("%02X", debouncing); dprintln(); } debouncing = DEBOUNCE; } } unselect_cols(); } if (debouncing) { if (--debouncing) { _delay_ms(1); } else { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { matrix[i] = matrix_debouncing[i]; } } } return 1; }
uint8_t matrix_scan(void) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { select_col(col); _delay_us(3); // TODO: Determine the correct value needed here. uint8_t rows = read_rows(); if((col == 0 && !LAYOUT_MINI) || (col == 2 && LAYOUT_MINI) ) { rows |= read_caps(); } for (uint8_t row = 0; row < MATRIX_ROWS; row++) { bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); bool curr_bit = rows & (1<<row); if (prev_bit != curr_bit) { matrix_debouncing[row] ^= ((matrix_row_t)1<<col); if (debouncing) { dprint("bounce!: "); dprintf("%02X", debouncing); dprintln(); } debouncing = DEBOUNCE; } } unselect_cols(); } if (debouncing) { if (--debouncing) { _delay_ms(1); } else { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { matrix[i] = matrix_debouncing[i]; } } } return 1; }
static void scan_col(uint8_t col) { uint8_t row; uint8_t kb_reg; select_col(col); kb_reg = read_max(KB); write_max(KB, 0); for (row = 0; row < 4; row++) update_key(col, row, kb_reg); }
int main(int args, char* argvs[]) { int result, col_length; char col_type[ITEM_TYPE_LEN], col_name[ITEM_NAME_LEN]; struct msg_st string_item; int msgqid; char tb_name[TABLE_NAME_LEN]; char tmp[10][ITEM_NAME_LEN]; msgqid = msgget((key_t)3570, 0666 | IPC_CREAT); if (msgqid == -1) { ipc_msgget_failed(errno); } while (receive(0)) { switch (*string_item.text) { case '0': result=receive(0); string_item.text[result]='\0'; strcpy(tb_name, string_item.text); create_table(string_item.text); result = 0; while ((result = receive(0)) != -1) { string_item.text[result]='\0'; if (!strcmp(string_item.text, "TAIL")) break; sscanf(string_item.text, "%s %s %s %d", tmp[0], col_type, col_name, &col_length); if (tmp[0][0] == '0') create_col(col_name, col_type, col_length, 0); else create_col(col_name, col_type, col_length, 1); } if (-1 == result) ipc_msgrcv_failed(errno); create_table_on_close(); printf("CATTYDB : database %s successfully created.\n",tb_name); break; case '1': result=receive(0); string_item.text[result]='\0'; //printf("%s\n", string_item.text); describe_table(string_item.text); break; case '2': result = receive(0); string_item.text[result]='\0'; //printf("%s\n", string_item.text); insert_on_open(string_item.text); while ((result=receive(0)) != -1) { string_item.text[result]='\0'; if (!strcmp(string_item.text, "TAIL")) break; insert_item(string_item.text); } if (-1 == result) ipc_msgrcv_failed(errno); insert_on_close(); break; case '3': result = receive(0); string_item.text[result]='\0'; //printf("%s\n", string_item.text); delete_on_open(string_item.text); int i = 0; while ((result = receive(0)) != -1) { string_item.text[result]='\0'; if (!strcmp(string_item.text, "TAIL")) break; delete(string_item.text); //strcpy(tmp[i++], string_item.text); //puts(tmp[i-1]); } if (-1 == result) ipc_msgrcv_failed(errno); puts("del suc!"); break; case '6': puts("bye"); exit(0); case '7': result = receive(0); string_item.text[result]='\0'; printf("%s\n", string_item.text); show_table(string_item.text); break; case '8': result=receive(0); string_item.text[result]='\0'; select_where_on_open(string_item.text, "tmp"); result=receive(0); string_item.text[result]='\0'; select_where(string_item.text); select_where_on_close(); select_col_on_open("tmp", "tmp2"); result = 0; while ((result = receive(0)) != -1) { string_item.text[result]='\0'; if (!strcmp(string_item.text, "TAIL")) break; select_col_get_pos(string_item.text); } if (-1 == result) ipc_msgrcv_failed(errno); select_col(); select_col_on_close(); show_table("tmp2"); break; case '9': result = receive(0); string_item.text[result]='\0'; update_on_open(string_item.text); result = receive(0); string_item.text[result]='\0'; strcpy(tmp[0], string_item.text); result = receive(0); string_item.text[result]='\0'; update(tmp[0], string_item.text); break; case 'a': result = receive(0); string_item.text[result]='\0'; strcpy(tmp[0], string_item.text); result = receive(0); string_item.text[result]='\0'; equijoins_on_open(tmp[0], string_item.text, "tmp"); result = receive(0); string_item.text[result]='\0'; equijoins(string_item.text); equijoins_on_close(); show_table("tmp"); } } return 0; }