16 #include "../../gfx.h"
18 #if (GFX_USE_GINPUT && GINPUT_NEED_TOGGLE) || defined(__DOXYGEN__)
22 #define GINPUT_TOGGLE_ISON 0x01
23 #define GINPUT_TOGGLE_INVERT 0x02
25 static GTIMER_DECL(ToggleTimer);
26 static struct GEventToggleStatus_t {
28 } ToggleStatus[GINPUT_TOGGLE_NUM_PORTS];
31 static void TogglePoll(
void *param) {
34 const GToggleConfig *ptc;
37 unsigned i, bits, mask;
41 for(ptc = GInputToggleConfigTable, i=0; i < GINPUT_TOGGLE_NUM_PORTS; ptc++) {
44 bits = ginput_lld_toggle_getbits(ptc) ^ ptc->invert;
47 for(mask = ptc->mask; i < GINPUT_TOGGLE_NUM_PORTS && mask; mask >>= 1, bits >>= 1) {
53 state = ToggleStatus[i].status & ~GINPUT_TOGGLE_ISON;
54 if (state & GINPUT_TOGGLE_INVERT)
57 state |= GINPUT_TOGGLE_ISON;
60 if ((state ^ ToggleStatus[i].status) & GINPUT_TOGGLE_ISON) {
63 ToggleStatus[i].status = state;
70 if ((state & GINPUT_TOGGLE_ISON)) {
71 if ((psl->listenflags & GLISTEN_TOGGLE_ON)) {
72 pe->type = GEVENT_TOGGLE;
78 if ((psl->listenflags & GLISTEN_TOGGLE_OFF)) {
79 pe->type = GEVENT_TOGGLE;
96 const GToggleConfig *ptc;
98 if (instance >= GINPUT_TOGGLE_NUM_PORTS)
103 for(ptc = GInputToggleConfigTable; ptc < GInputToggleConfigTable+
sizeof(GInputToggleConfigTable)/
sizeof(GInputToggleConfigTable[0]); ptc++)
104 ginput_lld_toggle_init(ptc);
105 gtimerStart(&ToggleTimer, TogglePoll, 0, gTrue, GINPUT_TOGGLE_POLL_PERIOD);
109 return (GSourceHandle)(ToggleStatus+instance);
114 if (instance >= GINPUT_TOGGLE_NUM_PORTS)
117 if (!(ToggleStatus[instance].status & GINPUT_TOGGLE_INVERT)) {
118 ToggleStatus[instance].status |= GINPUT_TOGGLE_INVERT;
119 ToggleStatus[instance].status ^= GINPUT_TOGGLE_ISON;
122 if ((ToggleStatus[instance].status & GINPUT_TOGGLE_INVERT)) {
123 ToggleStatus[instance].status &= ~GINPUT_TOGGLE_INVERT;
124 ToggleStatus[instance].status ^= GINPUT_TOGGLE_ISON;
137 if (instance >= GINPUT_TOGGLE_NUM_PORTS)
139 ptoggle->type = GEVENT_TOGGLE;
140 ptoggle->instance = instance;
141 ptoggle->on = (ToggleStatus[instance].status & GINPUT_TOGGLE_ISON) ? gTrue : gFalse;
146 void ginputToggleWakeup(
void) {
151 void ginputToggleWakeupI(
void) {
GEvent * geventGetEventBuffer(GSourceListener *psl)
Get the event buffer from the GSourceListener.
void geventSendEvent(GSourceListener *psl)
Called by a source to indicate the listener's event buffer has been filled.
GSourceListener * geventGetSourceListener(GSourceHandle gsh, GSourceListener *lastlr)
Called by a source with a possible event to get a listener record.
void gfxSleepMilliseconds(gDelay ms)
Put the current thread to sleep for the specified period in milliseconds.
void gtimerJabI(GTimer *pt)
Jab a timer causing the current period to immediate expire.
void gtimerStart(GTimer *pt, GTimerFunction fn, void *param, gBool periodic, gDelay millisec)
Set a timer going or alter its properties if it is already going.
gBool gtimerIsActive(GTimer *pt)
Test if a timer is currently active.
void gtimerJab(GTimer *pt)
Jab a timer causing the current period to immediate expire.
void ginputInvertToggle(gU16 instance, gBool invert)
Can be used to invert the sense of a toggle.
gBool ginputGetToggleStatus(gU16 instance, GEventToggle *ptoggle)
Get the current toggle status.
GSourceHandle ginputGetToggle(gU16 instance)
Create a toggle input instance.