Fumofumotris/source/fumoengine/input/input.c

117 lines
2.5 KiB
C
Raw Normal View History

#include "input.h"
2024-04-23 20:33:32 +00:00
#include <string.h>
2024-03-25 05:34:59 +00:00
2024-04-16 22:14:53 +00:00
#include "platform.h"
2024-03-25 05:34:59 +00:00
2024-04-30 21:41:31 +00:00
2024-05-02 22:17:37 +00:00
RingBufferT IO_BUF_T = RINGBUF_T_INIT(
struct RecordBuffer,
struct InputRecord,
IO_BUF_SIZE
);
2024-04-29 20:01:48 +00:00
2024-05-02 22:17:37 +00:00
RingBufferT STR_BUF_T = RINGBUF_T_INIT(
struct StringBuffer,
char,
STR_BUF_SIZE
);
2024-04-29 20:01:48 +00:00
2024-04-30 21:41:31 +00:00
2024-04-29 20:01:48 +00:00
void *input_worker(void *arg)
2024-04-16 22:14:53 +00:00
{
2024-04-29 20:01:48 +00:00
struct InputHandle *hand = arg;
2024-04-23 20:33:32 +00:00
2024-05-02 22:17:37 +00:00
struct RecordBuffer tmp_recs = { .head.len = 0, .head.start = 0 };
struct StringBuffer tmp_str = { .head.len = 0, .head.start = 0 };
2024-04-01 22:39:21 +00:00
2024-04-19 20:23:11 +00:00
while (!hand->is_terminating) {
2024-04-30 06:04:25 +00:00
if (!PlatformReadInput(&tmp_recs, &tmp_str)) {
2024-04-29 20:01:48 +00:00
hand->err = true;
2024-04-22 05:19:54 +00:00
return nullptr;
2024-04-29 20:01:48 +00:00
}
2024-04-30 04:43:41 +00:00
2024-04-29 20:01:48 +00:00
if (pthread_mutex_lock(&hand->mutex) != 0) {
hand->err = true;
2024-04-22 05:19:54 +00:00
return nullptr;
2024-04-29 20:01:48 +00:00
}
2024-04-19 20:23:11 +00:00
2024-04-29 20:01:48 +00:00
while (tmp_recs.head.len == IO_BUF_SIZE) {
if (pthread_cond_wait(&hand->is_consumed, &hand->mutex) != 0) {
hand->err = true;
2024-04-22 22:13:13 +00:00
return nullptr;
2024-04-29 20:01:48 +00:00
}
2024-04-22 22:13:13 +00:00
}
2024-05-02 22:17:37 +00:00
RingBufferTransfer(IO_BUF_T, &hand->recs.head, &tmp_recs.head);
RingBufferTransfer(STR_BUF_T, &hand->str.head, &tmp_str.head);
2024-04-19 20:23:11 +00:00
2024-04-29 20:01:48 +00:00
if (pthread_mutex_unlock(&hand->mutex) != 0) {
hand->err = true;
2024-04-22 05:19:54 +00:00
return nullptr;
2024-04-29 20:01:48 +00:00
}
2024-04-01 22:39:21 +00:00
}
2024-04-22 05:19:54 +00:00
return nullptr;
2024-04-19 20:23:11 +00:00
}
2024-03-25 05:34:59 +00:00
2024-05-02 22:17:37 +00:00
bool BeginInputThread(struct InputHandle *hand)
{
2024-04-29 20:01:48 +00:00
*hand = (struct InputHandle) {
2024-05-02 22:17:37 +00:00
.recs.head = RINGBUF_HEAD_INIT,
.str.head = RINGBUF_HEAD_INIT,
2024-04-29 20:01:48 +00:00
.err = 0,
.is_terminating = false,
};
2024-04-22 22:13:13 +00:00
2024-04-29 20:01:48 +00:00
if (pthread_mutex_init(&hand->mutex, nullptr) != 0)
return false;
if (pthread_cond_init(&hand->is_consumed, nullptr) != 0)
return false;
if (pthread_create(&hand->thread, nullptr, input_worker, hand) != 0)
return false;
return true;
2024-03-25 05:34:59 +00:00
}
2024-04-29 20:01:48 +00:00
bool EndInputThread(struct InputHandle *hand)
2024-03-25 05:34:59 +00:00
{
2024-04-19 20:23:11 +00:00
hand->is_terminating = true;
if (!PlatformStopInput())
return false;
2024-04-29 20:01:48 +00:00
if (pthread_mutex_destroy(&hand->mutex) != 0)
return false;
if (pthread_join(hand->thread, nullptr) != 0)
return false;
return true;
}
bool InputAquire(struct InputHandle *hand)
{
if (pthread_mutex_lock(&hand->mutex) != 0)
return false;
return true;
}
bool InputRelease(struct InputHandle *hand)
{
if (pthread_cond_signal(&hand->is_consumed) != 0)
2024-04-19 20:23:11 +00:00
return false;
2024-04-29 20:01:48 +00:00
if (pthread_mutex_unlock(&hand->mutex) != 0)
2024-04-19 20:23:11 +00:00
return false;
return true;
2024-04-30 21:41:31 +00:00
}
2024-05-02 22:17:37 +00:00
size_t InputString(struct InputHandle *hand, size_t n, char *buf)
2024-04-30 21:41:31 +00:00
{
2024-05-02 22:17:37 +00:00
return RingBufferOut(STR_BUF_T, n, buf, &hand->str.head);
2024-03-25 05:34:59 +00:00
}