Skip to content

Commit

Permalink
Move optical sensor code to drivers folder (qmk#13044)
Browse files Browse the repository at this point in the history
  • Loading branch information
drashna authored and nhongooi committed Dec 5, 2021
1 parent d898db9 commit b80727b
Show file tree
Hide file tree
Showing 32 changed files with 60 additions and 890 deletions.
10 changes: 3 additions & 7 deletions keyboards/ploopyco/adns5050.c → drivers/sensors/adns5050.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,16 @@


#include "adns5050.h"
#include "quantum.h"
#include "wait.h"

#ifdef CONSOLE_ENABLE
# include "print.h"
#endif
#include "debug.h"
#include "print.h"
#include "gpio.h"

#ifndef OPTIC_ROTATED
# define OPTIC_ROTATED false
#endif

// Definitions for the ADNS serial line.
// These really ought to be defined in your config.h, but defaults are
// here if you're really lazy.
#ifndef ADNS_SCLK_PIN
# define ADNS_SCLK_PIN B7
#endif
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "spi_master.h"
#include "quantum.h"
#include "adns9800_srom_A6.h"
#include "adns.h"
#include "adns9800.h"

// registers
#define REG_Product_ID 0x00
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ static float precisionSpeed = 1;

static uint16_t i2c_timeout_timer;

#ifndef I2C_TIMEOUT
# define I2C_TIMEOUT 100
#ifndef PIMORONI_I2C_TIMEOUT
# define PIMORONI_I2C_TIMEOUT 100
#endif
#ifndef I2C_WAITCHECK
# define I2C_WAITCHECK 1000
Expand All @@ -38,7 +38,7 @@ static uint16_t i2c_timeout_timer;

void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) {
uint8_t data[] = {0x00, red, green, blue, white};
i2c_transmit(TRACKBALL_WRITE, data, sizeof(data), I2C_TIMEOUT);
i2c_transmit(TRACKBALL_WRITE, data, sizeof(data), PIMORONI_I2C_TIMEOUT);
}

int16_t mouse_offset(uint8_t positive, uint8_t negative, int16_t scale) {
Expand Down Expand Up @@ -68,59 +68,19 @@ __attribute__((weak)) void trackball_check_click(bool pressed, report_mouse_t* m
}
}

bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
if (true) {
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
}


if (!process_record_user(keycode, record)) { return false; }

/* If Mousekeys is disabled, then use handle the mouse button
* keycodes. This makes things simpler, and allows usage of
* the keycodes in a consistent manner. But only do this if
* Mousekeys is not enable, so it's not handled twice.
*/
#ifndef MOUSEKEY_ENABLE
if (IS_MOUSEKEY_BUTTON(keycode)) {
report_mouse_t currentReport = pointing_device_get_report();
if (record->event.pressed) {
currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
} else {
currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
}
pointing_device_set_report(currentReport);
pointing_device_send();
}
#endif

return true;
}

void trackball_register_button(bool pressed, enum mouse_buttons button) {
report_mouse_t currentReport = pointing_device_get_report();
if (pressed) {
currentReport.buttons |= button;
} else {
currentReport.buttons &= ~button;
}
pointing_device_set_report(currentReport);
}

float trackball_get_precision(void) { return precisionSpeed; }
void trackball_set_precision(float precision) { precisionSpeed = precision; }
bool trackball_is_scrolling(void) { return scrolling; }
void trackball_set_scrolling(bool scroll) { scrolling = scroll; }


__attribute__((weak)) void pointing_device_init(void) { trackball_set_rgbw(0x80, 0x00, 0x00, 0x00); }
__attribute__((weak)) void pointing_device_init(void) { i2c_init(); trackball_set_rgbw(0x00, 0x00, 0x00, 0x00); }

void pointing_device_task(void) {
static bool debounce;
static uint16_t debounce_timer;
uint8_t state[5] = {};
if (timer_elapsed(i2c_timeout_timer) > I2C_WAITCHECK) {
if (i2c_readReg(TRACKBALL_WRITE, 0x04, state, 5, I2C_TIMEOUT) == I2C_STATUS_SUCCESS) {
if (i2c_readReg(TRACKBALL_READ, 0x04, state, 5, PIMORONI_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) {
if (!state[4] && !debounce) {
if (scrolling) {
#ifdef PIMORONI_TRACKBALL_INVERT_X
Expand Down Expand Up @@ -159,7 +119,10 @@ void pointing_device_task(void) {
if (timer_elapsed(debounce_timer) > MOUSE_DEBOUNCE) debounce = false;

report_mouse_t mouse = pointing_device_get_report();
// trackball_check_click(state[4] & (1 << 7), &mouse);

#ifdef PIMORONI_TRACKBALL_CLICK
trackball_check_click(state[4] & (1 << 7), &mouse);
#endif

#ifndef PIMORONI_TRACKBALL_ROTATE
update_member(&mouse.x, &x_offset);
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifdef POINTING_DEVICE_ENABLE

#include "wait.h"
#include "debug.h"
#include "print.h"
Expand All @@ -29,17 +27,26 @@ bool _inBurst = false;
#ifndef PMW_CPI
# define PMW_CPI 1600
#endif
#ifndef PMW_CLOCK_SPEED
# define PMW_CLOCK_SPEED 70000000
#endif
#ifndef SPI_MODE
# define SPI_MODE 3
#endif
#ifndef SPI_DIVISOR
# define SPI_DIVISOR 2
# define SPI_DIVISOR (F_CPU / PMW_CLOCK_SPEED)
#endif
#ifndef ROTATIONAL_TRANSFORM_ANGLE
# define ROTATIONAL_TRANSFORM_ANGLE 0x00
#endif
#ifndef PMW_CS_PIN
# define PMW_CS_PIN SPI_SS_PIN
#endif

void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); }

bool spi_start_adv(void) {
bool status = spi_start(SPI_SS_PIN, false, 3, SPI_DIVISOR);
bool status = spi_start(PMW_CS_PIN, false, SPI_MODE, SPI_DIVISOR);
wait_us(1);
return status;
}
Expand All @@ -57,7 +64,7 @@ spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data) {
spi_start_adv();
// send address of the register, with MSBit = 1 to indicate it's a write
spi_status_t status = spi_write(reg_addr | 0x80);
status = spi_write(data);
status = spi_write(data);

// tSCLK-NCS for write operation
wait_us(20);
Expand Down Expand Up @@ -86,22 +93,29 @@ uint8_t spi_read_adv(uint8_t reg_addr) {
}

void pmw_set_cpi(uint16_t cpi) {
int cpival = constrain((cpi / 100) - 1, 0, 0x77); // limits to 0--119
uint8_t cpival = constrain((cpi / 100) - 1, 0, 0x77); // limits to 0--119

spi_start_adv();
spi_write_adv(REG_Config1, cpival);
spi_stop();
}

uint16_t pmw_get_cpi(void) {
uint8_t cpival = spi_read_adv(REG_Config1);
return (uint16_t)(cpival & 0xFF) * 100;
}

bool pmw_spi_init(void) {
setPinOutput(PMW_CS_PIN);

spi_init();
_inBurst = false;

spi_stop();
spi_start_adv();
spi_stop();

spi_write_adv(REG_Shutdown, 0xb6); // Shutdown first
spi_write_adv(REG_Shutdown, 0xb6); // Shutdown first
wait_ms(300);

spi_start_adv();
Expand All @@ -127,14 +141,18 @@ bool pmw_spi_init(void) {

wait_ms(1);

return pmw_check_signature();
}

void pmw_upload_firmware(void) {
spi_write_adv(REG_Config2, 0x00);

spi_write_adv(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -30, 30));

bool init_success = pmw_check_signature();

writePinLow(PMW_CS_PIN);

return init_success;
}

void pmw_upload_firmware(void) {
spi_write_adv(REG_SROM_Enable, 0x1d);

wait_ms(10);
Expand Down Expand Up @@ -217,5 +235,3 @@ report_pmw_t pmw_read_burst(void) {

return data;
}

#endif
1 change: 1 addition & 0 deletions keyboards/ploopyco/pmw3360.h → drivers/sensors/pmw3360.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data);
uint8_t spi_read_adv(uint8_t reg_addr);
bool pmw_spi_init(void);
void pmw_set_cpi(uint16_t cpi);
uint16_t pmw_get_cpi(void);
void pmw_upload_firmware(void);
bool pmw_check_signature(void);
report_pmw_t pmw_read_burst(void);
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion keyboards/draculad/keymaps/pimoroni/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include QMK_KEYBOARD_H
#include "pimoroni_trackball.h"
#include "drivers/sensors/pimoroni_trackball.h"
#include "pointing_device.h"


Expand Down
35 changes: 0 additions & 35 deletions keyboards/draculad/keymaps/pimoroni/pimoroni_trackball.h

This file was deleted.

2 changes: 1 addition & 1 deletion keyboards/draculad/keymaps/pimoroni/rules.mk
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# only uncomment on the side you have your trackball on
POINTING_DEVICE_ENABLE = yes
SRC += pimoroni_trackball.c
SRC += drivers/sensors/pimoroni_trackball.c
QUANTUM_LIB_SRC += i2c_master.c
OLED_DRIVER_ENABLE = yes
MOUSEKEY_ENABLE = no
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "dactyl_manuform.h"
#include "quantum.h"
#include "spi_master.h"
#include "pmw3360.h"
#include "drivers/sensors/pmw3360.h"
#include "pointing_device.h"


Expand Down
Loading

0 comments on commit b80727b

Please sign in to comment.