diff --git a/.vscode/settings.json b/.vscode/settings.json index c1febf6..df5d262 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -82,6 +82,8 @@ "*.tcc": "c", "ctype.h": "c", "time.h": "c", - "task_pen_head.h": "c" + "task_pen_head.h": "c", + "setjmp.h": "c", + "algorithm": "c" } } \ No newline at end of file diff --git a/source/app/main.c b/source/app/main.c index 49fcab7..a5d525d 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -36,10 +36,10 @@ void L0_BSP_init(void) // WIFI初始化 L2_Wifi_init(); // OID初始化 - // L2_OID_init(); + L0_Oid_Init(); LED2 = 0; - L0_Oid_Init(); + } void L0_TASK_init(void) { @@ -55,6 +55,9 @@ void L0_TASK_init(void) //WIFI任务初始化 L3_task_W600_flow_init(W600_ST); + //游戏任务初始化 + L3_task_game_init(); + // //游戏任务初始化 // L3_task_game_init(); // //寄存器监听任务初始化 @@ -94,7 +97,7 @@ void main(void) while(1) { // OID数据采集 - L1_Oid_readoid(); + // L1_Oid_readoid(); if(1 == s_nos_tick.t1s_heartbeat)//1s { @@ -102,25 +105,28 @@ void main(void) L0_uart0_uc('.'); // L0_uart0_sendstr("ADC = "); // L0_uart0_us(L1_ADC_Read(12)); - - } - if (ts_oid.ok == 1) - { - ts_oid.ok = 0; - L0_uart0_sendstr("ts_oid.Xint = "); - L0_uart0_ushex(ts_oid.Xint); - L0_uart0_0d0a(); - L0_uart0_sendstr("ts_oid.Yint = "); - L0_uart0_ushex(ts_oid.Yint); - L0_uart0_0d0a(); - L0_uart0_sendstr("ts_oid.Xdec = "); - L0_uart0_ushex(ts_oid.Xdec); - L0_uart0_0d0a(); - L0_uart0_sendstr("ts_oid.Ydec = "); - L0_uart0_ushex(ts_oid.Ydec); - L0_uart0_0d0a(); - L0_uart0_sendstr("oid_p"); + // L2_WT2605B_Broadcast(&audio_game_complete); } + // 游戏任务 + L3_task_game_handler(&_s_task_game); + + // if (ts_oid.ok == 1) + // { + // ts_oid.ok = 0; + // L0_uart0_sendstr("ts_oid.Xint = "); + // L0_uart0_ushex(ts_oid.Xint); + // L0_uart0_0d0a(); + // L0_uart0_sendstr("ts_oid.Yint = "); + // L0_uart0_ushex(ts_oid.Yint); + // L0_uart0_0d0a(); + // L0_uart0_sendstr("ts_oid.Xdec = "); + // L0_uart0_ushex(ts_oid.Xdec); + // L0_uart0_0d0a(); + // L0_uart0_sendstr("ts_oid.Ydec = "); + // L0_uart0_ushex(ts_oid.Ydec); + // L0_uart0_0d0a(); + // L0_uart0_sendstr("oid_p"); + // } // // 系统状态任务 // L3_task_appstatus_handler(&_s_task_appstatus); // // 系统状态测试任务 diff --git a/source/app/main.h b/source/app/main.h index 8d5d0a2..458a269 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -66,8 +66,6 @@ #include "../app/app_task_tcp.h" #include "../app/app_task_tcp_control.h" #include "../app/app_task_speech.h" -#include "../app/task_game.h" - #include "../app/app_config.h" #include "../app/app_eeprom.h" @@ -76,6 +74,7 @@ #include "../app/task_keystatus.h" #include "../app/task_w600.h" #include "../app/task_SmartConfig.h" +#include "../app/task_game.h" #include "../bsp/bsp_led.h" diff --git a/source/app/task_game.c b/source/app/task_game.c index 6f77516..bf26440 100644 --- a/source/app/task_game.c +++ b/source/app/task_game.c @@ -10,84 +10,262 @@ /// @note cc_AS_stc02 ////////////////////////////////////////////////////////////////////////////// -#include "task_game.h" +#include "../app/task_game.h" #include "../bsp/bsp_oid.h" -#include "app_task_speech.h" #include "../app/app_config.h" #include "../bsp/bsp_config.h" #include "../msp/uart0.h" #include "../msp/uart3.h" +#include "../bsp/bsp_WT2605B.h" + + +// 系统不识别的码:无效码 0x3FFF,0x0000 +// 支持码:本游戏支持的 +// 正确码和错误码:单个游戏内的 + + +// 游戏标识码 +// 游戏内容码 S_TASK_GAME _s_task_game; -//============================================= +#define GAME_OID_ZBT 0x3133 +#define GAME_OID_SHERT 0x3142 +#define GAME_OID_ZMG 0x3152 + +#define EEROR_OID 0x3FFF //无效码 +#define GAME_MAX_SECONDS 600 + + void L3_task_game_init(void) { + U8 i = 0; + U8 j = 0; L1_task_init(&_s_task_game.task); L3_task_s_go(_s_task_game,D_task_init); + _s_task_game.read_oid = 0; + _s_task_game.error_oid = EEROR_OID; + _s_task_game.game_maxseconds = GAME_MAX_SECONDS; + + for (i = 0; i < game_num_max; i++) + { + _s_task_game.game_info[i].game_oid = 0; + for (j = 0; j < game_supported_oid_max; j++) + { + _s_task_game.game_info[i].game_supported_oid[j].oid = 0; + _s_task_game.game_info[i].game_supported_oid[j].yes_or_no = 1; + _s_task_game.game_info[i].game_supported_oid[j].point_audio = NULL; + _s_task_game.game_info[i].game_supported_oid[j].handled = 0; + } + } + _s_task_game.game_info[0].game_oid = GAME_OID_ZBT; + _s_task_game.game_info[0].game_audio = &audio_game_different; + _s_task_game.game_info[0].game_supported_oid[0].oid = 0x3135; + _s_task_game.game_info[0].game_supported_oid[1].oid = 0x3136; + _s_task_game.game_info[0].game_supported_oid[2].oid = 0x3137; + _s_task_game.game_info[0].game_supported_oid[3].oid = 0x3138; + _s_task_game.game_info[0].game_supported_oid[4].oid = 0x3178; + _s_task_game.game_info[0].game_supported_oid[4].yes_or_no = 0; + + _s_task_game.game_info[0].game_order = 0; + _s_task_game.game_info[0].game_order_index = 0; + _s_task_game.game_info[0].game_timeout_seconds = 600; + _s_task_game.game_info[0].game_score = 0; + + _s_task_game.game_info[1].game_oid = GAME_OID_SHERT; + _s_task_game.game_info[1].game_audio = &audio_game_shulte; + _s_task_game.game_info[1].game_supported_oid[0].oid = 0x3144; + _s_task_game.game_info[1].game_supported_oid[1].oid = 0x3145; + _s_task_game.game_info[1].game_supported_oid[2].oid = 0x3146; + _s_task_game.game_info[1].game_supported_oid[3].oid = 0x3147; + _s_task_game.game_info[1].game_supported_oid[4].oid = 0x3148; + _s_task_game.game_info[1].game_supported_oid[5].oid = 0x3149; + _s_task_game.game_info[1].game_supported_oid[6].oid = 0x314A; + _s_task_game.game_info[1].game_supported_oid[7].oid = 0x314C; + _s_task_game.game_info[1].game_supported_oid[8].oid = 0x314D; + _s_task_game.game_info[1].game_supported_oid[9].oid = 0x314E; + _s_task_game.game_info[1].game_supported_oid[10].oid = 0x3159; + _s_task_game.game_info[1].game_supported_oid[11].oid = 0x315A; + _s_task_game.game_info[1].game_supported_oid[12].oid = 0x315B; + _s_task_game.game_info[1].game_supported_oid[13].oid = 0x315C; + _s_task_game.game_info[1].game_supported_oid[14].oid = 0x315D; + _s_task_game.game_info[1].game_supported_oid[15].oid = 0x315E; + _s_task_game.game_info[1].game_supported_oid[16].oid = 0x3167; + _s_task_game.game_info[1].game_supported_oid[17].oid = 0x3168; + _s_task_game.game_info[1].game_supported_oid[18].oid = 0x3169; + _s_task_game.game_info[1].game_supported_oid[19].oid = 0x316A; + _s_task_game.game_info[1].game_supported_oid[20].oid = 0x316B; + _s_task_game.game_info[1].game_supported_oid[21].oid = 0x316C; + _s_task_game.game_info[1].game_supported_oid[22].oid = 0x3175; + _s_task_game.game_info[1].game_supported_oid[23].oid = 0x3176; + _s_task_game.game_info[1].game_supported_oid[24].oid = 0x3177; + _s_task_game.game_info[1].game_supported_oid[25].oid = 0x3179; + _s_task_game.game_info[1].game_supported_oid[25].yes_or_no = 0; + _s_task_game.game_info[1].game_order = 1; + _s_task_game.game_info[1].game_order_index = 0; + _s_task_game.game_info[1].game_timeout_seconds = 600; + _s_task_game.game_info[1].game_score = 0; + + _s_task_game.game_info[2].game_oid = GAME_OID_ZMG; + _s_task_game.game_info[2].game_audio = &audio_game_maze; + _s_task_game.game_info[2].game_supported_oid[0].oid = 0x4E85; + _s_task_game.game_info[2].game_supported_oid[1].oid = 0x4E86; + _s_task_game.game_info[2].game_supported_oid[2].oid = 0x4E88; + _s_task_game.game_info[2].game_supported_oid[3].oid = 0x4E89; + _s_task_game.game_info[2].game_supported_oid[4].oid = 0x4E9A; + _s_task_game.game_info[2].game_supported_oid[5].oid = 0x317A; + _s_task_game.game_info[2].game_supported_oid[5].yes_or_no = 0; + _s_task_game.game_info[2].game_order = 1; + _s_task_game.game_info[2].game_order_index = 0; + _s_task_game.game_info[2].game_timeout_seconds = 600; + _s_task_game.game_info[2].game_score = 0; + + + _s_task_game.game_info_index = -1; + _s_task_game.game_point_index = -1; + _s_task_game.start_seconds = 0; + _s_task_game.eeror_times = 0; } -#define D_task_GAME_SELECT 0x60 -#define D_task_GAME_ZMG 0x61 -#define D_task_GAME_ZBT 0x62 -#define D_task_GAME_SchulteGrid 0x63 +#define D_task_READ_OID 0x50 +#define D_task_GAME_SWITCH 0x51 +#define D_task_GAME_PLAY 0x52 +#define D_task_GAME_COMPLETED 0x53 + void L3_task_game_handler(S_TASK_GAME *s) { + TTSS_Task_init() - L2_task_go(D_task_GAME_SELECT); + L2_task_go(D_task_READ_OID); + + TTSS_Task_step(D_task_READ_OID) + L1_Oid_readoid(); + + if (ts_oid.ok == 1) + { + ts_oid.ok = 0; + s->read_oid = ts_oid.rec.d16[3]; + if (s->read_oid != EEROR_OID && s->read_oid != 0x0000) + { + L2_task_go_Tdelay(D_task_GAME_SWITCH,D_Tdelay_100ms); + } + } + TTSS_Task_step(D_task_GAME_SWITCH) + U8 i = 0; + U8 j = 0; - TTSS_Task_step(D_task_GAME_SELECT) - if(R.game.type == 0x51) - // if(R.game.type == 0xDA) + for (i = 0; i < game_num_max; i++) + { + //目前仅支持3个游戏,其余游戏均初始化为0 + if (s->game_info[i].game_oid == 0) + { + break; + } + if (s->game_info[i].game_oid == s->read_oid) + { + s->game_info_index = i; + s->eeror_times = 0; + s->start_seconds = s_nos_tick.t_1s; + for (j = 0; j < game_supported_oid_max; j++) + { + s->game_info[s->game_info_index].game_supported_oid[j].handled = 0; + } + L2_WT2605B_Broadcast(s->game_info[i].game_audio); + L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms); + return; + } + } + if (s->game_info_index == -1) + { + L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms); + } + else + { + L2_task_go_Tdelay(D_task_GAME_PLAY,D_Tdelay_100ms); + } + TTSS_Task_step(D_task_GAME_PLAY) + U8 i = 0,j = 0; + for (i = 0; i < game_supported_oid_max; i++) { - L0_uart0_uc('A'); - if (R.game.dat == 0x42) - // if (R.game.dat == 0xC1) + POINT_INFO* p = &_s_task_game.game_info[_s_task_game.game_info_index].game_supported_oid[i]; + if (p->oid == 0) { - R.game.type = 0; - R.game.dat = 0; - L0_uart0_uc('z'); - L0_uart3_sendArray((U8 *)&audio_zmg,9); - Lc_delay_ms(1000); - L2_task_go_Tdelay(D_task_GAME_ZMG, 0); + break; } - if (R.game.dat == 0xC2) + if (s->read_oid == p->oid) { - L0_uart3_sendArray((U8 *)&audio_zbt,9); - Lc_delay_ms(1000); - L2_task_go_Tdelay(D_task_GAME_ZBT, 0); + //错误码 + if (p->yes_or_no == 0) + { + s->eeror_times++; + L0_uart0_sendstr("eeror_times = "); + L0_uart0_uchex(s->eeror_times); + if (p->point_audio == NULL) + { + L2_WT2605B_Broadcast(&audio_game_error); + } + else + { + L2_WT2605B_Broadcast(p->point_audio); + } + } + //正确码 + else + { + //未处理 + if (p->handled == 0) + { + p->handled = 1; + s->game_point_index = i; + //正确提示声音放在判断是否完成中 + L2_task_go_Tdelay(D_task_GAME_COMPLETED,D_Tdelay_100ms); + return; + } + } + L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms); + return; } - if (R.game.dat == 0xC3) + } + L0_uart0_sendstr("It's not supported oid, please try again."); + L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms); + + TTSS_Task_step(D_task_GAME_COMPLETED) + U8 completed = 1; //假设已完成 + U8 i = 0; + for (i = 0; i < game_supported_oid_max; i++) + { + POINT_INFO* p = &_s_task_game.game_info[_s_task_game.game_info_index].game_supported_oid[i]; + if (p->oid != 0 && p->yes_or_no == 1 && p->handled == 0) { - L0_uart3_sendArray((U8 *)&audio_SchulteGrid,9); - Lc_delay_ms(1000); - L2_task_go_Tdelay(D_task_GAME_SchulteGrid, 0); - } + completed = 0; + break; + } } - else if (R.game.type) + if (completed == 1) { - R.game.type = 0; - R.game.dat = 0; - L0_uart3_sendArray((U8 *)&audio_select,9); - Lc_delay_ms(1000); - L2_task_go_Tdelay(D_task_GAME_SELECT, 0); + // 游戏结束,没有要进行的游戏 + s->game_info_index = -1; + L0_uart0_sendstr("It's completed."); + // 游戏完成 + L2_WT2605B_Broadcast(&audio_game_complete); } - - TTSS_Task_step(D_task_GAME_ZMG) - if (R.game.dat == 0x85) + else + { + if (s->game_info[s->game_info_index].game_supported_oid[s->game_point_index].point_audio == NULL) { - R.game.dat = 0; - L0_uart3_sendArray((U8 *)&audio_begin,9); - Lc_delay_ms(1000); - } + L2_WT2605B_Broadcast(&audio_game_correct); + } else { - L0_uart3_sendArray((U8 *)&audio_zmg_again,9); - Lc_delay_ms(1000); - } + L2_WT2605B_Broadcast(s->game_info[s->game_info_index].game_supported_oid[s->game_point_index].point_audio); + } + } + + L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_2s); TTSS_Task_end(); + } #if 0 diff --git a/source/app/task_game.h b/source/app/task_game.h index 4f7b8ab..66b68e0 100644 --- a/source/app/task_game.h +++ b/source/app/task_game.h @@ -16,26 +16,48 @@ #include "../ctask/task.h" #include "../clib/clib.h" +#include "../bsp/bsp_WT2605B.h" + + +#define game_supported_oid_max 32 +#define game_num_max 5 + +typedef struct _point_info +{ + U16 oid; //点的oid值 + U8 yes_or_no; //0错误,1正确 + TS_SPEECH_AUDIO* point_audio; //点对应的音频 + U8 handled; //游戏进行过程中是否已经被处理 0 未处理,1 已处理 +}POINT_INFO; + +typedef struct game_info +{ + U16 game_oid; //游戏oid + TS_SPEECH_AUDIO* game_audio; //游戏音频 + POINT_INFO game_supported_oid[game_supported_oid_max]; //游戏支持的point + U8 game_order; //游戏顺序 0不排序,1排序 + U8 game_order_index; //游戏顺序索引 + U16 game_timeout_seconds; //游戏超时时间(秒) + U16 game_score; //游戏得分 +}GAME_INF; typedef struct _s_task_game { TS_task task; + U16 read_oid; //读取到的oid值 + U16 error_oid; //代表错误的oid值,0x3FFF + U16 game_maxseconds; //所有游戏超时的最大时间,单位为秒 + GAME_INF game_info[game_num_max]; //游戏信息数组 + S8 game_info_index; //当前选中的游戏,初始化值为-1代表未选中任何游戏 + S8 game_point_index; //当前正在处理的点 + U32 start_seconds; //游戏开始时间 + U8 eeror_times; //错误次数 + }S_TASK_GAME; -// typedef struct _tpc_nfc_ -// { -// U8 head; -// U8 slaveId; -// U8 num[2]; -// U8 cmd; -// U8 buf[TPC_NFC_DAT_MAX]; -// U8 ocr; -// }TPC_GAME; - extern S_TASK_GAME _s_task_game; + extern void L3_task_game_init(void); extern void L3_task_game_handler(S_TASK_GAME *s); -// extern void parse_game_pkg(); -// extern void print_game_pkg(TPC_NFC *p); #endif // #ifndef diff --git a/source/bsp/bsp_oid.c b/source/bsp/bsp_oid.c index 87b5c12..29e659e 100644 --- a/source/bsp/bsp_oid.c +++ b/source/bsp/bsp_oid.c @@ -306,7 +306,7 @@ void L2_oid_ParseF1(void) //解析 // L1_print_rcv("\r\n F1="); ts_oid.oid_type = ts_oid.rec.d[0]; - // L1_Oid_Rec_PRINT(); + L1_Oid_Rec_PRINT(); if(ts_oid.rec.d[0] == 0x00) // 4 {/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分 @@ -472,7 +472,7 @@ void L1_Oid_readoid(void) { if(!OID_DET) { - L2_WT2605B_Broadcast(&audio_game_correct); + // L2_WT2605B_Broadcast(&audio_game_correct); ts_oid.pre_x = ts_oid.X100; ts_oid.pre_y = ts_oid.Y100; L0_oid_Recv64(); //ts_oid.rec.d[i/8] <<= 1;