示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
文件: matrix.c 项目: lmorchard/modelm
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;
}
示例#4
0
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;
}
示例#5
0
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);
}
示例#6
0
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;
}