lotus: Integrate ADC reading into matrix logic

Signed-off-by: Daniel Schaefer <git@danielschaefer.me>
This commit is contained in:
Daniel Schaefer
2023-01-07 21:35:16 +08:00
parent 72247be69f
commit 12c192c323

View File

@@ -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