mirror of
https://github.com/Klipper3d/klipper.git
synced 2026-02-07 16:50:54 -07:00
trigger_analog: Add initial support for detecting "tap" events
Add a new "diff_peak_gt" trigger type. This will be useful with detecting ldc1612 "tap" events. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
9a97ade74f
commit
c9d904aa9d
1 changed files with 25 additions and 6 deletions
|
|
@ -22,12 +22,13 @@ struct trigger_analog {
|
|||
// Filtering
|
||||
struct sos_filter *sf;
|
||||
// Trigger value checking
|
||||
int32_t trigger_value;
|
||||
int32_t trigger_value, trigger_peak;
|
||||
uint32_t trigger_clock;
|
||||
uint8_t trigger_type;
|
||||
// Trsync triggering
|
||||
uint8_t flags, trigger_reason, error_reason;
|
||||
struct trsync *ts;
|
||||
uint32_t homing_clock, trigger_clock;
|
||||
uint32_t homing_clock;
|
||||
// Sensor activity monitoring
|
||||
uint8_t monitor_max, monitor_count;
|
||||
struct timer time;
|
||||
|
|
@ -41,10 +42,11 @@ enum {
|
|||
|
||||
// Trigger types
|
||||
enum {
|
||||
TT_ABS_GE, TT_GT
|
||||
TT_ABS_GE, TT_GT, TT_DIFF_PEAK_GT
|
||||
};
|
||||
DECL_ENUMERATION("trigger_analog_type", "abs_ge", TT_ABS_GE);
|
||||
DECL_ENUMERATION("trigger_analog_type", "gt", TT_GT);
|
||||
DECL_ENUMERATION("trigger_analog_type", "diff_peak_gt", TT_DIFF_PEAK_GT);
|
||||
|
||||
// Sample errors sent via trsync error code
|
||||
enum {
|
||||
|
|
@ -85,17 +87,34 @@ monitor_note_activity(struct trigger_analog *ta)
|
|||
|
||||
// Check if a value should signal a "trigger" event
|
||||
static int
|
||||
check_trigger(struct trigger_analog *ta, int32_t value)
|
||||
check_trigger(struct trigger_analog *ta, uint32_t time, int32_t value)
|
||||
{
|
||||
switch (ta->trigger_type) {
|
||||
case TT_ABS_GE:
|
||||
ta->trigger_clock = time;
|
||||
return abs(value) >= ta->trigger_value;
|
||||
case TT_GT:
|
||||
ta->trigger_clock = time;
|
||||
return value > ta->trigger_value;
|
||||
case TT_DIFF_PEAK_GT:
|
||||
if (value > ta->trigger_peak) {
|
||||
ta->trigger_clock = time;
|
||||
ta->trigger_peak = value;
|
||||
return 0;
|
||||
}
|
||||
uint32_t delta = ta->trigger_peak - value;
|
||||
return delta > ta->trigger_value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Reset fields associated with trigger checking
|
||||
static void
|
||||
trigger_reset(struct trigger_analog *ta)
|
||||
{
|
||||
ta->trigger_peak = INT32_MIN;
|
||||
}
|
||||
|
||||
// Stop homing due to an error
|
||||
static void
|
||||
cancel_homing(struct trigger_analog *ta, uint8_t error_code)
|
||||
|
|
@ -150,10 +169,9 @@ trigger_analog_update(struct trigger_analog *ta, int32_t sample)
|
|||
}
|
||||
|
||||
// Check if this is a "trigger"
|
||||
ret = check_trigger(ta, filtered_value);
|
||||
ret = check_trigger(ta, time, filtered_value);
|
||||
if (ret) {
|
||||
trsync_do_trigger(ta->ts, ta->trigger_reason);
|
||||
ta->trigger_clock = time;
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
|
|
@ -220,6 +238,7 @@ command_trigger_analog_home(uint32_t *args)
|
|||
ta->monitor_count = 0;
|
||||
ta->time.func = monitor_event;
|
||||
ta->flags = TA_AWAIT_HOMING | TA_CAN_TRIGGER;
|
||||
trigger_reset(ta);
|
||||
sched_add_timer(&ta->time);
|
||||
}
|
||||
DECL_COMMAND(command_trigger_analog_home,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue