154 lines
4.5 KiB
C
154 lines
4.5 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
#include "app_thread.h"
|
|
#include "app_utils.h"
|
|
#include "cmsis_os.h"
|
|
#include "hal_timer.h"
|
|
#include "hal_trace.h"
|
|
|
|
static APP_MOD_HANDLER_T mod_handler[APP_MODUAL_NUM];
|
|
|
|
static void app_thread(void const *argument);
|
|
osThreadDef(app_thread, osPriorityHigh, 1, 1024 * 3, "app_thread");
|
|
|
|
osMailQDef(app_mailbox, APP_MAILBOX_MAX, APP_MESSAGE_BLOCK);
|
|
static osMailQId app_mailbox = NULL;
|
|
static uint8_t app_mailbox_cnt = 0;
|
|
osThreadId app_thread_tid;
|
|
|
|
static int app_mailbox_init(void) {
|
|
app_mailbox = osMailCreate(osMailQ(app_mailbox), NULL);
|
|
if (app_mailbox == NULL) {
|
|
TRACE(0, "Failed to Create app_mailbox\n");
|
|
return -1;
|
|
}
|
|
app_mailbox_cnt = 0;
|
|
return 0;
|
|
}
|
|
|
|
int app_mailbox_put(APP_MESSAGE_BLOCK *msg_src) {
|
|
osStatus status;
|
|
|
|
APP_MESSAGE_BLOCK *msg_p = NULL;
|
|
|
|
msg_p = (APP_MESSAGE_BLOCK *)osMailAlloc(app_mailbox, 0);
|
|
|
|
if (!msg_p) {
|
|
osEvent evt;
|
|
TRACE_IMM(0, "osMailAlloc error dump");
|
|
for (uint8_t i = 0; i < APP_MAILBOX_MAX; i++) {
|
|
evt = osMailGet(app_mailbox, 0);
|
|
if (evt.status == osEventMail) {
|
|
TRACE_IMM(
|
|
9,
|
|
"cnt:%d mod:%d src:%08x tim:%d id:%x ptr:%08x para:%08x/%08x/%08x",
|
|
i, ((APP_MESSAGE_BLOCK *)(evt.value.p))->mod_id,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->src_thread,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->system_time,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_id,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_ptr,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param0,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param1,
|
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param2);
|
|
} else {
|
|
TRACE_IMM(2, "cnt:%d %d", i, evt.status);
|
|
break;
|
|
}
|
|
}
|
|
TRACE_IMM(0, "osMailAlloc error dump end");
|
|
}
|
|
|
|
ASSERT(msg_p, "osMailAlloc error");
|
|
msg_p->src_thread = (uint32_t)osThreadGetId();
|
|
msg_p->dest_thread = (uint32_t)NULL;
|
|
msg_p->system_time = hal_sys_timer_get();
|
|
msg_p->mod_id = msg_src->mod_id;
|
|
msg_p->msg_body.message_id = msg_src->msg_body.message_id;
|
|
msg_p->msg_body.message_ptr = msg_src->msg_body.message_ptr;
|
|
msg_p->msg_body.message_Param0 = msg_src->msg_body.message_Param0;
|
|
msg_p->msg_body.message_Param1 = msg_src->msg_body.message_Param1;
|
|
msg_p->msg_body.message_Param2 = msg_src->msg_body.message_Param2;
|
|
|
|
status = osMailPut(app_mailbox, msg_p);
|
|
if (osOK == status)
|
|
app_mailbox_cnt++;
|
|
return (int)status;
|
|
}
|
|
|
|
int app_mailbox_free(APP_MESSAGE_BLOCK *msg_p) {
|
|
osStatus status;
|
|
|
|
status = osMailFree(app_mailbox, msg_p);
|
|
if (osOK == status)
|
|
app_mailbox_cnt--;
|
|
|
|
return (int)status;
|
|
}
|
|
|
|
int app_mailbox_get(APP_MESSAGE_BLOCK **msg_p) {
|
|
osEvent evt;
|
|
evt = osMailGet(app_mailbox, osWaitForever);
|
|
if (evt.status == osEventMail) {
|
|
*msg_p = (APP_MESSAGE_BLOCK *)evt.value.p;
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static void app_thread(void const *argument) {
|
|
while (1) {
|
|
APP_MESSAGE_BLOCK *msg_p = NULL;
|
|
|
|
if (!app_mailbox_get(&msg_p)) {
|
|
if (msg_p->mod_id < APP_MODUAL_NUM) {
|
|
if (mod_handler[msg_p->mod_id]) {
|
|
int ret = mod_handler[msg_p->mod_id](&(msg_p->msg_body));
|
|
if (ret)
|
|
TRACE(2, "mod_handler[%d] ret=%d", msg_p->mod_id, ret);
|
|
}
|
|
}
|
|
app_mailbox_free(msg_p);
|
|
}
|
|
}
|
|
}
|
|
|
|
int app_os_init(void) {
|
|
if (app_mailbox_init())
|
|
return -1;
|
|
|
|
app_thread_tid = osThreadCreate(osThread(app_thread), NULL);
|
|
if (app_thread_tid == NULL) {
|
|
TRACE(0, "Failed to Create app_thread\n");
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int app_set_threadhandle(enum APP_MODUAL_ID_T mod_id,
|
|
APP_MOD_HANDLER_T handler) {
|
|
if (mod_id >= APP_MODUAL_NUM)
|
|
return -1;
|
|
|
|
mod_handler[mod_id] = handler;
|
|
return 0;
|
|
}
|
|
|
|
void *app_os_tid_get(void) { return (void *)app_thread_tid; }
|
|
|
|
bool app_is_module_registered(enum APP_MODUAL_ID_T mod_id) {
|
|
return mod_handler[mod_id];
|
|
}
|