erpc/port_self.c

196 lines
4.7 KiB
C

// #ifndef WINDOWS
// #error "This file is for Windows only"
// #endif
#include "erpc_core.h"
#include "windows.h"
#include <stdio.h>
u32 hellworld(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len)
{
ERPC_DEBUG("Hello World:\n");
ERPC_DEBUG("len = %d, msg :%s\n", len, data);
// 防止编译警告
UNUSED(hw);
UNUSED(src_id);
UNUSED(dest_id);
UNUSED(port);
UNUSED(data);
UNUSED(len);
return 0;
}
u32 hello_cat(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len)
{
ERPC_DEBUG("Hello Cat!\n");
// 防止编译警告
UNUSED(hw);
UNUSED(src_id);
UNUSED(dest_id);
UNUSED(port);
UNUSED(data);
UNUSED(len);
return 0;
}
u32 hello_dog(u8 hw, u8 src_id, u8 dest_id, u16 port, u8 *data, u16 len)
{
ERPC_DEBUG("Hello Dog!\n");
// 防止编译警告
u8 data_out[10] = "12345";
u32 ret = erpc_replay(hw, dest_id, port, data_out, sizeof(data_out));
ERPC_DEBUG("erpc_replay ret:%d\n", ret);
// 防止编译警告
UNUSED(ret);
UNUSED(hw);
UNUSED(src_id);
UNUSED(dest_id);
UNUSED(port);
UNUSED(data);
UNUSED(len);
return 0;
}
erpc_cmd_list_t erpc_cmd_list[] = {
{.cmd = 0x01, hellworld},
{.cmd = 0x02, hello_cat},
{.cmd = 0x03, hello_dog},
};
HANDLE deal_lock;
HANDLE send_lock;
static void deal_lock_h()
{
WaitForSingleObject(deal_lock, INFINITE);
}
static void deal_unlock_h()
{
ReleaseMutex(deal_lock);
}
static void send_lock_h()
{
WaitForSingleObject(send_lock, INFINITE);
}
static void send_unlock_h()
{
ReleaseMutex(send_lock);
}
u8 data[300];
static u8 data_write(u8 *data, u16 len)
{
erpc_set_rev_cahce(0, data, len);
return 0;
}
erpc_hw_cfg_t self_hw_cfg = {
.ord = 0,
.deal_lock = deal_lock_h,
.deal_unlock = deal_unlock_h,
.send_lock = send_lock_h,
.send_unlock = send_unlock_h,
.local_id = 0x01,
.write = data_write,
};
void erpc_cmd_config()
{
for (int i = 0; i < (int)sizeof(erpc_cmd_list) / (int)sizeof(erpc_cmd_list[0]); i++)
{
erpc_add_cmd_list(&self_hw_cfg, &erpc_cmd_list[i]);
}
}
void sys_sleep(u32 ms)
{
Sleep(ms);
}
DWORD WINAPI send_task(LPVOID lpParam)
{
UNUSED(lpParam);
while (1)
{
erpc_send_deal_core();
}
}
DWORD WINAPI rev_task(LPVOID lpParam)
{
UNUSED(lpParam);
while (1)
{
// ERPC_DEBUG("rev_task\n");
erpc_rev_package_core();
erpc_rev_deal_core();
}
}
DWORD WINAPI test_task(LPVOID lpParam)
{
UNUSED(lpParam);
ERPC_DEBUG("test_task\n");
while (1)
{
// ERPC_DEBUG("[test_task]send\n");
char msg[] = "miao miao miao\n";
u32 ret = erpc_send(self_hw_cfg.ord, self_hw_cfg.local_id, 0x01, (u8 *)msg, sizeof(msg));
ERPC_DEBUG("[test_task]send ret:%d\n", ret);
ret = erpc_send(self_hw_cfg.ord, self_hw_cfg.local_id, 0x02, NULL, 0);
ERPC_DEBUG("[test_task]send ret:%d\n", ret);
u16 reply_len = 30;
u8 data[reply_len];
ret = erpc_send_wait_reply(self_hw_cfg.ord, self_hw_cfg.local_id, 0x03, NULL, 0, data, &reply_len, 1000);
ERPC_DEBUG("[test_task]send ret:%d\n", ret);
for (int i = 0; i < reply_len; i++)
{
ERPC_DEBUG("%c", data[i]);
}
ERPC_DEBUG("\n");
UNUSED(ret);
sys_sleep(1000);
}
}
int main(int argc, char *argv[])
{
UNUSED(argc);
UNUSED(argv);
u32 ret = 0;
ERPC_DEBUG("erpc_port_self start\n");
ret = erpc_hw_add(&self_hw_cfg);
ERPC_DEBUG("erpc_hw_add ret:%d\n", ret);
CHECK_IF_ERROR(ret, 0);
erpc_cmd_config();
ERPC_DEBUG("erpc_cmd_config ret:%d\n", ret);
erpc_sleep_tick = sys_sleep;
HANDLE threadHandle[4];
deal_lock = CreateMutex(NULL, FALSE, NULL);
if (deal_lock == NULL)
{
ERPC_DEBUG("创建互斥锁失败\n");
return 1;
}
send_lock = CreateMutex(NULL, FALSE, NULL);
if (send_lock == NULL)
{
ERPC_DEBUG("创建互斥锁失败\n");
return 1;
}
threadHandle[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)send_task, NULL, 0, NULL);
threadHandle[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)rev_task, NULL, 0, NULL);
threadHandle[3] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)rev_task, NULL, 0, NULL);
threadHandle[4] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)test_task, NULL, 0, NULL);
WaitForSingleObject(threadHandle[0], INFINITE);
WaitForSingleObject(threadHandle[1], INFINITE);
WaitForSingleObject(threadHandle[2], INFINITE);
WaitForSingleObject(threadHandle[3], INFINITE);
CloseHandle(threadHandle[0]);
CloseHandle(threadHandle[1]);
CloseHandle(threadHandle[2]);
CloseHandle(threadHandle[3]);
return 0;
}