remotes/github/bad-doublebuf
parent
101d2534f4
commit
41ad18cc7c
@ -0,0 +1,111 @@ |
||||
//
|
||||
// Created by MightyPork on 2018/02/25.
|
||||
//
|
||||
|
||||
#include "platform.h" |
||||
#include "unit_base.h" |
||||
#include "unit_touch.h" |
||||
|
||||
#define TOUCH_INTERNAL |
||||
|
||||
#include "_touch_internal.h" |
||||
|
||||
#define DIS_TIME 1 |
||||
|
||||
static void startNextPhase(struct priv *priv); |
||||
|
||||
void UTOUCH_HandleIrq(void *arg) |
||||
{ |
||||
Unit *unit = arg; |
||||
struct priv *priv = unit->data; |
||||
|
||||
if (TSC->ISR & TSC_ISR_MCEF) { |
||||
priv->status = UTSC_STATUS_FAIL; |
||||
dbg_touch("TSC Failure."); |
||||
TSC->ICR = TSC_ICR_EOAIC | TSC_ICR_MCEIC; |
||||
} |
||||
|
||||
if (TSC->ISR & TSC_ISR_EOAF) { |
||||
TSC->ICR = TSC_ICR_EOAIC; |
||||
// assert_param((TSC->IOGCSR>>16) == priv->groups_phase[priv->next_phase]);
|
||||
|
||||
// Store captured data
|
||||
const uint32_t chmask = priv->channels_phase[priv->next_phase]; |
||||
for (int i = 0; i < 32; i++) { |
||||
if (chmask & (1<<i)) { |
||||
priv->readouts[i] = (uint16_t) (TSC->IOGXCR[i >> 2] & 0x3FFF); |
||||
} |
||||
} |
||||
|
||||
priv->next_phase++; |
||||
// check if we've run out of existing or populated groups
|
||||
if (priv->next_phase == 3 || priv->groups_phase[priv->next_phase] == 0) { |
||||
priv->next_phase = 0; |
||||
priv->status = UTSC_STATUS_READY; |
||||
// we'll stay in READY after the first loop until an error occurs or it's re-inited
|
||||
} |
||||
|
||||
TSC->CR &= ~TSC_CR_IODEF; // pull low - discharge
|
||||
} |
||||
|
||||
priv->ongoing = false; |
||||
priv->discharge_delay = DIS_TIME; |
||||
} |
||||
|
||||
#if TSC_DEBUG |
||||
static volatile uint32_t xcnt=0; |
||||
#endif |
||||
|
||||
void UTOUCH_updateTick(Unit *unit) |
||||
{ |
||||
#if TSC_DEBUG |
||||
xcnt++; |
||||
#endif |
||||
|
||||
struct priv *priv = unit->data; |
||||
|
||||
if (priv->ongoing) { |
||||
return; |
||||
} |
||||
|
||||
if (priv->discharge_delay > 0) { |
||||
priv->discharge_delay--; |
||||
} else { |
||||
startNextPhase(priv); |
||||
} |
||||
|
||||
#if TSC_DEBUG |
||||
if(xcnt >= 250) { |
||||
xcnt=0; |
||||
PRINTF("> "); |
||||
for (int i = 0; i < 32; i++) { |
||||
if (priv->all_channels_mask & (1<<i)) { |
||||
PRINTF("%d ", (int)priv->readouts[i]); |
||||
} |
||||
} |
||||
PRINTF("\r\n"); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
static void startNextPhase(struct priv *priv) |
||||
{ |
||||
if (priv->next_phase == 0 && priv->groups_phase[0] == 0) { |
||||
// no groups are configured
|
||||
return; |
||||
} |
||||
|
||||
TSC->IOGCSR = priv->groups_phase[priv->next_phase]; |
||||
TSC->IOCCR = priv->channels_phase[priv->next_phase]; |
||||
TSC->ICR = TSC_ICR_EOAIC | TSC_ICR_MCEIC; |
||||
|
||||
if (priv->cfg.interlaced) { |
||||
TSC->CR |= TSC_CR_IODEF; |
||||
// floaty (must be used for interlaced pads)
|
||||
// note: interlaced pads also need to be sampled individually
|
||||
} |
||||
|
||||
// Go!
|
||||
priv->ongoing = true; |
||||
TSC->CR |= TSC_CR_START; |
||||
} |
Loading…
Reference in new issue