/*
 * has_task_msg_manager/has_task_os_port.c
 *
 * Author: zhangzhaopeng
 * Version： 1.0
 * Created on : 2026-01-05
 * 系统适配层
 */
#include <stdint.h>
#include "has_task_msg_os_port.h"

#ifdef MSG_OPT_MUTEX_SEM
/**
 * @brief 信号量初始化
 *
 * @param sem:信号量
 * @return 0:成功 -1：失败
 */
int msg_sem_init(msg_sem_t *sem)
{
#if (MSG_OPT_OS == MSG_OPT_OS_LINUX)
    sem->poll_fd.fd =  eventfd(0, EFD_SEMAPHORE | EFD_NONBLOCK);
    if (sem->poll_fd.fd == -1) {
        printf("create eventfd error!\n");
        return -1;
    }
    sem->poll_fd.events = POLLIN;  // 监控可读事件
    sem->poll_fd.revents = 0;
    return 0;
#elif (MSG_OPT_OS == MSG_OPT_OS_freeRTOS)
#elif (MSG_OPT_OS == MSG_OPT_OS_RT_THREAD)
#elif (MSG_OPT_OS == MSG_OPT_OS_NONE_OR_OSAL)
#elif (MSG_OPT_OS == MSG_OPT_OS_USER_DEFINED)
#endif
}

/**
 * @brief 消息通知
 *
 * @param sem:信号量
 * @return 0:成功 -1：失败
 */
int msg_sem_notify(msg_sem_t *sem)
{
#if (MSG_OPT_OS == MSG_OPT_OS_LINUX)
    uint64_t val = 1;
    if (write(sem->poll_fd.fd, &val, sizeof(val)) != sizeof(val)) {
        printf("notify thread err!\n");
        return -1;
    }
    return 0;
#elif (MSG_OPT_OS == MSG_OPT_OS_freeRTOS)
#elif (MSG_OPT_OS == MSG_OPT_OS_RT_THREAD)
#elif (MSG_OPT_OS == MSG_OPT_OS_NONE_OR_OSAL)
#elif (MSG_OPT_OS == MSG_OPT_OS_USER_DEFINED)
#endif
}

/**
 * @brief 等待消息
 *
 * @param sem:信号量
 * @param ms_timeout:超时时间（ms）其中0：消息直接返回；-1：一直阻塞
 * @return MSG_WAIT_RET:
 * WAIT_FAIL = -1, 等待失败
 * WAIT_TIMEOUT = -1, 等待超时
 * WAIT_MSG_COME = -1, 有新消息
 */
enum MSG_WAIT_RET msg_sem_wait(msg_sem_t *sem, int ms_timeout)
{
#if (MSG_OPT_OS == MSG_OPT_OS_LINUX)
    uint64_t val;
    int ret = poll(&sem->poll_fd, 1, ms_timeout);
    if (ret == -1) {
        perror("poll fail\n");
        return WAIT_FAIL;
    } else if (ret == 0) {
        // printf("poll timeout\n");
        return WAIT_TIMEOUT;
    }

    if (sem->poll_fd.revents & POLLIN) {
        if (read(sem->poll_fd.fd, &val, sizeof(val)) == sizeof(val)) { // 清零
            // printf("read %ld\n", val);
            return WAIT_MSG_COME;
        }
        else {
            printf("read error\n");
        }
    }

    // 检查错误事件
    printf("something err happened,revents:%x\n", sem->poll_fd.revents);
    return WAIT_FAIL;
#elif (MSG_OPT_OS == MSG_OPT_OS_freeRTOS)
#elif (MSG_OPT_OS == MSG_OPT_OS_RT_THREAD)
#elif (MSG_OPT_OS == MSG_OPT_OS_NONE_OR_OSAL)
#elif (MSG_OPT_OS == MSG_OPT_OS_USER_DEFINED)
#endif
}

#endif
