2021-05-31 17:22:42 +08:00

79 lines
2.0 KiB
C++

#ifndef TRACKBALL_H
#define TRACKBALL_H
#include "devterm.h"
#include "keys_io_map.h"
/*
#define BOUNCE_INTERVAL 30
#define BASE_MOVE_PIXELS 5
#define EXPONENTIAL_BOUND 15
#define EXPONENTIAL_BASE 1.2
*/
#define BTN_PIN KEY0
#define RIGHT_PIN HO3
#define LEFT_PIN HO1
#define DOWN_PIN HO4
#define UP_PIN HO2
typedef struct _track_speed {
uint8_t bounce_interval;
uint8_t base_move_pixels;
uint8_t exponential_bound;
double exponential_base;
}TrackSpeed;
class Direction {
public:
Direction(int pin1, int pin2) {
this->pins[0] = pin1;
this->pins[1] = pin2;
pinMode(this->pins[0], INPUT);
pinMode(this->pins[1], INPUT);
};
int read_action() {
for(int i = 0; i < 2; ++i) {
this->current_actions[i] = digitalRead(this->pins[i]);
this->current_action_times[i] = millis();
if(this->current_actions[i] != this->last_actions[i]) {
this->last_actions[i] = this->current_actions[i];
exponential = ( ts->exponential_bound - (this->current_action_times[i] - this->last_action_times[i]));
exponential = (exponential > 0) ? exponential : 1;
move_multiply = ts->exponential_base;
for(int i = 0; i < exponential; ++i) {
move_multiply *= ts->exponential_base;
}
this->last_action_times[i] = this->current_action_times[i];
if(i == 0) {
return (-1) * ts->base_move_pixels * move_multiply;
} else {
return ts->base_move_pixels * move_multiply;
}
}
}
return 0;
};
TrackSpeed *ts;
private:
int pins[2];
int current_actions[2];
int last_actions[2];
int exponential;
double move_multiply;
unsigned long current_action_times[2];
unsigned long last_action_times[2];
};
void trackball_init(DEVTERM*);
void trackball_task(DEVTERM*);
#endif