//////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_drv.c /// @brief bsp @ driver config ///------------------------------------------------------------------------- /// @version 1.0 /// @author CC /// @date 20180331 /// @note cc_AS_stc02 ////////////////////////////////////////////////////////////////////////////// #include "../app/task_game.h" #include "../bsp/bsp_oid.h" #include "../app/app_config.h" #include "../bsp/bsp_config.h" #include "../msp/uart0.h" #include "../msp/uart3.h" #include "../bsp/bsp_WT2605B.h" #include "../app/task_w600.h" // 系统不识别的码:无效码 0x3FFF,0x0000 // 支持码:本游戏支持的 // 正确码和错误码:单个游戏内的 // 游戏标识码 // 游戏内容码 S_TASK_GAME _s_task_game; // 非点读类游戏 #define GAME_OID_ZLXS_4 0x2800 #define GAME_OID_HYJJ_3 0x2900 #define GAME_OID_HYJJ_4 0x2A00 #define GAME_OID_HYJJ_5 0x2B00 #define GAME_OID_CXDD_4 0x2C00 #define GAME_OID_MCQH_4 0x2D00 #define GAME_OID_MCQH_5 0x2E00 #define GAME_OID_JMZX_3 0x2F00 #define GAME_OID_JMZX_4 0x3000 #define GAME_OID_JMZX_5 0x3100 #define GAME_OID_HYZB_1 0x4000 #define GAME_OID_HYZB_2 0x4100 #define GAME_OID_SJGH_3 0x4200 #define GAME_OID_JSSJ_4 0x4300 #define GAME_OID_JSSJ_5 0x4400 // 点读类游戏 #define GAME_OID_ZBT_1 0xB000 #define GAME_OID_SHERT_1 0x2200 #define GAME_OID_ZMG_1 0xC000 // 无效码 #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; } } // 找不同1星 _s_task_game.game_info[0].game_oid = GAME_OID_ZBT_1; _s_task_game.game_info[0].game_audio = &audio_game_different_1; _s_task_game.game_info[0].game_supported_oid[0].oid = 0xB001; _s_task_game.game_info[0].game_supported_oid[1].oid = 0xB002; _s_task_game.game_info[0].game_supported_oid[2].oid = 0xB003; // _s_task_game.game_info[0].game_supported_oid[3].oid = 0xB004; _s_task_game.game_info[0].game_supported_oid[3].oid = 0xB0FF; //错误码 _s_task_game.game_info[0].game_supported_oid[3].yes_or_no = 0; _s_task_game.game_info[0].game_order = 0; _s_task_game.game_info[0].game_timeout_seconds = 60; _s_task_game.game_info[0].game_score = 0; // 走迷宫1星 _s_task_game.game_info[2].game_oid = GAME_OID_ZMG_1; _s_task_game.game_info[2].game_audio = &audio_game_maze_1; _s_task_game.game_info[2].game_supported_oid[0].oid = 0xC001; _s_task_game.game_info[2].game_supported_oid[1].oid = 0xC002; _s_task_game.game_info[2].game_supported_oid[2].oid = 0xC003; _s_task_game.game_info[2].game_supported_oid[3].oid = 0xC004; _s_task_game.game_info[2].game_supported_oid[4].oid = 0xC005; _s_task_game.game_info[2].game_supported_oid[5].oid = 0xC0FF; //错误码 _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_timeout_seconds = 60; _s_task_game.game_info[2].game_score = 0; // 舒尔特方格3星 _s_task_game.game_info[1].game_oid = GAME_OID_SHERT_1; _s_task_game.game_info[1].game_audio = &audio_game_shulte_1; _s_task_game.game_info[1].game_supported_oid[0].oid = 0x2201; _s_task_game.game_info[1].game_supported_oid[1].oid = 0x2202; _s_task_game.game_info[1].game_supported_oid[2].oid = 0x2203; _s_task_game.game_info[1].game_supported_oid[3].oid = 0x2204; _s_task_game.game_info[1].game_supported_oid[4].oid = 0x2205; _s_task_game.game_info[1].game_supported_oid[5].oid = 0x2206; _s_task_game.game_info[1].game_supported_oid[6].oid = 0x2207; _s_task_game.game_info[1].game_supported_oid[7].oid = 0x2208; _s_task_game.game_info[1].game_supported_oid[8].oid = 0x2209; _s_task_game.game_info[1].game_supported_oid[9].oid = 0x220A; _s_task_game.game_info[1].game_supported_oid[10].oid = 0x220B; _s_task_game.game_info[1].game_supported_oid[11].oid = 0x220C; _s_task_game.game_info[1].game_supported_oid[12].oid = 0x220D; _s_task_game.game_info[1].game_supported_oid[13].oid = 0x220E; _s_task_game.game_info[1].game_supported_oid[14].oid = 0x220F; _s_task_game.game_info[1].game_supported_oid[15].oid = 0x2210; _s_task_game.game_info[1].game_supported_oid[16].oid = 0x2211; _s_task_game.game_info[1].game_supported_oid[17].oid = 0x2212; _s_task_game.game_info[1].game_supported_oid[18].oid = 0x2213; _s_task_game.game_info[1].game_supported_oid[19].oid = 0x2214; _s_task_game.game_info[1].game_supported_oid[20].oid = 0x2215; _s_task_game.game_info[1].game_supported_oid[21].oid = 0x2216; _s_task_game.game_info[1].game_supported_oid[22].oid = 0x2217; _s_task_game.game_info[1].game_supported_oid[23].oid = 0x2218; _s_task_game.game_info[1].game_supported_oid[24].oid = 0x2219; _s_task_game.game_info[1].game_supported_oid[25].oid = 0x22FF; //错误码 _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_timeout_seconds = 120; _s_task_game.game_info[1].game_score = 0; // 众里寻三3星 _s_task_game.game_info[3].game_oid = GAME_OID_ZLXS_4; _s_task_game.game_info[3].game_audio = &audio_game_zlxs_4; _s_task_game.game_info[3].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[3].game_order = 0; _s_task_game.game_info[3].game_timeout_seconds = 60; _s_task_game.game_info[3].game_score = 0; // 火眼金晶3星 _s_task_game.game_info[4].game_oid = GAME_OID_HYJJ_3; _s_task_game.game_info[4].game_audio = &audio_game_hyjj_3; _s_task_game.game_info[4].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[4].game_order = 0; _s_task_game.game_info[4].game_timeout_seconds = 60; _s_task_game.game_info[4].game_score = 0; // 火眼金晶4星 _s_task_game.game_info[5].game_oid = GAME_OID_HYJJ_4; _s_task_game.game_info[5].game_audio = &audio_game_hyjj_4; _s_task_game.game_info[5].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[5].game_order = 0; _s_task_game.game_info[5].game_timeout_seconds = 60; _s_task_game.game_info[5].game_score = 0; // 火眼金晶5星 _s_task_game.game_info[6].game_oid = GAME_OID_HYJJ_5; _s_task_game.game_info[6].game_audio = &audio_game_hyjj_5; _s_task_game.game_info[6].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[6].game_order = 0; _s_task_game.game_info[6].game_timeout_seconds = 60; _s_task_game.game_info[6].game_score = 0; // 从小到大4星 _s_task_game.game_info[7].game_oid = GAME_OID_CXDD_4; _s_task_game.game_info[7].game_audio = &audio_game_cxdd_4; _s_task_game.game_info[7].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[7].game_order = 0; _s_task_game.game_info[7].game_timeout_seconds = 60; _s_task_game.game_info[7].game_score = 0; // 明察秋毫4星 _s_task_game.game_info[8].game_oid = GAME_OID_MCQH_4; _s_task_game.game_info[8].game_audio = &audio_game_mcqh_4; _s_task_game.game_info[8].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[8].game_order = 0; _s_task_game.game_info[8].game_timeout_seconds = 60; _s_task_game.game_info[8].game_score = 0; // 明察秋毫5星 _s_task_game.game_info[9].game_oid = GAME_OID_MCQH_5; _s_task_game.game_info[9].game_audio = &audio_game_mcqh_5; _s_task_game.game_info[9].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[9].game_order = 0; _s_task_game.game_info[9].game_timeout_seconds = 60; _s_task_game.game_info[9].game_score = 0; // 积木再现3星 _s_task_game.game_info[10].game_oid = GAME_OID_JMZX_3; _s_task_game.game_info[10].game_audio = &audio_game_jmzx_3; _s_task_game.game_info[10].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[10].game_order = 0; _s_task_game.game_info[10].game_timeout_seconds = 60; _s_task_game.game_info[10].game_score = 0; // 积木再现4星 _s_task_game.game_info[11].game_oid = GAME_OID_JMZX_4; _s_task_game.game_info[11].game_audio = &audio_game_jmzx_4; _s_task_game.game_info[11].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[11].game_order = 0; _s_task_game.game_info[11].game_timeout_seconds = 60; _s_task_game.game_info[11].game_score = 0; // 积木再现5星 _s_task_game.game_info[12].game_oid = GAME_OID_JMZX_5; _s_task_game.game_info[12].game_audio = &audio_game_jmzx_5; _s_task_game.game_info[12].game_supported_oid[0].oid = 0x10FE; _s_task_game.game_info[12].game_order = 0; _s_task_game.game_info[12].game_timeout_seconds = 60; _s_task_game.game_info[12].game_score = 0; // 还原钟表1星 _s_task_game.game_info[13].game_oid = GAME_OID_HYZB_1; _s_task_game.game_info[13].game_audio = &audio_game_hyzb_1; _s_task_game.game_info[13].game_supported_oid[0].oid = 0x40FE; _s_task_game.game_info[13].game_order = 0; _s_task_game.game_info[13].game_timeout_seconds = 60; _s_task_game.game_info[13].game_score = 0; // 还原钟表2星 _s_task_game.game_info[14].game_oid = GAME_OID_HYZB_2; _s_task_game.game_info[14].game_audio = &audio_game_hyzb_2; _s_task_game.game_info[14].game_supported_oid[0].oid = 0x40FE; _s_task_game.game_info[14].game_order = 0; _s_task_game.game_info[14].game_timeout_seconds = 60; _s_task_game.game_info[14].game_score = 0; // 时间规划3星 _s_task_game.game_info[15].game_oid = GAME_OID_SJGH_3; _s_task_game.game_info[15].game_audio = &audio_game_sjgh_3; _s_task_game.game_info[15].game_supported_oid[0].oid = 0x40FE; _s_task_game.game_info[15].game_order = 0; _s_task_game.game_info[15].game_timeout_seconds = 60; _s_task_game.game_info[15].game_score = 0; // 计算时间4星 _s_task_game.game_info[16].game_oid = GAME_OID_JSSJ_4; _s_task_game.game_info[16].game_audio = &audio_game_jssj_4; _s_task_game.game_info[16].game_supported_oid[0].oid = 0x40FE; _s_task_game.game_info[16].game_order = 0; _s_task_game.game_info[16].game_timeout_seconds = 60; _s_task_game.game_info[16].game_score = 0; // 计算时间5星 _s_task_game.game_info[17].game_oid = GAME_OID_JSSJ_5; _s_task_game.game_info[17].game_audio = &audio_game_jssj_5; _s_task_game.game_info[17].game_supported_oid[0].oid = 0x40FE; _s_task_game.game_info[17].game_order = 0; _s_task_game.game_info[17].game_timeout_seconds = 60; _s_task_game.game_info[17].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_READ_OID 0x50 #define D_task_INIT_OID 0x59 #define D_task_GAME_SWITCH 0x51 #define D_task_GAME_PLAY 0x52 #define D_task_GAME_TIMEOUT 0x53 #define D_task_GAME_COMPLETED 0x54 #define D_task_GAME_NET_SUBMIT 0x55 void L3_task_game_handler(S_TASK_GAME *s) { TTSS_Task_init() L2_task_go_Tdelay(D_task_INIT_OID,D_Tdelay_4s); TTSS_Task_step(D_task_INIT_OID) L0_Oid_Init(); L2_task_go_Tdelay(D_task_GAME_TIMEOUT,D_Tdelay_100ms); TTSS_Task_step(D_task_GAME_TIMEOUT) if (s->game_info_index != -1 && (s_nos_tick.t_1s - s->start_seconds > s->game_info[s->game_info_index].game_timeout_seconds)) { // 游戏超时 s->timeover_flag = 1; L0_uart0_sendstr("audio_game_overtime! "); L2_WT2605B_Broadcast(&audio_game_overtime); L2_task_go_Tdelay(D_task_GAME_NET_SUBMIT,D_Tdelay_300ms); } else { L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms); } 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); } } else { L2_task_go_Tdelay(D_task_GAME_TIMEOUT,D_Tdelay_100ms); } TTSS_Task_step(D_task_GAME_SWITCH) U8 i = 0; U8 j = 0; 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; s->timeover_flag = 0; 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_GAME_TIMEOUT,D_Tdelay_100ms); return; } } if (s->game_info_index == -1) { L2_task_go_Tdelay(D_task_GAME_TIMEOUT,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; U8 has_unhandled_point = 0; for (i = 0; i < game_supported_oid_max; i++) { GAME_INF* g = &s->game_info[_s_task_game.game_info_index]; POINT_INFO* p = &s->game_info[_s_task_game.game_info_index].game_supported_oid[i]; if (p->oid == 0) { break; } if (s->read_oid != p->oid && has_unhandled_point == 0 && g->game_order == 1) { if (p->yes_or_no == 1 && p->handled == 0) { has_unhandled_point = 1; } } else if(s->read_oid == p->oid) { //错误码 或者 是正确码有序,但是存在未处理的点 if (p->yes_or_no == 0 || (p->yes_or_no == 1 && g->game_order == 1 && has_unhandled_point == 1)) { 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_GAME_TIMEOUT,D_Tdelay_100ms); return; } } L0_uart0_sendstr("It's not supported oid, please try again."); L2_task_go_Tdelay(D_task_GAME_TIMEOUT,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) { completed = 0; break; } } if (completed == 1) { // 游戏完成 L2_WT2605B_Broadcast(&audio_game_complete); L2_task_go_Tdelay(D_task_GAME_NET_SUBMIT,D_Tdelay_300ms); } else { if (s->game_info[s->game_info_index].game_supported_oid[s->game_point_index].point_audio == NULL) { L2_WT2605B_Broadcast(&audio_game_correct); } else { 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_GAME_TIMEOUT,D_Tdelay_300ms); } TTSS_Task_step(D_task_GAME_NET_SUBMIT) U8 seconds = s_nos_tick.t_1s - s->start_seconds; _s_task_w600_para.Send_Submit_Flag = 1; _s_task_w600_para.submittaskpkg.Plan_ID[0] = _s_task_w600_para.queryackpkg.Plan_ID[0]; _s_task_w600_para.submittaskpkg.Plan_ID[1] = _s_task_w600_para.queryackpkg.Plan_ID[1]; _s_task_w600_para.submittaskpkg.Game_ID[0] = s->game_info[s->game_info_index].game_oid >> 8 & 0xFF; _s_task_w600_para.submittaskpkg.Game_ID[1] = s->game_info[s->game_info_index].game_oid >> 0 & 0xFF; _s_task_w600_para.submittaskpkg.Second[0] = seconds >> 8 & 0xFF; _s_task_w600_para.submittaskpkg.Second[1] = seconds >> 0 & 0xFF; _s_task_w600_para.submittaskpkg.Error_Time[0] = 0; _s_task_w600_para.submittaskpkg.Error_Time[1] = _s_task_game.eeror_times; _s_task_w600_para.submittaskpkg.TimeOver_Flag = s->timeover_flag; _s_task_w600_para.submittaskpkg.Score[0] = 0; _s_task_w600_para.submittaskpkg.Score[1] = 0; // 游戏结束,没有要进行的游戏 s->game_info_index = -1; L0_uart0_sendstr("It's completed."); L2_task_go_Tdelay(D_task_GAME_TIMEOUT,D_Tdelay_300ms); TTSS_Task_end(); } #if 0 //NFC协议:60 20 00 07 10 02 04 00 99 83 33 4E 36 //起始帧:60 //设备ID:20 //数据长度:00 07 //命令:10 //数据:02 04 00 99 83 33 4E //校验:36 从起始帧到数据字段 [60 20 00 07 10 02 04 00 99 83 33 4E] 的所有字节的依次异或值 void parse_nfc_pkg() { TPC_NFC *p = (TPC_NFC *) ts_uart[uNum3].r.buf; p->ocr = p->buf[p->num[0] << 8 | p->num[1]]; if(p->head == 0x60 && 1 /*count_ocr() */) { U16 num = (U16)p->num[0] << 8 | p->num[1]; //只读取0x10的协议 if(p->cmd == 0x10 && num == 0x07){ //1.判定NFC卡号是否符合规则 //2.保存NFC卡号到寄存器 R.nfc.nfc_no[0] = p->buf[num-2]; R.nfc.nfc_no[1] = p->buf[num-1]; //3.设定授权标志 R.auth_flag |= 0x01; //4.打印日志 print_nfc_pkg(p); } } } void print_nfc_pkg(TPC_NFC *p) { L0_uart0_sendstr("\r\n--------- Recv NFC --------\r\n"); L0_uart0_sendstr("id : "); L0_uart0_uchex(p->slaveId); L0_uart0_0d0a(); L0_uart0_sendstr("num: "); L0_uart0_uchex(p->num[0]); L0_uart0_uchex(p->num[1]); L0_uart0_0d0a(); L0_uart0_sendstr("cmd: "); L0_uart0_uchex(p->cmd); L0_uart0_0d0a(); L0_uart0_sendstr("no : "); L0_uart0_sendArrayHex(p->buf, (U16)p->num[0] << 8 | p->num[1]); L0_uart0_0d0a(); L0_uart0_sendstr("ocr: "); L0_uart0_uchex(p->buf[(U16)p->num[0] << 8 | p->num[1]]); L0_uart0_0d0a(); } #endif