2022-08-15 04:20:27 -05:00
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
2023-02-01 14:52:54 -06:00
|
|
|
#include "at_thread.h"
|
2022-08-15 04:20:27 -05:00
|
|
|
#include "cmsis_os.h"
|
|
|
|
#include "hal_trace.h"
|
|
|
|
|
|
|
|
static void at_thread(void const *argument);
|
|
|
|
osThreadDef(at_thread, osPriorityNormal, 1, 1024, "AT_cmd");
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
osMailQDef(at_mailbox, AT_MAILBOX_MAX, AT_MESSAGE);
|
2022-08-15 04:20:27 -05:00
|
|
|
static osMailQId at_mailbox = NULL;
|
|
|
|
static uint8_t at_mailbox_cnt = 0;
|
|
|
|
#define AT_DEBUG TRACE
|
2023-02-01 14:52:54 -06:00
|
|
|
static int at_mailbox_init(void) {
|
|
|
|
AT_DEBUG("%s,%d", __func__, __LINE__);
|
|
|
|
at_mailbox = osMailCreate(osMailQ(at_mailbox), NULL);
|
|
|
|
if (at_mailbox == NULL) {
|
|
|
|
AT_DEBUG("Failed to Create at_mailbox\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
at_mailbox_cnt = 0;
|
|
|
|
return 0;
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
static int at_mailbox_put(AT_MESSAGE *msg_src) {
|
|
|
|
osStatus status;
|
|
|
|
AT_MESSAGE *msg_p = NULL;
|
|
|
|
|
|
|
|
AT_DEBUG("%s,%d", __func__, __LINE__);
|
|
|
|
if (at_mailbox_cnt >= 1) {
|
|
|
|
AT_DEBUG("%s,%d at_mailbox_cnt = %d.", __func__, __LINE__, at_mailbox_cnt);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
msg_p = (AT_MESSAGE *)osMailAlloc(at_mailbox, 0);
|
|
|
|
ASSERT(msg_p, "osMailAlloc error");
|
|
|
|
msg_p->id = msg_src->id;
|
|
|
|
msg_p->ptr = msg_src->ptr;
|
|
|
|
msg_p->param0 = msg_src->param0;
|
|
|
|
msg_p->param1 = msg_src->param1;
|
|
|
|
|
|
|
|
status = osMailPut(at_mailbox, msg_p);
|
|
|
|
if (osOK == status)
|
|
|
|
at_mailbox_cnt++;
|
|
|
|
AT_DEBUG("%s,%d,at_mailbox_cnt = %d.", __func__, __LINE__, at_mailbox_cnt);
|
|
|
|
return (int)status;
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
static int at_mailbox_free(AT_MESSAGE *msg_p) {
|
|
|
|
osStatus status;
|
2022-08-15 04:20:27 -05:00
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
AT_DEBUG("%s,%d", __func__, __LINE__);
|
|
|
|
status = osMailFree(at_mailbox, msg_p);
|
|
|
|
if (osOK == status)
|
|
|
|
at_mailbox_cnt--;
|
|
|
|
AT_DEBUG("%s,%d,at_mailbox_cnt = %d.", __func__, __LINE__, at_mailbox_cnt);
|
|
|
|
return (int)status;
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
static int at_mailbox_get(AT_MESSAGE **msg_p) {
|
|
|
|
osEvent evt;
|
|
|
|
evt = osMailGet(at_mailbox, osWaitForever);
|
|
|
|
if (evt.status == osEventMail) {
|
|
|
|
*msg_p = (AT_MESSAGE *)evt.value.p;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return -1;
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
static void at_thread(void const *argument) {
|
|
|
|
AT_FUNC_T pfunc;
|
|
|
|
// USB_FUNC_T usb_funcp;
|
|
|
|
AT_DEBUG("%s,%d", __func__, __LINE__);
|
|
|
|
while (1) {
|
|
|
|
AT_MESSAGE *msg_p = NULL;
|
|
|
|
if (!at_mailbox_get(&msg_p)) {
|
|
|
|
AT_DEBUG("_debug: %s,%d", __func__, __LINE__);
|
|
|
|
AT_DEBUG("at_thread: id = 0x%x, ptr = 0x%x,param0 = 0x%x,param1 = 0x%x.",
|
|
|
|
msg_p->id, msg_p->ptr, msg_p->param0, msg_p->param1);
|
|
|
|
pfunc = (AT_FUNC_T)msg_p->ptr;
|
|
|
|
pfunc(msg_p->param0, msg_p->param1);
|
|
|
|
at_mailbox_free(msg_p);
|
|
|
|
}
|
|
|
|
}
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
int at_os_init(void) {
|
|
|
|
osThreadId at_tid;
|
|
|
|
|
|
|
|
AT_DEBUG("%s,%d", __func__, __LINE__);
|
|
|
|
if (at_mailbox_init()) {
|
|
|
|
AT_DEBUG("_debug: %s,%d", __func__, __LINE__);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
at_tid = osThreadCreate(osThread(at_thread), NULL);
|
|
|
|
if (at_tid == NULL) {
|
|
|
|
AT_DEBUG("Failed to Create at_thread\n");
|
|
|
|
return -2;
|
|
|
|
}
|
|
|
|
return 0;
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
int at_enqueue_cmd(uint32_t cmd_id, uint32_t param, uint32_t pfunc) {
|
|
|
|
AT_MESSAGE at_msg;
|
|
|
|
int32_t ret;
|
2022-08-15 04:20:27 -05:00
|
|
|
|
2023-02-01 14:52:54 -06:00
|
|
|
at_msg.id = AT_MESSAGE_ID_CMD;
|
|
|
|
at_msg.param0 = param;
|
|
|
|
at_msg.param1 = cmd_id;
|
|
|
|
at_msg.ptr = pfunc;
|
|
|
|
ret = at_mailbox_put(&at_msg);
|
|
|
|
return ret;
|
2022-08-15 04:20:27 -05:00
|
|
|
}
|