69 lines
1.3 KiB
C
69 lines
1.3 KiB
C
|
#include <stddef.h>
|
||
|
#include <signal.h>
|
||
|
#include <pthread.h>
|
||
|
#include "log.h"
|
||
|
#include "msg_queue.h"
|
||
|
#include "gpio.h"
|
||
|
|
||
|
PMSG_QUEUE Sys_Queue = NULL;
|
||
|
|
||
|
static pthread_t ithread;
|
||
|
static volatile sig_atomic_t running = 1;
|
||
|
static int last_bstate = 0;
|
||
|
|
||
|
static void *input_thread(void *arg)
|
||
|
{
|
||
|
int st, tmp, mask;
|
||
|
uintptr_t attr;
|
||
|
|
||
|
while (running)
|
||
|
{
|
||
|
/* poll hardware buttons */
|
||
|
st = Gpio_read_buttons();
|
||
|
if (st != last_bstate)
|
||
|
{
|
||
|
tmp = last_state & ~st;
|
||
|
for (attr = 1, mask = 1; attr <= 4; attr++, mask <<= 1)
|
||
|
{
|
||
|
if (tmp & mask)
|
||
|
MqPost1(Sys_Queue, 0, WM_HWBUTTONUP, attr);
|
||
|
}
|
||
|
tmp = st & ~last_state;
|
||
|
for (attr = 1, mask = 1; attr <= 4; attr++, mask <<= 1)
|
||
|
{
|
||
|
if (tmp & mask)
|
||
|
MqPost1(Sys_Queue, 0, WM_HWBUTTONDOWN, attr);
|
||
|
}
|
||
|
last_bstate = st;
|
||
|
}
|
||
|
|
||
|
/* additional poll activity here */
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
int SysEnableInput(void)
|
||
|
{
|
||
|
int rc;
|
||
|
|
||
|
Sys_Queue = MqAlloc(64);
|
||
|
if (!Sys_Queue)
|
||
|
{
|
||
|
Log(LFATAL, "Unable to allocate system message queue.");
|
||
|
return 1;
|
||
|
}
|
||
|
running = 1;
|
||
|
rc = pthread_create(&ithread, NULL, input_thread, NULL);
|
||
|
if (rc != 0)
|
||
|
Log(LFATAL, "Unable to start system input thread (%d).", rc);
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
void SysDisableInput(void)
|
||
|
{
|
||
|
running = 0;
|
||
|
pthread_join(ithread, NULL);
|
||
|
MqDestroy(Sys_Queue);
|
||
|
Sys_Queue = NULL;
|
||
|
}
|