lotus: Integrate ADC reading into matrix logic
Signed-off-by: Daniel Schaefer <git@danielschaefer.me>
This commit is contained in:
@@ -46,7 +46,8 @@ const float CONV_FACTOR = 3.3f / (1<<12);
|
|||||||
#define ADC_CH1_PIN GP27
|
#define ADC_CH1_PIN GP27
|
||||||
#define ADC_CH2_PIN GP28
|
#define ADC_CH2_PIN GP28
|
||||||
#define ADC_CH3_PIN GP29
|
#define ADC_CH3_PIN GP29
|
||||||
#define ADC_THRESHOLD 3.0 / CONV_FACTOR
|
// Voltage threshold - TODO: Need to adjust
|
||||||
|
#define ADC_THRESHOLD 3.0f
|
||||||
|
|
||||||
#define CALC_DIGITS 12
|
#define CALC_DIGITS 12
|
||||||
char calc_result[CALC_DIGITS+1] = "";
|
char calc_result[CALC_DIGITS+1] = "";
|
||||||
@@ -194,12 +195,9 @@ static void mux_select_row(int row) {
|
|||||||
/**
|
/**
|
||||||
* Based on the adc value, update the matrix for this column
|
* Based on the adc value, update the matrix for this column
|
||||||
* */
|
* */
|
||||||
static bool interpret_adc_row(matrix_row_t cur_matrix[], uint16_t adc_value, int col, int row) {
|
static bool interpret_adc_row(matrix_row_t cur_matrix[], float voltage, int col, int row) {
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
|
||||||
// TODO: Convert adc value to voltage
|
|
||||||
uint16_t voltage = adc_value;
|
|
||||||
|
|
||||||
// By default the voltage is high (3.3V)
|
// By default the voltage is high (3.3V)
|
||||||
// When a key is pressed it causes the voltage to go down.
|
// When a key is pressed it causes the voltage to go down.
|
||||||
// But because every key is connected in a matrix, pressing multiple keys
|
// But because every key is connected in a matrix, pressing multiple keys
|
||||||
@@ -210,15 +208,20 @@ static bool interpret_adc_row(matrix_row_t cur_matrix[], uint16_t adc_value, int
|
|||||||
key_state = 1;
|
key_state = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uprintf("Col %d - Row %d - ADC value:%04X, Voltage: %d\n", col, row, adc_value, voltage);
|
uprintf("Col %d - Row %d - State: %d, Voltage: ", col, row, key_state);
|
||||||
|
print_float(voltage);
|
||||||
|
|
||||||
// Don't update matrix on Pico to avoid messing with the debug system
|
// Don't update matrix on Pico to avoid messing with the debug system
|
||||||
// Can't attach the matrix anyways
|
// Can't attach the matrix anyways
|
||||||
#ifdef PICO_LOTUS
|
#ifdef PICO_LOTUS
|
||||||
(void)key_state;
|
(void)key_state;
|
||||||
#else
|
return false;
|
||||||
cur_matrix[row] |= key_state ? 0 : (1 << col);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
matrix_row_t new_row = cur_matrix[row] | key_state ? (1 << col) : 0;
|
||||||
|
changed = cur_matrix[row] == new_row;
|
||||||
|
cur_matrix[row] = new_row;
|
||||||
|
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,29 +280,25 @@ void drive_col(int col, bool high) {
|
|||||||
// Don't drive columns on pico because we're using these GPIOs for other purposes
|
// Don't drive columns on pico because we're using these GPIOs for other purposes
|
||||||
#ifdef PICO_LOTUS
|
#ifdef PICO_LOTUS
|
||||||
(void)gpio;
|
(void)gpio;
|
||||||
#else
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (high) {
|
if (high) {
|
||||||
// TODO: Could set up the pins with `setPinOutputOpenDrain` instead
|
// TODO: Could set up the pins with `setPinOutputOpenDrain` instead
|
||||||
writePinHigh(gpio);
|
writePinHigh(gpio);
|
||||||
} else {
|
} else {
|
||||||
writePinLow(gpio);
|
writePinLow(gpio);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static void read_adc(void) {
|
||||||
* Overriding behavior of matrix_scan from quantum/matrix.c
|
|
||||||
*/
|
|
||||||
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
|
||||||
bool changed = false;
|
|
||||||
|
|
||||||
print("scan\n");
|
|
||||||
uint32_t current_ts = timer_read32();
|
uint32_t current_ts = timer_read32();
|
||||||
if (prev_matrix_ts) {
|
if (prev_matrix_ts) {
|
||||||
uint32_t delta = current_ts - prev_matrix_ts;
|
uint32_t delta = current_ts - prev_matrix_ts;
|
||||||
uprintf("%lu ms (%ld Hz)\n", delta, 1000 / delta);
|
uprintf("%lu ms (%ld Hz)\n", delta, 1000 / delta);
|
||||||
}
|
}
|
||||||
prev_matrix_ts = current_ts;
|
prev_matrix_ts = current_ts;
|
||||||
|
// Need to sleep a bit, otherwise we seem to get stuck
|
||||||
chThdSleepMilliseconds(5);
|
chThdSleepMilliseconds(5);
|
||||||
#if !CHIBIOS_ADC
|
#if !CHIBIOS_ADC
|
||||||
uint16_t val = analogReadPin(ADC_CH2_PIN);
|
uint16_t val = analogReadPin(ADC_CH2_PIN);
|
||||||
@@ -310,6 +309,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Interrupt-driven
|
// Interrupt-driven
|
||||||
|
// Even the "blocking" one suspends the thread, so we shouldn't need this
|
||||||
//if (adc_state == s_ready) {
|
//if (adc_state == s_ready) {
|
||||||
// print("new sample\n");
|
// print("new sample\n");
|
||||||
|
|
||||||
@@ -330,22 +330,30 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
|||||||
print_float(temperature);
|
print_float(temperature);
|
||||||
uprintf("ADC Voltage: ");
|
uprintf("ADC Voltage: ");
|
||||||
print_float(adc_voltage);
|
print_float(adc_voltage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overriding behavior of matrix_scan from quantum/matrix.c
|
||||||
|
*/
|
||||||
|
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
print("scan\n");
|
||||||
|
|
||||||
for (int col = 0; col < MATRIX_COLS; col++) {
|
for (int col = 0; col < MATRIX_COLS; col++) {
|
||||||
break;
|
|
||||||
// Drive column low so we can measure the resistors on each row in this column
|
// Drive column low so we can measure the resistors on each row in this column
|
||||||
drive_col(col, false);
|
drive_col(col, false);
|
||||||
for (int row = 0; row <= MATRIX_ROWS; row++) {
|
for (int row = 0; row < MATRIX_ROWS; row++) {
|
||||||
|
|
||||||
// Read ADC for this row
|
// Read ADC for this row
|
||||||
mux_select_row(row);
|
mux_select_row(row);
|
||||||
|
|
||||||
wait_us(30); // Wait for column select and ADC to settle
|
// Wait for column select to settle and propagate to ADC
|
||||||
|
wait_us(30);
|
||||||
|
|
||||||
uint16_t adc_value = 0;//adc_read();
|
read_adc();
|
||||||
|
|
||||||
// Interpret ADC value as rows
|
// Interpret ADC value as rows
|
||||||
changed |= interpret_adc_row(current_matrix, adc_value, col, row);
|
changed |= interpret_adc_row(current_matrix, adc_voltage, col, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drive column high again
|
// Drive column high again
|
||||||
|
|||||||
Reference in New Issue
Block a user