Files
mkrtos-real/mkrtos_user/server/init/src/cons.c
2024-11-12 23:17:01 +08:00

148 lines
3.2 KiB
C

#include <u_types.h>
#include <u_queue.h>
#include <u_util.h>
#include <u_thread.h>
#include <u_log.h>
#include <u_hd_man.h>
#include <u_err.h>
#include <u_sema.h>
#include <assert.h>
#include <errno.h>
#include <u_sleep.h>
#include <pthread.h>
#include <rpc_prot.h>
#include "cons_svr.h"
#include <stdio.h>
#include <u_thread_util.h>
#include <u_thread.h>
#include <string.h>
#if IS_ENABLED(CONFIG_MMU)
#define CONS_STACK_SIZE 1024
#else
#define CONS_STACK_SIZE 512
#endif
static ATTR_ALIGN(8) uint8_t cons_stack[CONS_STACK_SIZE];
// static uint8_t cons_msg_buf[MSG_BUG_LEN];
static cons_t cons_obj;
static obj_handler_t cons_th;
static obj_handler_t sem_th;
static void console_read_func(void)
{
while (1)
{
int r_len = ulog_read_bytes(LOG_PROT, cons_obj.r_data_buf, sizeof(cons_obj.r_data_buf));
if (r_len > 0)
{
pthread_spin_lock(&cons_obj.r_lock);
for (int i = 0; i < r_len; i++)
{
q_enqueue(&cons_obj.r_queue, cons_obj.r_data_buf[i]);
}
pthread_spin_unlock(&cons_obj.r_lock);
if (sem_th)
{
u_sema_up(sem_th);
}
}
}
handler_free_umap(cons_obj.hd_cons_read);
while (1)
{
u_sleep_ms(1000);
}
}
void console_init(void)
{
cons_svr_obj_init(&cons_obj);
meta_reg_svr_obj(&cons_obj.svr, CONS_PROT);
u_thread_create(&cons_th, (char *)cons_stack + sizeof(cons_stack) - 8, NULL, console_read_func);
u_thread_run(cons_th, 16);
ulog_write_str(LOG_PROT, "cons svr init...\n");
}
/**
* @brief 向控制台写入数据
*
* @param data
* @param len
*/
int console_write(uint8_t *data, size_t len)
{
// pid_t src_pid = thread_get_src_pid();
// if (src_pid != cons_obj.active_pid)
// {
// /*TODO:存储到文件或者通过其他方式*/
// return -EACCES;
// }
pthread_mutex_lock(&cons_obj.w_lock);
ulog_write_bytes(LOG_PROT, data, len);
pthread_mutex_unlock(&cons_obj.w_lock);
return len;
}
/**
* @brief 向控制台读取数据
*
* @param data
* @param len
* @return int
*/
int console_read(uint8_t *data, size_t len)
{
int r_len = 0;
pid_t src_pid = thread_get_src_pid();
if (src_pid != cons_obj.active_pid)
{
return -EACCES;
}
if (q_queue_len(&cons_obj.r_queue) == 0)
{
// 回复没有消息
return 0;
}
else
{
pthread_spin_lock(&cons_obj.r_lock);
if (q_queue_len(&cons_obj.r_queue) == 0)
{
// 回复没有消息
pthread_spin_unlock(&cons_obj.r_lock);
return 0;
}
int i;
for (i = 0; i < q_queue_len(&cons_obj.r_queue) && i < len; i++)
{
uint8_t e;
if (q_dequeue(&cons_obj.r_queue, &e) < 0)
{
break;
}
data[i] = e;
}
r_len = i;
pthread_spin_unlock(&cons_obj.r_lock);
}
return r_len;
}
/**
* @brief 激活控制台为发送者进程
*
*/
void console_active(pid_t pid, obj_handler_t sem)
{
cons_obj.active_pid = pid;
if (sem)
{
if (sem_th)
{
handler_free_umap(sem_th);
}
sem_th = sem;
}
}