Compare commits

...

28 Commits

Author SHA1 Message Date
Zhangwen 1295c6a8af fix:1.修复更换cpu为stc8h8k后mucid获取错误的问题 2 months ago
Zhangwen f785594a67 fix: 1.修复oid关机重启后不工作的问题;2.新增一个系统状态:PWR_WAIT_ON 3 months ago
Zhangwen 165748732f Merge branch 'PEN_V2' of http://116.204.114.73:3000/ccsens_hardware/DDB into PEN_V2 3 months ago
Zhangwen 88b311341b fix: 1.修复重启后模块bug 3 months ago
Zhangwen ac73db3233 fix: 1.修正走迷宫和舒尔特方格游戏内容码 3 months ago
Zhangwen 3599815a81 feature:2.增加相关语音和游戏 3 months ago
Zhangwen 6e0dc0bdc9 feature:1.针对改板,修改相关管脚 3 months ago
Zhangwen 2891dfe1cd feature:1.第一版测试完成 3 months ago
Zhangwen a43fe6d4b6 feature:1.完成Adc采集电池电压任务,低电量报警 3 months ago
Zhangwen 21336bba3b feature:1.添加新任务:L3_task_Adc_handler 4 months ago
Zhangwen 97b0dbf954 feature:1.添加超时 4 months ago
Zhangwen a291edf9d8 feature:1.tcp服务添加心跳 4 months ago
Zhangwen 0e9a61bdf4 feature:1.tcp服务完成 4 months ago
Zhangwen 9995f72a8c fix: 1.优化有序游戏的任务流程 4 months ago
Zhangwen ca141eaf9b feature:1.有序游戏完成 4 months ago
Zhangwen 4fb50f3755 feature:1.找不同游戏完成 4 months ago
Zhangwen 6ede45ccdd feature:1.oid读取bsp层完成 4 months ago
Zhangwen 6306b7d38f feature:1.电池电量读取功能:msp完成;电压采集完成,待补充任务 4 months ago
Zhangwen 6e1364f5e3 fix:按键控制加减音量bug修复 4 months ago
Zhangwen 70ef799e2f feature: 1.增加按键加减音量,存在bug,待修复 4 months ago
Zhangwen 74f2b17b66 feature: 1.配网完成。 4 months ago
Zhangwen 66ece2a061 feature: 1.WIFI网络配置完成! 4 months ago
Zhangwen b4c179b0a1 feature: 1.在原有task中增加Smartconfig分支任务 4 months ago
Zhangwen 3d25f444e7 fix: 修复strcmp函数 4 months ago
Zhangwen ec570b9afc feature:1.任务3:WIFI和服务器连接ok 4 months ago
Zhangwen 7a730c06cd feature:1.任务2:按键进入开机、关机、配网模完成! 4 months ago
Zhangwen d723fed230 feature:1.任务1:task_appstatus完成 4 months ago
Zhangwen 146c6d8b3f fix: appstatus task 4 months ago
  1. 57
      .vscode/settings.json
  2. 79
      keilp/cc_as_stc02_ps5ws.uvprojx
  3. 5
      source/.vscode/settings.json
  4. 27
      source/app/app_config.c
  5. 32
      source/app/app_config.h
  6. 58
      source/app/app_data_save.c
  7. 32
      source/app/app_data_save.h
  8. 14
      source/app/app_eeprom.c
  9. 9
      source/app/app_eeprom.h
  10. 14
      source/app/app_task_speech.c
  11. 22
      source/app/app_task_speech.h
  12. 2
      source/app/app_task_tcp.c
  13. 6
      source/app/app_task_tcp_control.c
  14. 210
      source/app/main.c
  15. 28
      source/app/main.h
  16. 94
      source/app/task_adc.c
  17. 44
      source/app/task_adc.h
  18. 67
      source/app/task_appTEST.c
  19. 28
      source/app/task_appTEST.h
  20. 146
      source/app/task_appstatus.c
  21. 31
      source/app/task_appstatus.h
  22. 2
      source/app/task_btn.c
  23. 439
      source/app/task_game.c
  24. 46
      source/app/task_game.h
  25. 6
      source/app/task_key.c
  26. 110
      source/app/task_keystatus.c
  27. 40
      source/app/task_keystatus.h
  28. 4
      source/app/task_register.c
  29. 744
      source/app/task_w600 copy.c
  30. 583
      source/app/task_w600.c
  31. 86
      source/app/task_w600.h
  32. 92
      source/app/task_w600_ptc.c
  33. 122
      source/app/task_w600_ptc.h
  34. 145
      source/bsp/bsp_WT2605B.c
  35. 81
      source/bsp/bsp_WT2605B.h
  36. 23
      source/bsp/bsp_config.c
  37. 28
      source/bsp/bsp_config.h
  38. 48
      source/bsp/bsp_key.c
  39. 22
      source/bsp/bsp_key.h
  40. 29
      source/bsp/bsp_led.c
  41. 19
      source/bsp/bsp_led.h
  42. 397
      source/bsp/bsp_oid.c
  43. 4
      source/bsp/bsp_oid.h
  44. 183
      source/bsp/bsp_oid_undelect..h
  45. 903
      source/bsp/bsp_oid_undelect.c
  46. 11
      source/bsp/bsp_ooid.c
  47. 8
      source/bsp/bsp_ooid.h
  48. 20
      source/bsp/bsp_wifi.c
  49. 10
      source/bsp/bsp_wifi.h
  50. 15
      source/bsp/chipid.c
  51. 1
      source/bsp/chipid.h
  52. 6
      source/clib/bit.h
  53. 14
      source/clib/clib.c
  54. 1
      source/clib/clib.h
  55. 1401
      source/clib/stdio.h
  56. 2
      source/ctask/time.c
  57. 2
      source/msp/UART0.C
  58. 4
      source/msp/UART2.c
  59. 3
      source/msp/UART3.c
  60. 2
      source/msp/UART4.C
  61. 17
      source/msp/UARTX.h
  62. 226
      source/msp/msp_adc.c
  63. 63
      source/msp/msp_adc.h
  64. 2
      source/msp/msp_eeprom.c
  65. 4
      source/msp/msp_eeprom.h

57
.vscode/settings.json

@ -31,6 +31,61 @@
"app_data_save.h": "c",
"task_modbus.h": "c",
"app_task_tcp.h": "c",
"msp_eeprom.h": "c"
"msp_eeprom.h": "c",
"bsp_oid.h": "c",
"bsp_led.h": "c",
"bsp_wt2605.h": "c",
"bsp_key.h": "c",
"task_appstatus.h": "c",
"bsp_wt2605b.h": "c",
"task_apptset.h": "c",
"task_keystatus.h": "c",
"type.h": "c",
"task_smartconfig.h": "c",
"uartx.h": "c",
"uart4.h": "c",
"limits": "c",
"bsp_config_const.h": "c",
"bit.h": "c",
"STC_stc8h3k.H": "cpp",
"at0d0a.h": "c",
"ccmodbus.h": "c",
"bsp_wifi.h": "c",
"task_apptest.h": "c",
"task.h": "c",
"tick.h": "c",
"bsp_ooid.h": "c",
"tpc_x.h": "c",
"typeinfo": "c",
"cstddef": "c",
"string": "c",
"optional": "c",
"memory": "c",
"new": "c",
"array": "c",
"istream": "c",
"ostream": "c",
"tuple": "c",
"utility": "c",
"modbus.h": "c",
"sstream": "c",
"task_encrypt.h": "c",
"deque": "c",
"unordered_map": "c",
"vector": "c",
"string_view": "c",
"initializer_list": "c",
"app_eeprom.h": "c",
"c51_macro.H": "cpp",
"msp_adc.h": "c",
"system_error": "c",
"*.tcc": "c",
"ctype.h": "c",
"time.h": "c",
"task_pen_head.h": "c",
"setjmp.h": "c",
"algorithm": "c",
"task_w600_ptc.h": "c",
"task_adc.h": "c"
}
}

79
keilp/cc_as_stc02_ps5ws.uvprojx

@ -368,45 +368,35 @@
<FileType>1</FileType>
<FilePath>..\source\app\main.c</FilePath>
</File>
<File>
<FileName>task_register.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_register.c</FilePath>
</File>
<File>
<FileName>app_config.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_config.c</FilePath>
</File>
<File>
<FileName>task_w600.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_w600.c</FilePath>
</File>
<File>
<FileName>task_key.c</FileName>
<FileName>task_appstatus.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_key.c</FilePath>
<FilePath>..\source\app\task_appstatus.c</FilePath>
</File>
<File>
<FileName>app_task_tcp_control.c</FileName>
<FileName>task_appTEST.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_task_tcp_control.c</FilePath>
<FilePath>..\source\app\task_appTEST.c</FilePath>
</File>
<File>
<FileName>task_pen_head.c</FileName>
<FileName>task_keystatus.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_pen_head.c</FilePath>
<FilePath>..\source\app\task_keystatus.c</FilePath>
</File>
<File>
<FileName>app_task_tcp.c</FileName>
<FileName>task_w600.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_task_tcp.c</FilePath>
<FilePath>..\source\app\task_w600.c</FilePath>
</File>
<File>
<FileName>app_task_speech.c</FileName>
<FileName>app_eeprom.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_task_speech.c</FilePath>
<FilePath>..\source\app\app_eeprom.c</FilePath>
</File>
<File>
<FileName>task_game.c</FileName>
@ -414,14 +404,14 @@
<FilePath>..\source\app\task_game.c</FilePath>
</File>
<File>
<FileName>task_btn.c</FileName>
<FileName>task_w600_ptc.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_btn.c</FilePath>
<FilePath>..\source\app\task_w600_ptc.c</FilePath>
</File>
<File>
<FileName>app_data_save.c</FileName>
<FileName>task_adc.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_data_save.c</FilePath>
<FilePath>..\source\app\task_adc.c</FilePath>
</File>
</Files>
</Group>
@ -439,24 +429,34 @@
<FilePath>..\source\bsp\chipid.c</FilePath>
</File>
<File>
<FileName>rs485.c</FileName>
<FileName>bsp_key.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\rs485.c</FilePath>
<FilePath>..\source\bsp\bsp_key.c</FilePath>
</File>
<File>
<FileName>w600.c</FileName>
<FileName>bsp_led.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\w600.c</FilePath>
<FilePath>..\source\bsp\bsp_led.c</FilePath>
</File>
<File>
<FileName>bsp_oid.c</FileName>
<FileName>bsp_WT2605B.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_oid.c</FilePath>
<FilePath>..\source\bsp\bsp_WT2605B.c</FilePath>
</File>
<File>
<FileName>bsp_wifi.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_wifi.c</FilePath>
</File>
<File>
<FileName>bsp_btn.c</FileName>
<FileName>bsp_ooid.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_btn.c</FilePath>
<FilePath>..\source\bsp\bsp_ooid.c</FilePath>
</File>
<File>
<FileName>bsp_oid.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_oid.c</FilePath>
</File>
</Files>
</Group>
@ -498,6 +498,11 @@
<FileType>1</FileType>
<FilePath>..\source\msp\msp_eeprom.c</FilePath>
</File>
<File>
<FileName>msp_adc.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\msp_adc.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -562,16 +567,6 @@
</Group>
<Group>
<GroupName>asp</GroupName>
<Files>
<File>
<FileName>asp_oid.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\asp\asp_oid.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>New Group</GroupName>
</Group>
</Groups>
</Target>

5
source/.vscode/settings.json

@ -0,0 +1,5 @@
{
"files.associations": {
"stdio.h": "c"
}
}

27
source/app/app_config.c

@ -2,7 +2,7 @@
///#include "../bsp/cs1232.h"
#include "../bsp/chipid.h"
// #include "../msp/eeprom.h"
#include "../msp/msp_eeprom.h"
// #include "../msp/msp_eeprom.h"
#include "../clib/clib.h"
@ -13,14 +13,24 @@ GlobalRegister R;
void L3_param_init(void)
{
G.head[0] = HEAD0;
G.head[1] = HEAD1;
G.tail[0] = TAIL0;
G.tail[1] = TAIL1;
G.Vin = 0;
G.volume = 0x15;
//U8 i;
G.debug = 1;
G.debug = 0;
//station模式状态
G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok
//station模式sid
Lc_strcpy(G.st_sid,"ccsens");
Lc_strcpy(G.st_sid,"YFRS");
// Lc_strcpy(G.st_sid,"iPhone11");
//station模式pwd
Lc_strcpy(G.st_pwd,"ccsens123");
Lc_strcpy(G.st_pwd,"99999999");
// Lc_strcpy(G.st_pwd,"12345678");
//ap模式状态
G.ap_status = 0;//0: none 1: ap_ok 2:tcp_server_ok
//ap模式sid
@ -36,6 +46,9 @@ void L3_param_init(void)
wr_buf.buf[i].time = wr_buf.buf[i].x_axis = wr_buf.buf[i].y_axis = 0;
}
#endif
G.tail[0] = TAIL0;
G.tail[1] = TAIL1;
}
@ -103,10 +116,12 @@ void L3_reg_reset(void)
{
U8 i = 0;
R.app_status = POW_OFF;
R.pen_sta = 0;
R.pen_net_sta = 0;
R.pen_ele_sta = 0;
R.question_sta = 0;
R.spee_order = 0;
@ -117,6 +132,8 @@ void L3_reg_reset(void)
R.game.type = 0;
R.game.dat = 0;
for(i=0;i<CCMD_SLAVER_INFO_MAX;i++)
{
G.ccmd_slaver_info[i].mask = 0;
@ -148,7 +165,7 @@ void L3_reg_reset(void)
G.pen_up = 0;
G.datapkg = 0;
G.pen_t = 1;
G.debug = 1;
}

32
source/app/app_config.h

@ -2,6 +2,7 @@
#define APP_COMMON_H
#include "../clib/type.h"
#include "../clib/clib.h"
#include "../bsp/bsp_config.h"
#include "../tpc/ccmodbus.h"
#include "../tpc/modbus.h"
@ -15,7 +16,13 @@
#define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 ))
#define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000)
//定义所使用内存的起始和结尾标志
#define HEAD0 0xa3
#define HEAD1 0xa4
#define TAIL0 0xa5
#define TAIL1 0xa6
#define EEPROM_DATA_ADDR 0x00 //定义一个起始地址为0x00的寄存器
//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG
//寄存器编号从1开始
@ -31,6 +38,22 @@ typedef struct pen_point
U32 time;//时间
U16 angle;//角度
}PenPoint;
typedef enum
{
POW_OFF = 0, //关机状态
POW_ON_WAIT = 1, //等待开机状态
POW_ON = 2, //开机状态
WIFI_CONFIG = 3, //WIFI配网模式
WIFI_CONFIG_Phone = 4, //WIFI配网——手机APP配置连接中
WIFI_CONFIG_COMPLETE = 5, //WIFI配网成功
WIFI_CONNECTED = 6, //WIFI连接成功
TCP_CONNECTED = 7, //TCP连接成功
}APP_STATUS;
typedef struct global_register
{
//RO Register
@ -62,7 +85,7 @@ typedef struct global_register
U8 dat;
}game;
APP_STATUS app_status;
}GlobalRegister;
@ -82,6 +105,13 @@ extern GlobalRegister R;
//STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Global Variables CONFIG
typedef struct global_param
{
U8 head[2];
U8 tail[2];
// 电压
U16 Vin;
// 喇叭音量
U8 volume;
//调试模式
U8 debug;
U8 reset;

58
source/app/app_data_save.c

@ -1,58 +0,0 @@
#include "../app/app_data_save.h"
#include "../msp/msp_eeprom.h"
#include "app_config.h"
DATA_SAVE data_save_arr[DATA_SAVE_LEN] = {0};
//初始化存放数据的结构体数组data_save_arr
void data_save_init()
{
int i = 0;
for(i = 0;i < DATA_SAVE_LEN; i++)
{
data_save_arr[i].head[0] = HEAD0;
data_save_arr[i].head[1] = HEAD1;
data_save_arr[i].available = 1;
data_save_arr[i].val = 0;
data_save_arr[i].tail[0] = TAIL0;
data_save_arr[i].tail[1] = TAIL1;
}
}
//存放数据到eeprom中:1.从eeprom中取出数组 2.遍历寻找空位 3.把数组放回(写入)eeprom中
void data_save_push(U8 Data)
{
int i = 0;
int free = 0;
// 从eeprom中取出数组
L0_Iap_Read_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr));
if(data_save_arr[0].head[0] != HEAD0 || data_save_arr[0].head[1] != HEAD1
|| data_save_arr[0].tail[0] != TAIL0 || data_save_arr[0].tail[1] != TAIL1)
{
data_save_init();
}
// 遍历寻找空位
for(i = 0;i < DATA_SAVE_LEN; i++)
{
if(data_save_arr[i].available == 1)
{
free = i;
break;
}
}
// 当都有数据时
if(i == DATA_SAVE_LEN)
{
for(i = 0; i < DATA_SAVE_LEN - 1; i++)
{
data_save_arr[i] = data_save_arr[i+1];
}
free = DATA_SAVE_LEN - 1;
}
// 放到free位置
data_save_arr[free].available = 0;
data_save_arr[free].val = Data;
// 把数组放回(写入)eeprom中
L0_Iap_Program_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr));
}

32
source/app/app_data_save.h

@ -1,32 +0,0 @@
#ifndef _APP_DATA_SAVE_H
#define _APP_DATA_SAVE_H
#include "../bsp/bsp_config.h"
//定义所使用内存的起始和结尾标志
#define HEAD0 0xa3
#define HEAD1 0xa4
#define TAIL0 0xa5
#define TAIL1 0xa6
#define DATA_SAVE_LEN 10 //寄存器需要存放的最大数量为10组
#define EEPROM_DATA_ADDR 0x00 //定义一个起始地址为0x00的寄存器
//用来存储重量数据的结构体(数组)
typedef struct
{
U8 head[2];
U8 available;
U8 val;
U8 tail[2];
}DATA_SAVE;
extern DATA_SAVE data_save_arr[DATA_SAVE_LEN];
extern void data_save_init(void);
extern void data_save_push(U8 Data);
#endif

14
source/app/app_eeprom.c

@ -0,0 +1,14 @@
#include "../app/app_eeprom.h"
#include "../app/app_config.h"
// 读取EEPROM中的参数到G结构体
void L3_param_read(void)
{
L0_Iap_Read_array(EEPROM_DATA_ADDR, (U8*)&G,sizeof(G));
if(G.head[0] != HEAD0 || G.head[1] != HEAD1 || G.tail[0] != TAIL0 || G.tail[1] != TAIL1)
{
L3_param_init();
}
}

9
source/app/app_eeprom.h

@ -0,0 +1,9 @@
#ifndef _APP_EEPROM_H
#define _APP_EEPROM_H
#include "../msp/msp_eeprom.h"
extern void L3_param_read(void);
#endif

14
source/app/app_task_speech.c

@ -12,20 +12,6 @@
TS_TASK_SPEECH ts_speech;
TS_SPEECH_AUDIO audio_wellcome = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x31,0x8F,0xEF};
TS_SPEECH_AUDIO audio_up = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x32,0x90,0xEF};
TS_SPEECH_AUDIO audio_down = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x33,0x91,0xEF};
TS_SPEECH_AUDIO audio_zmg = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x34,0x92,0xEF};
TS_SPEECH_AUDIO audio_zbt = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x35,0x93,0xEF};
TS_SPEECH_AUDIO audio_SchulteGrid = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x36,0x94,0xEF};
TS_SPEECH_AUDIO audio_select = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x37,0x95,0xEF};
TS_SPEECH_AUDIO audio_begin = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x38,0x96,0xEF};
TS_SPEECH_AUDIO audio_tip = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x39,0x97,0xEF};
TS_SPEECH_AUDIO audio_powerdown = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x3A,0x98,0xEF};
TS_SPEECH_AUDIO audio_zmg_again = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x3B,0x99,0xEF};
TS_SPEECH_AUDIO audio_zmg_success = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x3C,0x9A,0xEF};
void L3_task_speech_init(void)

22
source/app/app_task_speech.h

@ -13,15 +13,7 @@ enum SPEECH_OPER
SPEECH_NAME_PLAY = 0xA3,
};
typedef struct
{
vU8 start;
vU8 num;
vU8 cmd;
vU8 file[4];
vU8 crc;
vU8 end;
}TS_SPEECH_AUDIO;
typedef struct
{
@ -57,19 +49,7 @@ typedef struct
extern TS_TASK_SPEECH ts_speech;
extern TS_SPEECH_AUDIO audio_wellcome;
extern TS_SPEECH_AUDIO audio_up;
extern TS_SPEECH_AUDIO audio_down;
extern TS_SPEECH_AUDIO audio_zmg;
extern TS_SPEECH_AUDIO audio_zbt;
extern TS_SPEECH_AUDIO audio_SchulteGrid;
extern TS_SPEECH_AUDIO audio_select;
extern TS_SPEECH_AUDIO audio_begin;
extern TS_SPEECH_AUDIO audio_tip;
extern TS_SPEECH_AUDIO audio_powerdown;
extern TS_SPEECH_AUDIO audio_zmg_again;
extern TS_SPEECH_AUDIO audio_zmg_success;
extern void L3_task_speech_init(void);
extern void L3_task_speech_handle(TS_TASK_SPEECH *s);

2
source/app/app_task_tcp.c

@ -57,7 +57,7 @@ void L3_task_tcp_handle(TS_tcp *s)
// if(s_uart2_tcp_rec.ok)
{
// s_uart2_tcp_rec.ok = 0;
s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s;
_s_task_w600_para.tcp_last_recv_stmp = s_nos_tick.t_1s;
// s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp);
//L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num);
if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver)

6
source/app/app_task_tcp_control.c

@ -24,14 +24,14 @@ void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区
TTSS_Task_init()
L2_task_go(D_task_tcp_control_01);
TTSS_Task_step(D_task_tcp_control_01)
if(s->conn_ok_pool != s_task_gm35_flow.conn_ok)
if(s->conn_ok_pool != _s_task_w600_para.conn_ok)
{
G.authed = 0;
s->conn_ok_pool =s_task_gm35_flow.conn_ok; //s->conn_ok_pool=1
s->conn_ok_pool =_s_task_w600_para.conn_ok; //s->conn_ok_pool=1
}
L2_task_go(D_task_tcp_control_02);
TTSS_Task_step(D_task_tcp_control_02)//是否发认证包
if(s_task_gm35_flow.conn_ok)
if(_s_task_w600_para.conn_ok)
{
if(!G.authed)//authed == 0
{

210
source/app/main.c

@ -1,8 +1,7 @@
#include "main.h"
void L0_main_init(void)
void L0_MCU_init(void)
{
Lc_delay_ms(200);
//板卡初始化
L0_board_config();
@ -14,134 +13,121 @@ void L0_main_init(void)
L0_uart3_buf_init();
//Lc_delay_ms(100);
L1_tick_init();
// P53口初始化 推挽输出
L0_PW_3V3_INIT();
// 控制3v3输出(OID,WIFI)
L0_PW_3V3_ON();
//开启全局中断
EA = 1;
#if 0
L1_oid_init();
printf(" ok\r\n");
while(9)
{L1_Oid_readoid();}
#endif
//系统时钟初始化
// L1_tick_init();
// 定时器初始化
L0_timer0_Init();
//G初始化
L3_param_init();
//R初始化
L3_reg_init();
//485初始化
L2_485_init();
// ADC初始化
L0_ADC_init();
}
void L0_BSP_init(void)
{
// 按键初始化
L2_key_init();
// LED初始化
L2_led_init();
// 语音模块初始化
L2_WT2605B_init();
// WIFI初始化
L2_Wifi_init();
// // OID初始化
// L0_Oid_Init();
}
void L0_TASK_init(void)
{
//系统状态任务初始化
L3_task_AppStatus_init();
// 系统状态测试任务初始化
// L3_task_AppTest_init();
// 按键状态任务初始化
L3_task_KeyStatus_init();
//WIFI任务初始化
L3_task_W600_flow_init(W600_ST);
//游戏任务初始化
L3_task_game_init();
//寄存器监听任务初始化
//L3_task_reglisten_init();
//w600任务初始化
L3_task_gm35_flow_init(W600_ST);
//按键任务初始化
// L0_key_init();
//笔头任务初始化
L1_oid_init();
//语音模块初始化
L3_task_speech_init();
//tcp轮询任务初始化
L3_task_tcp_init();
L3_task_tcp_control_init();
}
//adc任务初始化
L3_task_Adc_init();
}
//===============================================
//主函数
//===============================================
void main(void)
{
int i;
u8 voice_30[6] = {0x7E,0x04,0xAE,0x1E,0xD0,0xEF};
u8 voice_13[6] = {0x7E,0x04,0xAE,0x0D,0xBF,0xEF};
//初始化
L0_main_init();
//获取mcu id
L0_id_get_rom(G.mcu_id);
L0_uart0_sendstr("MCU_ID = ");
L0_uart0_0d0a();
L0_uart0_sendArrayHex(G.mcu_id,7);
//板U初始化
L0_MCU_init();
//eeprom参数读取
L3_param_read();
//BSP层初始化
L0_BSP_init();
//任务初始化
L0_TASK_init();
// // 获取mcu id
// L0_id_get_rom(G.mcu_id);
// L0_uart0_sendstr("MCU_ID = ");
// L0_uart0_sendArrayHex(G.mcu_id,7);
// L0_uart0_0d0a();
//获取MCUID
L0_id_get_chipid();
L0_uart0_0d0a();
//打印程序版本信息
L0_uart0_sendArray("v1.0",4);
L0_uart0_sendstr("MCU_ID = ");
L0_uart0_sendArrayHex(G.mcu_id, MSP_ID_LEN);
L0_uart0_0d0a();
Lc_delay_ms(3000);
L0_uart3_sendArray((U8 *)&voice_30,6);
Lc_delay_ms(1000);
L0_uart3_sendArray((U8 *)&audio_up,9);
// 上电读出寄存器中的值,放到数组中
L0_Iap_Read_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr));
if(data_save_arr[0].head[0] != HEAD0 || data_save_arr[0].head[1] != HEAD1
|| data_save_arr[0].tail[0] != TAIL0 || data_save_arr[0].tail[1] != TAIL1)
{
data_save_init();
}
// //版本信息
// L0_uart0_sendstr("Version info : ");
// L0_uart0_sendArray("PEN_V3",6);
// L0_uart0_0d0a();
while(1)
{
L1_Oid_readoid();
if(1 == s_nos_tick.t1s_heartbeat)//1s
{
s_nos_tick.t1s_heartbeat = 0;//置0清空
D_print_heartbeat()
L0_uart0_uc('.');
L0_uart0_sendstr("eeprom test :");
L0_uart0_0d0a();
for (i = 0; i < DATA_SAVE_LEN; i++)
{
L0_uart0_uchex(i);
L0_uart0_uc('=');
L0_uart0_uchex(data_save_arr[i].val);
L0_uart0_0d0a();
}
// L0_uart0_sendArrayHex(data_save_arr, 30);
// L0_uart0_sendstr("ADC = ");
// L0_uart0_ushex(_s_task_adc.adc_val[_s_task_adc.index]);
// L0_uart0_0d0a();
// L0_uart0_sendstr("Vin = ");
// L0_uart0_ushex(G.Vin);
// L2_WT2605B_Broadcast(&audio_tcp_noplan);
}
// 系统状态任务
L3_task_appstatus_handler(&_s_task_appstatus);
// 串口2的 接收数据 测试
if(ts_uart[uNum2].r.ok == 1)
{
ts_uart[uNum2].r.ok = 0;
L0_uart0_sendArray(ts_uart[uNum2].r.buf, D_recv2_max);
}
#if 0
// 串口3的 接收数据 测试
if(ts_uart[uNum3].r.ok == 1)
// 按键状态任务
L3_task_keystatus_handler(&_s_task_keystatus);
// WIFI任务
if (R.app_status >= POW_ON)
{
ts_uart[uNum3].r.ok = 0;
L0_uart0_uc('@');
L0_uart0_sendArray(ts_uart[uNum3].r.buf, D_recv3_max);
}
// WIFI数据解析
L3_uart2_wifi_parse();
L2_task_W600_flow_handle(&_s_task_w600_para);
// 游戏任务
L3_task_game_handler(&_s_task_game);
// adc任务
L3_task_Adc_handler(&_s_task_adc);
}
// if(L3_tick_interval(100L))/////10ms
// {L2_tick_stamp();
// D_print_heartbeat_close();
// 系统状态测试任务
// L3_task_AppTest_handler(&_s_task_apptest);
/// L1_as_readA(0);//读取倾角传感器数据
/// Lc_buf_copy_uc(s_uart1_rec.buf,s_as[0].d,8);
// s_uart1_rec.buf= 传感器数据
/// ff 08 xh xl yh yl zh zl
/// s_uart1_rec.ok =1;
/// L2_sd_save();
#endif
/////////////////////////////////////////
#if 0
if(s_uart0_rec.ok)
{
@ -162,41 +148,35 @@ void main(void)
break;
}
}
// 7E 04 AE 1E XX EF
#endif
// 游戏处理
L3_task_game_handler(&_s_task_game);
//笔头数据采集
// L3_task_oid_handle(&ts_task_oid);
//WIFI
// L3_uart2_exp_protocol(&s_uart2_at);
// L2_task_gm35_flow_handle(&s_task_gm35_flow);
//寄存器值监控
// L3_task_reglisten_handle(&s_task_reglisten);
//输出,响应485协议
//L3_task_modbus_handler(&s_uart0_rec);
//语音模块
// L3_task_speech_handle(&ts_speech);
//按键处理
L3_task_btn_handler();
// L3_task_key_handle(&s_task_key_handle);
//L3_task_modbus_handler2(&s_uart2_rec);
#if 1
//tcp发送
// L3_task_tcp_handle(&ts_tcp);
//tcp master->slaver发送逻辑控制
// L3_task_tcp_control_handle(&ts_tcp_control);
#endif
}
}
//end main
// L0_uart0_sendstr("_s_w600_mode =");
// L0_uart0_uchex(_s_task_w600_para.mode);
// L0_uart0_0d0a();
// L0_uart0_sendstr("R.app_status =");
// L0_uart0_uchex(R.app_status);
// 上电读出寄存器中的值,放到数组中
// L0_Iap_Read_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr));
// if(data_save_arr[0].head[0] != HEAD0 || data_save_arr[0].head[1] != HEAD1
// || data_save_arr[0].tail[0] != TAIL0 || data_save_arr[0].tail[1] != TAIL1)
// {
// data_save_init();
// }

28
source/app/main.h

@ -45,9 +45,10 @@
#include "../msp/uart2.h"
#include "../msp/uart3.h"
#include "../msp/uart4.h"
#include "../msp/msp_adc.h"
// #include "../msp/eeprom.h"
#include "../msp/msp_eeprom.h"
// #include "../msp/msp_eeprom.h"
#include "../bsp/bsp_config.h"
#include "../bsp/chipid.h"
@ -60,14 +61,33 @@
///#include "../app/task_debug.h"
#include "../app/task_register.h"
#include "../app/task_encrypt.h"
#include "../app/task_w600.h"
#include "../app/task_key.h"
#include "../app/app_task_tcp.h"
#include "../app/app_task_tcp_control.h"
#include "../app/app_task_speech.h"
#include "../app/app_config.h"
#include "../app/app_eeprom.h"
#include "../app/task_appstatus.h"
#include "../app/task_appTEST.h"
#include "../app/task_keystatus.h"
#include "../app/task_w600.h"
#include "../app/task_SmartConfig.h"
#include "../app/task_game.h"
#include "../app/L3_task_btn_handler.h"
#include "../app/app_data_save.h"
#include "../app/task_adc.h"
#include "../bsp/bsp_led.h"
#include "../bsp/bsp_key.h"
#include "../bsp/bsp_WT2605B.h"
#include "../bsp/bsp_wifi.h"
#include "../bsp/bsp_ooid.h"
#include "../bsp/bsp_oid.h"
#include "../msp/msp_eeprom.h"
#include "../asp/asp_oid.h"

94
source/app/task_adc.c

@ -0,0 +1,94 @@
#include "../app/task_adc.h"
#include "../msp/msp_adc.h"
#include "../app/app_config.h"
#include "../msp/uart0.h"
#include "../bsp/bsp_WT2605B.h"
S_TASK_ADC _s_task_adc;
void L3_task_Adc_init(void)
{
L1_task_init(&_s_task_adc.task);
_s_task_adc.index = 0;
_s_task_adc.SUM = 0;
_s_task_adc.LowPower_Flag = 0;
_s_task_adc.LowPower_Count = 0;
L3_task_s_go(_s_task_adc,D_task_init);
}
#define D_task_ADC_READ 0x50
#define D_task_ADC_COUNT 0x51
#define D_task_LOWPOWER_DETECT 0x52
void L3_task_Adc_handler(S_TASK_ADC *s)
{
TTSS_Task_init()
L2_task_go_Tdelay(D_task_ADC_READ,D_Tdelay_100ms);
TTSS_Task_step(D_task_ADC_READ)
s->adc_val[_s_task_adc.index] = L1_ADC_Read(12);
s->SUM += s->adc_val[_s_task_adc.index++];
if (_s_task_adc.index >= 10)
{
_s_task_adc.index = 0;
L2_task_go_Tdelay(D_task_ADC_COUNT,D_Tdelay_100ms);
}
else
{
L2_task_go_Tdelay(D_task_ADC_READ,D_Tdelay_100ms);
}
TTSS_Task_step(D_task_ADC_COUNT)
// U8 i;
// 计算平均值
s->Aver = s->SUM / ADC_NUM;
// L0_uart0_sendstr("s->SUM = ");
// L0_uart0_ulhex(s->SUM);
// L0_uart0_0d0a();
// L0_uart0_sendstr("s->Aver = ");
// L0_uart0_ushex(s->Aver);
s->SUM = 0;
// s->Variance = 0;
// 计算方差
// for(i = 0; i < ADC_NUM; i++)
// {
// S16 diff = s->adc_val[i] - s->Aver;
// s->Variance += diff >= 0 ? diff : -diff;
// }
// s->Variance /= ADC_NUM;
// if (s->Variance <= 200)
// {
// s->Vin = (s->Aver / 0x1000) * 33;
// }
// 分压 0.5
s->Vin = (s->Aver * 330 * 2) / 0x1000;
G.Vin = s->Vin;
L2_task_go_Tdelay(D_task_LOWPOWER_DETECT,D_Tdelay_100ms);
TTSS_Task_step(D_task_LOWPOWER_DETECT)
if (s->LowPower_Flag == 0)
{
if (s->Vin < Alarm_Vol)
{
s->LowPower_Count ++;
if (s->LowPower_Count > Count_Max)
{
L0_uart0_sendstr(" Battery Capacity Low !!!");
s->LowPower_Flag = 1;
// 语音提醒
L2_WT2605B_Broadcast(&audio_low_power);
s->LowPower_Count = 0;
}
}
else
{
s->LowPower_Count = 0;
}
}
L2_task_go_Tdelay(D_task_ADC_READ,D_Tdelay_100ms);
TTSS_Task_end();
}

44
source/app/task_adc.h

@ -0,0 +1,44 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _TASK_ADC_H
#define _TASK_ADC_H
#include "../ctask/task.h"
#define ADC_NUM 10
//电压:3.65v 剩余容量:10%
#define Alarm_Vol 365
// 最大次数
#define Count_Max 5
typedef struct _s_task_adc
{
TS_task task;
U16 adc_val[ADC_NUM];
U8 index;
U32 SUM;
U32 Aver;
U32 Variance;
U16 Vin;
U8 LowPower_Flag;
// 计数
U8 LowPower_Count;
}S_TASK_ADC;
extern S_TASK_ADC _s_task_adc;
extern void L3_task_Adc_init(void);
extern void L3_task_Adc_handler(S_TASK_ADC *s);
#endif // #ifndef

67
source/app/task_appTEST.c

@ -0,0 +1,67 @@
////////////////////////////////////////////////////////////////////////////
///@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_appTEST.h"
#include "app_config.h"
S_TASK_APPTEST _s_task_apptest;
void L3_task_AppTest_init(void)
{
L1_task_init(&_s_task_apptest.task);
L3_task_s_go(_s_task_apptest,D_task_init);
}
#define D_task_Status00 0x50
#define D_task_Status01 0x51
#define D_task_Status02 0x52
#define D_task_Status03 0x53
#define D_task_Status04 0x54
// POW_OFF = 0, //开机状态
// POW_ON = 1, //关机状态
// WIFI_CONNECTED = 2, //WIFI连接成功
// TCP_CONNECTED = 3, //TCP连接成
// WIFI_CONFIG = 9, //WIFI配置连接中
void L3_task_AppTest_handler(S_TASK_APPTEST *s)
{
TTSS_Task_init()
L2_task_go(D_task_Status00);
TTSS_Task_step(D_task_Status00)
R.app_status = POW_OFF;
L2_task_go_Tdelay(D_task_Status01,D_Tdelay_10s);
TTSS_Task_step(D_task_Status01)
R.app_status = POW_ON;
L2_task_go_Tdelay(D_task_Status02,D_Tdelay_10s);
TTSS_Task_step(D_task_Status02)
R.app_status = WIFI_CONFIG;
L2_task_go_Tdelay(D_task_Status03,D_Tdelay_10s);
TTSS_Task_step(D_task_Status03)
R.app_status = WIFI_CONNECTED;
L2_task_go_Tdelay(D_task_Status04,D_Tdelay_10s);
TTSS_Task_step(D_task_Status04)
R.app_status = TCP_CONNECTED;
L2_task_go_Tdelay(D_task_Status00,D_Tdelay_10s);
TTSS_Task_end();
}

28
source/app/task_appTEST.h

@ -0,0 +1,28 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _TASK_APPTEST_H
#define _TASK_APPTEST_H
#include "../ctask/task.h"
typedef struct _s_task_apptest
{
TS_task task;
}S_TASK_APPTEST;
extern S_TASK_APPTEST _s_task_apptest;
extern void L3_task_AppTest_init(void);
extern void L3_task_AppTest_handler(S_TASK_APPTEST *s);
#endif // #ifndef

146
source/app/task_appstatus.c

@ -0,0 +1,146 @@
////////////////////////////////////////////////////////////////////////////
///@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_appstatus.h"
#include "../bsp/bsp_led.h"
#include "../bsp/bsp_key.h"
#include "../bsp/bsp_WT2605B.h"
#include "../app/app_config.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../bsp/bsp_led.h"
#include "../app/task_game.h"
#include "../app/task_Adc.h"
#include "../app/task_w600.h"
#include "../bsp/bsp_wifi.h"
S_TASK_APPSTATUS _s_task_appstatus;
void L3_task_AppStatus_init(void)
{
L1_task_init(&_s_task_appstatus.task);
_s_task_appstatus.status = R.app_status;
L3_task_s_go(_s_task_appstatus,D_task_init);
}
#define D_task_DETECTCHANGE 0x50
#define D_task_HANDLECHANGE 0x51
#define D_task_WIFICONFIG_STATUS01 0x52
#define D_task_WIFICONFIG_STATUS02 0x53
#define D_task_WIFICONN_STATUS01 0x54
#define D_task_WIFICONN_STATUS02 0x55
void L3_task_appstatus_handler(S_TASK_APPSTATUS *s)
{
TTSS_Task_init()
L2_task_go(D_task_DETECTCHANGE);
TTSS_Task_step(D_task_DETECTCHANGE)
if(s->status != R.app_status)
{
s->status = R.app_status;
L2_task_go_Tdelay(D_task_HANDLECHANGE,D_Tdelay_300ms);
}
else if (s->status == WIFI_CONFIG)
{
L2_task_go_Tdelay(D_task_WIFICONFIG_STATUS01,0);
}
else if (s->status == WIFI_CONNECTED)
{
L2_task_go_Tdelay(D_task_WIFICONN_STATUS01,0);
}
TTSS_Task_step(D_task_HANDLECHANGE)
if(s->status == POW_OFF)
{
// LED灯灭
L2_LED_OFF();
// 播放关机语音
L2_WT2605B_Broadcast(&audio_powerdown);
// OID、WIFI关闭
L2_OID_WIFI_Close();
}
else if (s->status == POW_ON_WAIT)
{
// LED红灯常亮,LED绿灯灭
L2_RED_LED_ON();
// OID、WIFI开启
L2_OID_WIFI_Open();
// 通电后播放开机语音
L2_WT2605B_Broadcast(&audio_poweron);
//wifi任务初始化
L3_task_W600_flow_init(W600_ST);
// Adc任务初始化
L3_task_Adc_init();
// game任务初始化
L3_task_game_init();
s->status = POW_ON;
R.app_status = POW_ON;
}
else if (s->status == WIFI_CONFIG)
{
// 灯灭
L2_LED_OFF();
// 音频播放
L2_WT2605B_Broadcast(&audio_config_mode);
// 配网任务初始化,进入配网
// L3_gm35_send_str("+++");
L3_task_W600_flow_init(W600_SC);
}
else if (s->status == WIFI_CONFIG_Phone)
{
L2_WT2605B_Broadcast(&audio_config_phone);
}
else if (s->status == WIFI_CONFIG_COMPLETE)
{
L2_WT2605B_Broadcast(&audio_config_complete);
// 配网成功,进入STAION模式
L3_task_W600_flow_init(W600_ST);
}
else if (s->status == WIFI_CONNECTED)
{
// 灯灭
L2_LED_OFF();
// 音频播放
L2_WT2605B_Broadcast(&audio_wifi_connected);
}
else if (s->status == TCP_CONNECTED)
{
// LED红灯灭,LED绿灯常亮
L2_GREEN_LED_ON();
// 音频播放
L2_WT2605B_Broadcast(&audio_TCP_connected);
}
L2_task_go_Tdelay(D_task_DETECTCHANGE,D_Tdelay_300ms);
TTSS_Task_step(D_task_WIFICONFIG_STATUS01)
L2_RED_LED_ON();
L2_task_go_Tdelay(D_task_WIFICONFIG_STATUS02,D_Tdelay_500ms);
TTSS_Task_step(D_task_WIFICONFIG_STATUS02)
L2_LED_OFF();
L2_task_go_Tdelay(D_task_DETECTCHANGE,D_Tdelay_500ms);
TTSS_Task_step(D_task_WIFICONN_STATUS01)
L2_GREEN_LED_ON();
L2_task_go_Tdelay(D_task_WIFICONN_STATUS02,D_Tdelay_500ms);
TTSS_Task_step(D_task_WIFICONN_STATUS02)
L2_LED_OFF();
L2_task_go_Tdelay(D_task_DETECTCHANGE,D_Tdelay_500ms);
TTSS_Task_end();
}

31
source/app/task_appstatus.h

@ -0,0 +1,31 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _TASK_APPSTATUS_H
#define _TASK_APPSTATUS_H
#include "../ctask/task.h"
#include "../clib/clib.h"
#include "app_config.h"
typedef struct _s_task_appstatus
{
TS_task task;
APP_STATUS status;
}S_TASK_APPSTATUS;
extern S_TASK_APPSTATUS _s_task_appstatus;
extern void L3_task_AppStatus_init(void);
extern void L3_task_appstatus_handler(S_TASK_APPSTATUS *s);
#endif // #ifndef

2
source/app/task_btn.c

@ -31,7 +31,7 @@ void L3_task_btn_handler(void)
}
break;
case KEY_DOWN:
LED2 = ~LED2;
RED_LED = ~RED_LED;
L0_uart0_uchex(g_Key);
L0_uart0_0d0a();
g_Key = KEY_NULL;

439
source/app/task_game.c

@ -10,84 +10,439 @@
/// @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"
#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 = 0x28EF;
_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 = 0x29EF;
_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 = 0x2AEF;
_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 = 0x2BEF;
_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 = 0x2CEF;
_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 = 0x2DEF;
_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 = 0x2EEF;
_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 = 0x2FEF;
_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 = 0x30EF;
_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 = 0x31EF;
_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 = 0x40EF;
_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 = 0x41EF;
_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 = 0x42EF;
_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 = 0x43EF;
_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 = 0x44EF;
_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_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_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(D_task_GAME_SELECT);
L2_task_go_Tdelay(D_task_INIT_OID,D_Tdelay_4s);
TTSS_Task_step(D_task_GAME_SELECT)
if(R.game.type == 0x51)
// if(R.game.type == 0xDA)
{
L0_uart0_uc('A');
if (R.game.dat == 0x42)
// if (R.game.dat == 0xC1)
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))
{
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);
// 游戏超时
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);
}
if (R.game.dat == 0xC2)
else
{
L0_uart3_sendArray((U8 *)&audio_zbt,9);
Lc_delay_ms(1000);
L2_task_go_Tdelay(D_task_GAME_ZBT, 0);
L2_task_go_Tdelay(D_task_READ_OID,D_Tdelay_100ms);
}
if (R.game.dat == 0xC3)
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)
{
L0_uart3_sendArray((U8 *)&audio_SchulteGrid,9);
Lc_delay_ms(1000);
L2_task_go_Tdelay(D_task_GAME_SchulteGrid, 0);
L2_task_go_Tdelay(D_task_GAME_SWITCH,D_Tdelay_100ms);
}
}
else if (R.game.type)
else
{
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);
L2_task_go_Tdelay(D_task_GAME_TIMEOUT,D_Tdelay_100ms);
}
TTSS_Task_step(D_task_GAME_ZMG)
if (R.game.dat == 0x85)
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)
{
R.game.dat = 0;
L0_uart3_sendArray((U8 *)&audio_begin,9);
Lc_delay_ms(1000);
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
{
L0_uart3_sendArray((U8 *)&audio_zmg_again,9);
Lc_delay_ms(1000);
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

46
source/app/task_game.h

@ -16,26 +16,50 @@
#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排序
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; //错误次数
U8 timeover_flag; //超时标志 0未超时 1超时
}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

6
source/app/task_key.c

@ -14,6 +14,8 @@
#include "../msp/uart3.h"
#include "../msp/uart0.h"
#include "app_task_speech.h"
#include "../bsp/bsp_key.h"
#include "../bsp/bsp_WT2605B.h"
struct _s_task_key_ s_task_key_handle;
@ -224,8 +226,8 @@ void L3_task_key_handle(struct _s_task_key_ *p)
// // LED1 = 0;
// L3_gm35_send_str("+++");
// Lc_delay_ms(1000);
// //s_task_gm35_flow.mode=W600_AP;
// L3_task_gm35_flow_init(W600_AP);
// //_s_task_w600_para.mode=W600_AP;
// L3_task_W600_flow_init(W600_AP);
// //G.w600_mode = 0;
}
else

110
source/app/task_keystatus.c

@ -0,0 +1,110 @@
////////////////////////////////////////////////////////////////////////////
///@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_keystatus.h"
#include "../app/app_config.h"
#include "../app/task_w600.h"
#include "../bsp/bsp_key.h"
#include "../bsp/bsp_WT2605B.h"
#include "../msp/uart0.h"
S_TASK_KEYSTATUS _s_task_keystatus;
void L3_task_KeyStatus_init(void)
{
L1_task_init(&_s_task_keystatus.task);
_s_task_keystatus.Key1_Down_Begin_Time = 0;
_s_task_keystatus.Key2_Down_Begin_Time = 0;
_s_task_keystatus.Key3_Down_Begin_Time = 0;
_s_task_keystatus.Key1_handled = 0;
_s_task_keystatus.Key2_handled = 0;
_s_task_keystatus.Key3_handled = 0;
L3_task_s_go(_s_task_keystatus,D_task_init);
}
#define D_task_KEY_DETECT 0x50
void L3_task_keystatus_handler(S_TASK_KEYSTATUS *s)
{
TTSS_Task_init()
L2_task_go_Tdelay(D_task_KEY_DETECT,D_Tdelay_300ms);
TTSS_Task_step(D_task_KEY_DETECT)
if(L2_ReadKey3() == Key_Down)
{
if (s->Key3_Down_Begin_Time == 0)
{
s->Key3_Down_Begin_Time = D_sys_now;
}
else
{
U32 diff = D_sys_now -s->Key3_Down_Begin_Time;
// L0_uart0_ulhex(diff);
if (diff >= LongKey_PWR_MSeconds/JIFFIES && s->Key3_handled == 0)
{
if (R.app_status == POW_OFF)
{
R.app_status = POW_ON_WAIT;
s->Key3_Down_Begin_Time = 0;
s->Key3_handled = 1;
}
else
{
R.app_status = POW_OFF;
s->Key3_Down_Begin_Time = 0;
s->Key3_handled = 1;
}
}
else if (diff >= LongKey_WIFICONF_MSeconds/JIFFIES && s->Key3_handled == 0)
{
if (L2_ReadKey1() == Key_Down)
{
if (R.app_status != POW_OFF)
{
R.app_status = WIFI_CONFIG;
s->Key3_handled = 1;
}
}
}
}
}
else if (L2_ReadKey1() == Key_Down)
{
if (s->Key1_handled == 0 && R.app_status != POW_OFF)
{
s->Key1_handled = 1;
L0_uart0_uc('1');
L2_WT2605B_VioceUp(); // 音量增加
}
}
else if (L2_ReadKey2() == Key_Down)
{
if (s->Key2_handled == 0 && R.app_status != POW_OFF)
{
s->Key2_handled = 1;
L0_uart0_uc('2');
L2_WT2605B_VioceDown(); // 音量减少
}
}
else
{
s->Key3_Down_Begin_Time = 0;
s->Key1_handled = 0;
s->Key2_handled = 0;
s->Key3_handled = 0;
}
L2_task_go_Tdelay(D_task_KEY_DETECT,D_Tdelay_300ms);
TTSS_Task_end();
}

40
source/app/task_keystatus.h

@ -0,0 +1,40 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _TASK_KEYSTATUS_H
#define _TASK_KEYSTATUS_H
#include "../ctask/task.h"
#define LongKey_PWR_MSeconds 3000
#define LongKey_WIFICONF_MSeconds 2000
typedef struct _s_task_keystatus
{
TS_task task;
U32 Key1_Down_Begin_Time;
U32 Key2_Down_Begin_Time;
U32 Key3_Down_Begin_Time;
U8 Key1_handled;
U8 Key2_handled;
U8 Key3_handled;
}S_TASK_KEYSTATUS;
extern S_TASK_KEYSTATUS _s_task_keystatus;
extern void L3_task_KeyStatus_init(void);
extern void L3_task_keystatus_handler(S_TASK_KEYSTATUS *s);
#endif // #ifndef

4
source/app/task_register.c

@ -40,8 +40,8 @@ void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s)
{
L3_gm35_send_str("+++");
Lc_delay_ms(1000);
//s_task_gm35_flow.mode=W600_AP;
L3_task_gm35_flow_init(W600_AP);
//_s_task_w600_para.mode=W600_AP;
L3_task_W600_flow_init(W600_AP);
G.w600_mode = 0;
}

744
source/app/task_w600 copy.c

@ -0,0 +1,744 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_test.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_w600.h"
#include "app_config.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../asp/asp_oid.h"
#include "../bsp/bsp_config.h"
struct _s_task_W600_Para _s_task_w600_para;
//TS_tcp_control ts_tcp_control;
//TS_tcp ts_tcp;
#define LEN_GPRS_TCP_PKG 18
U8 ins_cipsend[30] = "AT+CIPSEND=000\r\n";
U8 * _cipsend_hex(U8 len)
{
U8 pos = Lc_strlen("AT+CIPSEND=");
ins_cipsend[pos++] = len % 1000 / 100 + '0';
ins_cipsend[pos++] = len % 100 / 10 + '0';
ins_cipsend[pos++] = len % 10 / 1 + '0';
return ins_cipsend;
}
void L3_gm35_send_str(U8 *str)
{
L0_uart2_sendstr(str);
if(G.debug)
{
L0_uart0_sendstr(str);
}
}
//将数据放入gm35待发送缓冲区
void L3_gm35_send_data(U8 *buf , U16 len)
{
//L3_gm35_send_str(_cipsend_hex(len));
// L0_uart2_sendArray(buf,len);
if(G.debug)
{
L0_uart0_sendArray(buf,len);
}
}
void L3_gm35_rcv_data(U8* buf,U8 num)
{
if(G.debug)
{
L0_uart0_sendstr("ATRCV=");
L0_uart0_uchex(num);
L0_uart0_sendArray(buf,num+3);
}
}
U8 wifi_ins[64];
char *GET_WIFI_INS()
{
//AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n"
Lc_strcpy(wifi_ins,"AT+CWJAP_DEF=\"");
Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),G.st_sid);
Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),"\",\"");
Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),G.st_pwd);
Lc_strcpy(wifi_ins+Lc_strlen(wifi_ins),"\"\r\n");
return wifi_ins;
}
U8 wifi_rev_buf[64], wifi_tmp[64];
U8 tmp_num = 0;
void L3_uart2_wifi_parse(void)
{
if (ts_uart[uNum2].r.ok == 1)
{
U8 *ptr = wifi_rev_buf;
ts_uart[uNum2].r.ok = 0;
Lc_buf_copy_uc(wifi_rev_buf, ts_uart[uNum2].r.buf, ts_uart[uNum2].r.num);
wifi_rev_buf[ts_uart[uNum2].r.num] = 0;
while(*ptr)
{
U8 c = *ptr++;
if(c != '\r' && c != '\n')
{
wifi_tmp[tmp_num++] = c;
}
else
{
wifi_tmp[tmp_num] = 0;
if(tmp_num == 0)
{
continue;
}
L0_uart0_uc('>');
L0_uart0_sendstr(wifi_tmp);
L0_uart0_0d0a();
if(Lc_strcmp(wifi_tmp,"OK") == 0)
{
// L0_uart0_sendstr("Moudle Answer:OK AND ins_ok = 1");
_s_task_w600_para.ins_ok = 1;
}
else if(Lc_strcmp(wifi_tmp,"WIFI GOT IP") == 0)
{
_s_task_w600_para.st_wifi_ok = 1;
}
else if(Lc_strcmp(wifi_tmp,"CONNECT") == 0)
{
_s_task_w600_para.serve_ok = 1;
}
tmp_num = 0;
}
}
}
}
void L3_uart2_wifi_parse111(void)
{
if (ts_uart[uNum2].r.ok == 1)
{
U8 *pPara = ts_uart[uNum2].r.buf;
pPara[ts_uart[uNum2].r.num] = 0;
ts_uart[uNum2].r.ok = 0;
L0_uart0_uc('$');
// L0_uart0_sendArray(ts_uart[uNum2].r.buf,ts_uart[uNum2].r.num);
L0_uart0_sendstr(ts_uart[uNum2].r.buf);
if(Lc_strStartsWith(pPara,"\r\nOK"))
{
LED3 = ~LED3;
L0_uart0_sendstr("Moudle Answer:OK AND ins_ok = 1");
L0_uart0_0d0a();
_s_task_w600_para.ins_ok = 1;
}
// if (Lc_strStartsWith(pPara,"WIFI DISCONNECT"))
// {
// LED3 = ~LED3;
// }
else if(Lc_strStartsWith(pPara,"WIFI GOT IP"))
{
_s_task_w600_para.st_wifi_ok = 1;
}
else if(Lc_strStartsWith(pPara,"ERROR"))
{
_s_task_w600_para.st_error= 1;
}
else if(Lc_strStartsWith(pPara,"no change"))
{
_s_task_w600_para.serve_ok= 1;
}
else if(Lc_strStartsWith(pPara,"CIPMUX and"))
{
_s_task_w600_para.ap_serve_ok = 1;
}
//Station模式判定
if(_s_task_w600_para.mode == W600_ST)
{
if(Lc_strStartsWith(pPara,"WIFI GOT IP"))
{
_s_task_w600_para.st_wifi_ok = 1;
}
else if(Lc_strStartsWith(pPara,"ALREADY CONNECTED"))
{
_s_task_w600_para.st_cip_ok = 1;
}
}
}
}
#if 0
void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p)
{
if (1 == p->ok )
{
U8 *pPara = p->buf + 1;
_s_task_w600_para.gprs_last_recv_stmp = s_nos_tick.t_1s;
//通用判定
if(Lc_strStartsWith(pPara,"OK"))
{
_s_task_w600_para.ins_ok = 1;
}
else if(Lc_strStartsWith(pPara,"ERROR"))
{
_s_task_w600_para.st_error= 1;
}
else if(Lc_strStartsWith(pPara,"no change"))
{
_s_task_w600_para.serve_ok= 1;
}
else if(Lc_strStartsWith(pPara,"CIPMUX and"))
{
_s_task_w600_para.ap_serve_ok = 1;
}
//Station模式判定
if(_s_task_w600_para.mode == W600_ST)
{
if(Lc_strStartsWith(pPara,"WIFI GOT IP"))
{
_s_task_w600_para.st_wifi_ok = 1;
}
else if(Lc_strStartsWith(pPara,"ALREADY CONNECTED"))
{
_s_task_w600_para.st_cip_ok = 1;
}
}
//AP模式判定
else if(_s_task_w600_para.mode == W600_AP)
{
if(Lc_strStartsWith(pPara,"+IPD,"))
{
//解析协议,success
//1将id,pwd放入寄存器2.ok=1
//失败不处理不设置标志位
//buf: [20]+IPD,0,5:#ccsens:ccsens123$ 后面没\0
//pPara: +IPD,0,5:#ccsens:ccsens123$
int j = 0 , len = p->buf[0];
p->buf[len+1] = 0;//在+IPD,0,5:#ccsens:ccsens123$后加0
for(j=0;j<len;j++)
{
if(pPara[j] == ':')
{
break;
}
}
pPara += (j+1);//pPara ===== #ccsens:ccsens123$
L0_uart0_sendstr(pPara);
len = Lc_strlen(pPara);
if(pPara[0] == '#' && pPara[len-1] == '$')
{
pPara[len-1] = 0;
pPara++;//pPara ===== ccsens:ccsens123
for(j=0;j<len;j++)
{
if(pPara[j] == ':')
{
break;
}
}
pPara[j] = 0;//ccsens\0ccsens123
Lc_strcpy(G.st_sid, pPara);
pPara += j+1;//ccsens123
Lc_strcpy(G.st_pwd, pPara);
//标志位
_s_task_w600_para.ap_rec_ok = 1;
}
}
else if(Lc_strStartsWith(pPara,"0,CONNECT"))
{
_s_task_w600_para.ap_tcp_ok = 1;
}
else if(Lc_strStartsWith(pPara,"1,CONNECT"))
{
_s_task_w600_para.ap_tcp_ok = 1;
}
else if(Lc_strStartsWith(pPara,"SEND OK"))
{
_s_task_w600_para.ap_data_ok= 1;
}
else if(Lc_strStartsWith(pPara,"+DIST_STA_IP"))
{
_s_task_w600_para.ap_conn_ok = 1;
}
}
p->ok = 0;
}
}
#endif
//------------------------------------------------------ gm35 tasks --------------------------------
void L3_task_W600_flow_init(U8 mode)
{
L1_task_init(&_s_task_w600_para.task);
L3_task_s_go(_s_task_w600_para,D_task_init);
_s_task_w600_para.mode = mode;
_s_task_w600_para.send = 0;
_s_task_w600_para.conn_ok = 0;
#if 0
g_at_send_status.send_lock = 0;
g_at_send_status.module_ok = 0;
g_at_send_status.sim_ok = 0;
g_at_send_status.net_ok = 0;
g_at_send_status.gprs_ok = 0;
g_at_send_status.conn_ok = 0;
g_at_send_status.ins_stmp = 0; //每次发送指令时设置
g_at_send_status.heart_stmp = 0; //连接成功时设置
g_at_send_status.data_stmp = 0;
g_at_send_status.sign_flag = 0;
g_at_send_status.ack_flag = 0;
g_at_send_status.gprs_last_recv_stmp = 0; //接收到指令时设置
g_at_send_status.tcp_last_recv_stmp = 0; //连接成功和接收到数据时设置
g_at_send_status.tcp_close_stmp = 0; //重新上电和检测到断开时设置
g_at_send_status.gm35_reboot_times = 0; //连接成功时清0
#endif
}
//------------------------ GM35 Flow Handle -----------------------------------
#define TTSS_TASK_GM35_MODE 0x01
#define TTSS_TASK_GM35_FLOW_ATEQV 0x02
#define TTSS_TASK_GM35_FLOW_ST 0x03
#define TTSS_TASK_GM35_FLOW_ST_WIFI 0x04
#define TTSS_TASK_GM35_FLOW_ST_CIPMUX0 0x05
#define TTSS_TASK_GM35_FLOW_ST_TCP 0x06
#define TTSS_TASK_GM35_FLOW_ST_CIPMODE1 0x07
#define TTSS_TASK_GM35_FLOW_ST_CIPSEND 0x08
#define TTSS_TASK_GM35_FLOW_ST_DATA 0x09
#define TTSS_TASK_GM35_FLOW_ST_CIPMODE0 0x10
#define TTSS_TASK_GM35_FLOW_ST_SERVE 0x11
#define TTSS_TASK_GM35_FLOW_AP 0x20
#define TTSS_TASK_GM35_FLOW_AP_WIFI 0x21
#define TTSS_TASK_GM35_FLOW_AP_CIPMUX1 0x22
#define TTSS_TASK_GM35_FLOW_AP_SERVER 0x23
#define TTSS_TASK_GM35_FLOW_AP_CIPMUX0 0x24
#define TTSS_TASK_GM35_FLOW_TCP_TIME 0x25
#define TTSS_TASK_GM35_FLOW_AP_DATA 0x26
#define TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT 0x27
#define TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT 0x28
#define TTSS_TASK_MODE_TRAN 0x29
#define TTSS_TASK_MODE_CONFIG_WAIT 0x2A
#define TTSS_TASK_MODE_SERVER_CLOSE 0x2B
#define INS_TIMEOUT 5
#define GM35_SEND_DATA_INTERVAL 300
#define GM35_SEND_HEART_INTERVAL 60
#define GM35_SEND_CIPSTATUS_INTERVAL 5
void L2_task_W600_flow_handle(struct _s_task_W600_Para *s)
{
TTSS_Task_init()
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_5s);//上电等待1s
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ATE0); //"ATE0\r\n" //模块查询+关闭回显
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ap_serve_ok) //等待
{
s->send = 0;
s->ap_serve_ok = 0;
L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE);
}
else if(s->serve_ok == 1 || s->ins_ok == 1) //等待
{
s->send = 0;
s->serve_ok = 0;
L2_task_go_Tdelay(s->mode == W600_ST ? TTSS_TASK_GM35_FLOW_ST
:TTSS_TASK_GM35_FLOW_ST_SERVE,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(s->ins_ok == 1) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_WIFI,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_WIFI)
if(s->send == 0)
{//发送
L3_gm35_send_str(GET_WIFI_INS());
s->ins_ok = 0;
s->st_wifi_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->st_wifi_ok)
{
s->send = 0;
R.app_status = WIFI_CONNECTED; //wifi连接成功
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMUX0,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMUX0)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPMUX0);
s->ins_ok = 0;
s->st_wifi_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_TCP)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_TCP);
s->ins_ok = 0;
s->st_cip_ok = 0;
s->serve_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
// else if(1 == s->ins_ok || 1 == s->st_cip_ok) //等待
else if(1 == s->serve_ok) //等待
{
s->send = 0;
R.app_status = TCP_CONNECTED;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMODE1)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPMODE1);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPSEND);
s->ins_ok = 0;
s->st_error = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
// L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_300ms);//发完之后要等,不然st_error == 0没用 ,没收到error之前也是=0
}
else if((s->ins_ok == 1) && (s->st_error == 1))
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,0);
}
else if((s->ins_ok == 1) && (s->st_error == 0))
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,0);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA)
//L0_uart2_sendstr("abcdefg");
_s_task_w600_para.conn_ok = 1;
L2_task_go(TTSS_TASK_GM35_FLOW_ST_DATA);
/********************s->mode = W600_AP****************************** */
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_SERVE)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE); //关闭服务器
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(s->st_error)
{
s->send = 0;
s->st_error = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_300ms);
}
else if((s->serve_ok == 1)|| (s->ins_ok == 1)) //等待
{
s->send = 0;
s->serve_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMODE0)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPMODE0);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待(等待过程中,进入AP模式)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发(超时,设置单连接模式)
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX0,D_Tdelay_300ms);
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_CIPMUX0)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPMUX0);
s->ins_ok = 0;
s->st_wifi_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_WIFI,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_WIFI)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_WIFI);
s->ins_ok = 0;
s->st_error = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if((1 == s->ins_ok)||(1 == s->st_error)) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX1,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_CIPMUX1)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_CIPMUX1);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_SERVER,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_SERVER)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_SERVER);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_TCP_TIME,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_TCP_TIME)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_TCP_TIME);
// LED2 = 0;
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
s->ap_tcp_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT) //等待TCP连接
if(1 == s->ap_tcp_ok)
{
s->ap_conn_ok = 0;
s->ap_tcp_ok = 0;
s->ap_rec_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT,0);
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT)
if(1 == s->ap_rec_ok)//收到正确的数据才会ok=1
{//ok回复#ok$\r\n
s->ap_rec_ok = 0;
s->rev = 1;
s->ins_stmp = s_nos_tick.t_1s;
//L0_uart0_sendstr("ap config ok");
//L3_gm35_send_str(AT_INS_AP_SEND);//进入发送模式
//L2_task_go(TTSS_TASK_MODE_TRAN);
}
else if(1 == s->ap_conn_ok)
{
s->ap_conn_ok = 0;
s->ap_tcp_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX1,D_Tdelay_300ms);
}
else if((s_nos_tick.t_1s - s->ins_stmp > 3) && (s->rev == 1))
{//超时重发
s->ap_data_ok = 0;
s->rev= 0;
L3_gm35_send_str(AT_INS_AP_SEND);
L2_task_go_Tdelay(TTSS_TASK_MODE_TRAN,D_Tdelay_100ms);
}
TTSS_Task_step(TTSS_TASK_MODE_TRAN)
if(s->send == 0)
{//发送
L3_gm35_send_str("#OK$\r\n");
// LED2 = 1;
s->ap_rec_ok = 0;
s->ins_ok = 0;
s->send = 1;
s->ins_stmp = s_nos_tick.t_1s;
}
else if(1 == s->ap_data_ok) //等待//此处进入ins_ok,不进入send_ok,因为之前有一个no change OK,在进入AP关闭服务器那里
{
s->send = 0;
s->ap_tcp_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_MODE_SERVER_CLOSE,D_Tdelay_100ms);
}
TTSS_Task_step(TTSS_TASK_MODE_SERVER_CLOSE)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
// LED1 = 1;
// LED2 = 1;
L3_task_W600_flow_init(W600_ST);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_end();
}

583
source/app/task_w600.c

@ -10,63 +10,26 @@
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "task_w600.h"
#include "../app/task_w600.h"
#include "../app/task_w600_ptc.h"
#include "app_config.h"
//#include "../msp/msp_uart2.h"
//#include "../msp/msp_uart0.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../asp/asp_oid.h"
#include "../bsp/bsp_config.h"
#include "../bsp/bsp_WT2605B.h"
struct _s_task_gm35_gprs_ s_task_gm35_flow;
//TS_tcp_control ts_tcp_control;
//TS_tcp ts_tcp;
#define LEN_GPRS_TCP_PKG 18
U8 ins_cipsend[30] = "AT+CIPSEND=000\r\n";
U8 * _cipsend_hex(U8 len)
{
U8 pos = Lc_strlen("AT+CIPSEND=");
ins_cipsend[pos++] = len % 1000 / 100 + '0';
ins_cipsend[pos++] = len % 100 / 10 + '0';
ins_cipsend[pos++] = len % 10 / 1 + '0';
return ins_cipsend;
}
struct _s_task_W600_Para _s_task_w600_para;
void L3_gm35_send_str(U8 *str)
{
// L0_uart2_sendstr(str);
L0_uart2_sendstr(str);
if(G.debug)
{
L0_uart0_sendstr(str);
}
}
//将数据放入gm35待发送缓冲区
void L3_gm35_send_data(U8 *buf , U16 len)
{
//L3_gm35_send_str(_cipsend_hex(len));
// L0_uart2_sendArray(buf,len);
if(G.debug)
{
L0_uart0_sendArray(buf,len);
}
}
void L3_gm35_rcv_data(U8* buf,U8 num)
{
if(G.debug)
{
L0_uart0_sendstr("ATRCV=");
L0_uart0_uchex(num);
L0_uart0_sendArray(buf,num+3);
}
}
U8 wifi_ins[64];
char *GET_WIFI_INS()
{
@ -79,143 +42,114 @@ char *GET_WIFI_INS()
return wifi_ins;
}
void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p)
// U8 wifi_rev_buf[128], wifi_tmp[64];
U8 *wifi_rev_buf, wifi_tmp[64];
U8 tmp_num = 0;
void L3_uart2_wifi_parse(void)
{
if (1 == p->ok )
if (ts_uart[uNum2].r.ok == 1)
{
U8 *pPara = p->buf + 1;
s_task_gm35_flow.gprs_last_recv_stmp = s_nos_tick.t_1s;
//通用判定
if(Lc_strStartsWith(pPara,"OK"))
U8 *ptr = wifi_rev_buf = ts_uart[uNum2].r.buf;
ts_uart[uNum2].r.ok = 0;
// Lc_buf_copy_uc(wifi_rev_buf, ts_uart[uNum2].r.buf, ts_uart[uNum2].r.num);
wifi_rev_buf[ts_uart[uNum2].r.num] = 0;
if (_s_task_w600_para.st_cip_ok == 1)
{
s_task_gm35_flow.ins_ok = 1;
}
else if(Lc_strStartsWith(pPara,"ERROR"))
// L0_uart0_uc('$');
// L0_uart0_sendArrayHex(wifi_rev_buf,ts_uart[uNum2].r.num);
// L0_uart0_0d0a();
// 获取今日训练内容
if (wifi_rev_buf[3] == 0xA2)
{
s_task_gm35_flow.st_error= 1;
}
else if(Lc_strStartsWith(pPara,"no change"))
if (1 == parse_QueryAckPkg(wifi_rev_buf,ts_uart[uNum2].r.num))
{
s_task_gm35_flow.serve_ok= 1;
_s_task_w600_para.Recieve_QueryAck_Flag = 1;
}
else if(Lc_strStartsWith(pPara,"CIPMUX and"))
{
s_task_gm35_flow.ap_serve_ok = 1;
}
//Station模式判定
if(s_task_gm35_flow.mode == W600_ST)
{
if(Lc_strStartsWith(pPara,"WIFI GOT IP"))
{
s_task_gm35_flow.st_wifi_ok = 1;
}
else if(Lc_strStartsWith(pPara,"ALREADY CONNECTED"))
else if (wifi_rev_buf[3] == 0xA0)
{
s_task_gm35_flow.st_cip_ok = 1;
// 心跳包暂时不处理
}
return;
}
//AP模式判定
else if(s_task_gm35_flow.mode == W600_AP)
tmp_num = 0;
while(*ptr != 0)
{
if(Lc_strStartsWith(pPara,"+IPD,"))
{
//解析协议,success
//1将id,pwd放入寄存器2.ok=1
//失败不处理不设置标志位
//buf: [20]+IPD,0,5:#ccsens:ccsens123$ 后面没\0
//pPara: +IPD,0,5:#ccsens:ccsens123$
U8 curr = *ptr++;
U8 next = *ptr;
int j = 0 , len = p->buf[0];
p->buf[len+1] = 0;//在+IPD,0,5:#ccsens:ccsens123$后加0
for(j=0;j<len;j++)
{
if(pPara[j] == ':')
if(curr != '\r' && curr != '\n' && curr != '\0')
{
break;
}
wifi_tmp[tmp_num++] = curr;
}
pPara += (j+1);//pPara ===== #ccsens:ccsens123$
L0_uart0_sendstr(pPara);
len = Lc_strlen(pPara);
if(pPara[0] == '#' && pPara[len-1] == '$')
if((tmp_num > 0) && (next == '\r' || next == '\n' || next == '\0'))
{
pPara[len-1] = 0;
pPara++;//pPara ===== ccsens:ccsens123
for(j=0;j<len;j++)
{
if(pPara[j] == ':')
//当前行结束
wifi_tmp[tmp_num] = 0;
L0_uart0_uc('#');
L0_uart0_sendstr(wifi_tmp);
L0_uart0_0d0a();
if(Lc_strcmp(wifi_tmp,"busy p...") == 0)
{
break;
_s_task_w600_para.busy = 1;
}
else if(Lc_strcmp(wifi_tmp,"OK") == 0)
{
_s_task_w600_para.ins_ok = 1;
}
pPara[j] = 0;//ccsens\0ccsens123
Lc_strcpy(G.st_sid, pPara);
pPara += j+1;//ccsens123
Lc_strcpy(G.st_pwd, pPara);
//标志位
s_task_gm35_flow.ap_rec_ok = 1;
else if(Lc_strcmp(wifi_tmp,"WIFI GOT IP") == 0)
{
_s_task_w600_para.st_wifi_ok = 1;
}
else if(Lc_strcmp(wifi_tmp,"CONNECT") == 0 || Lc_strcmp(wifi_tmp,"ALREADY CONNECTED") == 0)
{
_s_task_w600_para.serve_ok = 1;
}
else if(Lc_strStartsWith(pPara,"0,CONNECT"))
else if(Lc_strcmp(wifi_tmp,"smartconfig connected wifi") == 0 )
{
s_task_gm35_flow.ap_tcp_ok = 1;
_s_task_w600_para.smartc_ok = 1;
}
else if(Lc_strStartsWith(pPara,"1,CONNECT"))
else if(Lc_strcmp(wifi_tmp,">") == 0)
{
s_task_gm35_flow.ap_tcp_ok = 1;
_s_task_w600_para.st_cip_ok = 1;
}
else if(Lc_strStartsWith(pPara,"SEND OK"))
else if(Lc_strStartsWith(wifi_tmp,"ssid:"))
{
s_task_gm35_flow.ap_data_ok= 1;
Lc_strcpy(G.st_sid,wifi_tmp + 5);
}
else if(Lc_strStartsWith(pPara,"+DIST_STA_IP"))
else if(Lc_strStartsWith(wifi_tmp,"password:"))
{
s_task_gm35_flow.ap_conn_ok = 1;
Lc_strcpy(G.st_pwd,wifi_tmp + 9);
L0_Iap_Program_array(EEPROM_DATA_ADDR,(U8*)&G,sizeof(G));
}
tmp_num = 0;
}
}
p->ok = 0;
}
}
//------------------------------------------------------ gm35 tasks --------------------------------
void L3_task_gm35_flow_init(U8 mode)
void L3_task_W600_flow_init(U8 mode)
{
L1_task_init(&s_task_gm35_flow.task);
L3_task_s_go(s_task_gm35_flow,D_task_init);
s_task_gm35_flow.mode = mode;
s_task_gm35_flow.send = 0;
s_task_gm35_flow.conn_ok = 0;
#if 0
g_at_send_status.send_lock = 0;
g_at_send_status.module_ok = 0;
g_at_send_status.sim_ok = 0;
g_at_send_status.net_ok = 0;
g_at_send_status.gprs_ok = 0;
g_at_send_status.conn_ok = 0;
g_at_send_status.ins_stmp = 0; //每次发送指令时设置
g_at_send_status.heart_stmp = 0; //连接成功时设置
g_at_send_status.data_stmp = 0;
g_at_send_status.sign_flag = 0;
g_at_send_status.ack_flag = 0;
g_at_send_status.gprs_last_recv_stmp = 0; //接收到指令时设置
g_at_send_status.tcp_last_recv_stmp = 0; //连接成功和接收到数据时设置
g_at_send_status.tcp_close_stmp = 0; //重新上电和检测到断开时设置
g_at_send_status.gm35_reboot_times = 0; //连接成功时清0
#endif
L1_task_init(&_s_task_w600_para.task);
L3_task_s_go(_s_task_w600_para,D_task_init);
_s_task_w600_para.mode = mode;
_s_task_w600_para.send = 0;
_s_task_w600_para.conn_ok = 0;
_s_task_w600_para.last_send_seconds = 0;
_s_task_w600_para.st_cip_ok = 0;
// 放到TCP连接成功是初始化
// _s_task_w600_para.Send_Query_Flag = 1;
// _s_task_w600_para.Recieve_QueryAck_Flag = 0;
// _s_task_w600_para.Send_Submit_Flag = 0;
// _s_task_w600_para.queryackpkg.Plan_ID[0] = 0;
// _s_task_w600_para.queryackpkg.Plan_ID[1] = 0;
}
//------------------------ GM35 Flow Handle -----------------------------------
#define TTSS_TASK_GM35_MODE 0x01
@ -244,15 +178,48 @@ void L3_task_gm35_flow_init(U8 mode)
#define TTSS_TASK_MODE_CONFIG_WAIT 0x2A
#define TTSS_TASK_MODE_SERVER_CLOSE 0x2B
#define TTSS_TASK_GM35_FLOW_ST_CIPOFF 0x30
#define TTSS_TASK_GM35_FLOW_ST_SMARTCONFIG 0x32
#define TTSS_TASK_GM35_FLOW_ST_SMARTCWATING 0x33
#define TTSS_TASK_GM35_FLOW_ST_SAMRTCSTOP 0x34
#define TTSS_TASK_GM35_FLOW_ST_SAMRTCSTOPPED 0x35
#define TTSS_TASK_GM35_SEND_TPC 0x36
#define TTSS_TASK_GM35_SEND_HEARTBEAT 0x37
#define INS_TIMEOUT 5
#define GM35_SEND_DATA_INTERVAL 300
#define GM35_SEND_HEART_INTERVAL 60
#define GM35_SEND_CIPSTATUS_INTERVAL 5
void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
void L2_task_W600_flow_handle(struct _s_task_W600_Para *s)
{
TTSS_Task_init()
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_1s);//上电等待10s
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPOFF,D_Tdelay_5s);//上电等待5s
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPOFF)
if(s->send == 0)
{//发送
L3_gm35_send_str("+++"); //关闭CIP
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 0;
s->busy = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_1s);
}
// else if(1 == s->ins_ok)
// {
// s->send = 0;
// s->st_error = 0;
// L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_SMARTCONFIG,D_Tdelay_1s);
// }
// else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
// {//超时重发
// s->send = 0;
// }
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV)
if(s->send == 0)
{//发送
@ -260,21 +227,15 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ap_serve_ok) //等待
{
s->send = 0;
s->ap_serve_ok = 0;
L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE);
}
else if(s->serve_ok == 1 || s->ins_ok == 1) //等待
else if(s->busy == 0 && s->ins_ok == 1) //等待
{
s->send = 0;
s->serve_ok = 0;
L2_task_go_Tdelay(s->mode == W600_ST ? TTSS_TASK_GM35_FLOW_ST
:TTSS_TASK_GM35_FLOW_ST_SERVE,D_Tdelay_300ms);
:TTSS_TASK_GM35_FLOW_ST_SMARTCONFIG,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
@ -286,11 +247,12 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(s->ins_ok == 1) //等待
else if(s->busy == 0 && s->ins_ok == 1) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_WIFI,D_Tdelay_300ms);
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_WIFI,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
@ -305,17 +267,14 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->st_wifi_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ins_ok && 1 == s->st_wifi_ok) //等待
else if(s->busy == 0 && 1 == s->st_wifi_ok)
{
s->send = 0;
LED2 = 0;
LED2 = ~LED2;
LED2 = ~LED2;
LED2 = ~LED2;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMUX0,D_Tdelay_300ms);
R.app_status = WIFI_CONNECTED; //wifi连接成功
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMUX0,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
@ -328,16 +287,16 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->st_wifi_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ins_ok) //等待
else if(s->busy == 0 && 1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,D_Tdelay_300ms);
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_TCP)
@ -345,15 +304,24 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
{//发送
L3_gm35_send_str(AT_INS_ST_TCP);
s->ins_ok = 0;
s->st_cip_ok = 0;
s->serve_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ins_ok || 1 == s->st_cip_ok) //等待
else if(s->busy == 0 && 1 == s->serve_ok) //等待
{
s->send = 0;
LED3 = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_300ms);
R.app_status = TCP_CONNECTED;
// 记录时间
_s_task_w600_para.Send_Query_Flag = 1;
_s_task_w600_para.Recieve_QueryAck_Flag = 0;
_s_task_w600_para.Send_Submit_Flag = 0;
_s_task_w600_para.queryackpkg.Plan_ID[0] = 0;
_s_task_w600_para.queryackpkg.Plan_ID[1] = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
@ -366,11 +334,12 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ins_ok) //等待
else if(s->busy == 0 && 1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_300ms);
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
@ -381,251 +350,117 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPSEND);
s->ins_ok = 0;
s->st_cip_ok = 0;
s->st_error = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_300ms);//发完之后要等,不然st_error == 0没用 ,没收到error之前也是=0
}
else if(1 == s->st_error)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,0);
s->busy = 0;
}
else if(0 == s->st_error)
else if(s->busy == 0 && s->st_cip_ok == 1)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,0);
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_1s);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA)
//L0_uart2_sendstr("abcdefg");
s_task_gm35_flow.conn_ok = 1;
L2_task_go(TTSS_TASK_GM35_FLOW_ST_DATA);
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_SERVE)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(s->st_error)
if (s->Send_Query_Flag == 1)
{
s->send = 0;
s->st_error = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_300ms);
U8 num = constructor_QueryTaskPkg();
s->Send_Query_Flag = 0;
_s_task_w600_para.last_send_seconds = s_nos_tick.t_1s;
L0_uart2_sendArray(&_s_task_w600_para.querytaskpkg,num);
// L0_uart0_uc('Q');
// L0_uart0_sendArray(&_s_task_w600_para.querytaskpkg,num);
}
else if((s->serve_ok == 1 )|| (s->ins_ok == 1)) //等待
else if (s->Send_Submit_Flag == 1)
{
s->send = 0;
s->serve_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPMODE0)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPMODE0);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
U8 num = constructor_SubmitTaskPkg();
s->Send_Submit_Flag = 0;
_s_task_w600_para.last_send_seconds = s_nos_tick.t_1s;
L0_uart2_sendArray(&_s_task_w600_para.submittaskpkg,num);
// L0_uart0_uc('S');
// L0_uart0_sendArray(&_s_task_w600_para.submittaskpkg,num);
}
else if(1 == s->ins_ok) //等待
else if (s->Recieve_QueryAck_Flag == 1)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX0,D_Tdelay_300ms);
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_CIPMUX0)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_ST_CIPMUX0);
s->ins_ok = 0;
s->st_wifi_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
s->Recieve_QueryAck_Flag = 0;
// 正常训练
if (_s_task_w600_para.queryackpkg.Tranning_Status == 0)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE0,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
L2_WT2605B_Broadcast_TPC(&s->queryackpkg.Game_ID);
L0_uart0_uchex('A');
L0_uart0_sendArray(&_s_task_w600_para.queryackpkg,15);
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
// 训练完成
else if (_s_task_w600_para.queryackpkg.Tranning_Status == 1)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_WIFI,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_WIFI)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_WIFI);
s->ins_ok = 0;
s->st_error = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
L2_WT2605B_Broadcast(&audio_tcp_complete);
L0_uart0_uchex('A');
L0_uart0_sendArray(&_s_task_w600_para.queryackpkg,15);
}
else if((1 == s->ins_ok)||(1 == s->st_error)) //等待
// 无训练任务
else if (_s_task_w600_para.queryackpkg.Tranning_Status == 2)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX1,D_Tdelay_300ms);
L2_WT2605B_Broadcast(&audio_tcp_noplan);
L0_uart0_uchex('A');
L0_uart0_sendArray(&_s_task_w600_para.queryackpkg,15);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_CIPMUX1)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_CIPMUX1);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_SERVER,D_Tdelay_300ms);
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_SERVER)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_SERVER);
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
}
else if(1 == s->ins_ok) //等待
L2_task_go_Tdelay(TTSS_TASK_GM35_SEND_HEARTBEAT,D_Tdelay_100ms);
TTSS_Task_step(TTSS_TASK_GM35_SEND_HEARTBEAT)
if (s_nos_tick.t_1s - _s_task_w600_para.last_send_seconds > 60)
{
s->send = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_TCP_TIME,D_Tdelay_300ms);
U8 num = constructor_HeartBeatPkg();
L0_uart2_sendArray(&_s_task_w600_para.heartbeatpkg,num);
// L0_uart0_sendArray(&_s_task_w600_para.heartbeatpkg,num);
_s_task_w600_para.last_send_seconds = s_nos_tick.t_1s;
}
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_100ms);
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_TCP_TIME)
/*******************************************s->mode = W600_SC(按键进入)********************************************** */
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_SMARTCONFIG)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_TCP_TIME);
LED2 = 0;
L3_gm35_send_str(AT_INS_ST_STARTSMART); //发送SmartConfig模式控制指令,开启SmartConfig模式
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ins_ok) //等待
else if(s->busy == 0 && 1 == s->ins_ok)
{
s->send = 0;
s->ap_tcp_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT,D_Tdelay_300ms);
s->smartc_ok = 0;
R.app_status = WIFI_CONFIG_Phone;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_SMARTCWATING,D_Tdelay_1s); //等待用户配网
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
s->send = 0;
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT)
if(1 == s->ap_tcp_ok)
{
s->ap_conn_ok = 0;
s->ap_tcp_ok = 0;
s->ap_rec_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT,0);
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT)
if(1 == s->ap_rec_ok)//收到正确的数据才会ok=1
{//ok回复#ok$\r\n
s->ap_rec_ok = 0;
s->rev = 1;
s->ins_stmp = s_nos_tick.t_1s;
//L0_uart0_sendstr("ap config ok");
//L3_gm35_send_str(AT_INS_AP_SEND);//进入发送模式
//L2_task_go(TTSS_TASK_MODE_TRAN);
}
else if(1 == s->ap_conn_ok)
{
s->ap_conn_ok = 0;
s->ap_tcp_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_AP_CIPMUX1,D_Tdelay_300ms);
}
else if((s_nos_tick.t_1s - s->ins_stmp > 3) && (s->rev == 1))
{//超时重发
s->ap_data_ok = 0;
s->rev= 0;
L3_gm35_send_str(AT_INS_AP_SEND);
L2_task_go_Tdelay(TTSS_TASK_MODE_TRAN,D_Tdelay_100ms);
}
TTSS_Task_step(TTSS_TASK_MODE_TRAN)
if(s->send == 0)
{//发送
L3_gm35_send_str("#OK$\r\n");
LED2 = 1;
s->ap_rec_ok = 0;
s->ins_ok = 0;
s->send = 1;
s->ins_stmp = s_nos_tick.t_1s;
}
else if(1 == s->ap_data_ok) //等待//此处进入ins_ok,不进入send_ok,因为之前有一个no change OK,在进入AP关闭服务器那里
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_SMARTCWATING)
if(s->smartc_ok == 1)
{
s->send = 0;
s->ap_tcp_ok = 0;
L2_task_go_Tdelay(TTSS_TASK_MODE_SERVER_CLOSE,D_Tdelay_100ms);
L0_uart0_sendstr("SmartConfig Success!");
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_SAMRTCSTOP,D_Tdelay_1s);
}
TTSS_Task_step(TTSS_TASK_MODE_SERVER_CLOSE)
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_SAMRTCSTOP)
if(s->send == 0)
{//发送
L3_gm35_send_str(AT_INS_AP_SERVER_CLOSE);
L3_gm35_send_str(AT_INS_ST_STOPSMART); //发送SmartConfig模式控制指令,退出SmartConfig模式
s->ins_ok = 0;
s->ins_stmp = s_nos_tick.t_1s;
s->send = 1;
s->busy = 0;
}
else if(1 == s->ins_ok) //等待
else if(s->busy == 0 && 1 == s->ins_ok)
{
s->send = 0;
LED1 = 1;
LED2 = 1;
L3_task_gm35_flow_init(W600_ST);
s->send = 1;
R.app_status = WIFI_CONFIG_COMPLETE;
}
else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT)
{//超时重发
@ -635,3 +470,11 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
}

86
source/app/task_w600.h

@ -19,39 +19,51 @@
#include "../ctask/task.h"
#include "../tpc/at0d0a.h"
#include "../tpc/ccmodbus.h"
#include "../msp/msp_eeprom.h"
#include "../app/task_w600_ptc.h"
////<<<<<<<<<<<<<<<<<<< GM35模块 AT操作指令 <<<<<<<<<<<<<<<<<<<<<<<<
#define AT_INS_ATE0 "ATE0\r\n" //模块查询+关闭回显
#define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式
//#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //
#define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //
#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"www.tall.wiki\",8195\r\n" //连接服务器
//#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.81\",4001\r\n" //连接服务器
#define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //
#define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //
#define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //
#define AT_INS_ATE1 "ATE1\r\n" //模块查询+打开回显
#define AT_INS_ATE0 "ATE0\r\n" //模块查询+关闭回显 1-1
#define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式 1-2
// #define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" // 1-3
#define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" // 单连接模式 1-4
#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.1.141\",777\r\n" //连接服务器 1-5
//#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.81\",4001\r\n" //连接服务器
#define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //设置传输模式 0普通传输模式 1透传模式 1-6
#define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //发送数据 1-7
#define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //设置传输模式 0普通传输模式 1透传模式 2-2
#define AT_INS_ST_STARTSMART "AT+CWSTARTSMART=2\r\n" //开启SmartConfig,类型为airkiss
#define AT_INS_ST_STOPSMART "AT+CWSTOPSMART\r\n" //关闭SmartConfig
#define AT_INS_AP "AT+CWMODE=2\r\n" //进入AP模式
#define AT_INS_AP_WIFI "AT+CWSAP=\"ccsens_pen\",\"ccsens\",10,4,4,0\r\n" //设置AP参数
#define AT_INS_AP_CIPMUX1 "AT+CIPMUX=1\r\n" //开启多连接
#define AT_INS_AP_SERVER "AT+CIPSERVER=1,1001\r\n" //建立服务器
#define AT_INS_AP_TCP_TIME "AT+CIPSTO=300\r\n"
#define AT_INS_AP "AT+CWMODE=2\r\n" //进入AP模式 2-3
#define AT_INS_AP_WIFI "AT+CWSAP=\"ccsens_pen\",\"ccsens\",10,4,4,0\r\n"//设置AP参数 2-4
#define AT_INS_AP_CIPMUX1 "AT+CIPMUX=1\r\n" //开启多连接 2-5
#define AT_INS_AP_SERVER "AT+CIPSERVER=1,1001\r\n" //建立服务器 2-6
#define AT_INS_AP_TCP_TIME "AT+CIPSTO=300\r\n" //设置 TCP 服务器超时时间 2-7
#define AT_INS_AP_SEND "AT+CIPSENDEX=0,6\r\n" //
#define AT_INS_AP_SERVER_CLOSE "AT+CIPSERVER=0\r\n" //关闭服务器
#define AT_INS_AP_SERVER_CLOSE "AT+CIPSERVER=0\r\n" //关闭服务器 2-1
#define AT_INS_AP_CLOSE "AT+CWQAP\r\n" //断开AP连接
////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<<
enum _s_w600_mode
{
W600_ST,W600_AP
W600_ST,W600_AP,W600_SC
};
struct _s_task_gm35_gprs_
struct _s_task_W600_Para
{
TS_task task;
vU8 send;
vU8 busy;
vU8 ins_ok;
vU8 st_wifi_ok;
vU8 st_conn_ok;
@ -76,14 +88,30 @@ struct _s_task_gm35_gprs_
vU32 tcp_conn_stmp; //断开连接时间戳
vU32 tcp_close_stmp; //断开连接时间戳
vU32 heart_stmp; //连接成功后,等待发送时间
vU32 data_stmp;//数据发送时间记录
vU32 last_send_seconds; //最后一次发送数据时间
vU8 sign_flag; //发送登录数据标志
vU8 ack_flag;//下行数据ack
vU8 gm35_reboot_times; //gm35重启次数
vU8 smartc_ok; //smartconfig是否成功
//心跳数据包
HeartBeatPkg heartbeatpkg;
//任务请求数据包
QueryTaskPkg querytaskpkg;
//请求响应数据包
QueryAckPkg queryackpkg;
//成绩提交数据包
SubmitTaskPkg submittaskpkg;
// 发送请求标志位 1发送请求 0不发送请求
U8 Send_Query_Flag;
// 接收到响应标志 0未接收 1接收
U8 Recieve_QueryAck_Flag;
// 发送提交标志 1发送提交 0不发送提交
U8 Send_Submit_Flag;
};
extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
extern struct _s_task_W600_Para _s_task_w600_para;
#define STATUS_GM35_INIT 0
#define STATUS_GM35_MODULE_OK 1
@ -94,23 +122,13 @@ extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
#define BUF_SIZE 5
#define BUF_MAX 32 //注意缓冲区的长度
extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
extern struct _s_task_gm35_gprs_ s_task_gm35_flow;
extern void L3_gm35_send_str(U8 *str);
extern void L3_gm35_send_data(U8 *buf , U16 len);
extern void L3_gm35_rcv_data(U8* buf,U8 num);
extern void L3_task_gm35_flow_init(U8 mode);
extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s);
extern void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p);
extern void L3_task_W600_flow_init(U8 mode);
extern void L2_task_W600_flow_handle(struct _s_task_W600_Para *s);
// extern void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p);
extern void L3_uart2_wifi_parse(void);
#endif

92
source/app/task_w600_ptc.c

@ -0,0 +1,92 @@
#include "../app/task_w600_ptc.h"
#include "../app/task_w600.h"
#include "../app/app_config.h"
U8 constructor_HeartBeatPkg()
{
_s_task_w600_para.heartbeatpkg.filter[0] = 0xAA;
_s_task_w600_para.heartbeatpkg.filter[1] = 0xBB;
_s_task_w600_para.heartbeatpkg.num = 0x07;
_s_task_w600_para.heartbeatpkg.cmd = 0xA0;
_s_task_w600_para.heartbeatpkg.did[0] = G.mcu_id[3];
_s_task_w600_para.heartbeatpkg.did[1] = G.mcu_id[4];
_s_task_w600_para.heartbeatpkg.did[2] = G.mcu_id[5];
_s_task_w600_para.heartbeatpkg.did[3] = G.mcu_id[6];
_s_task_w600_para.heartbeatpkg.crc[0] = 0xCC;
_s_task_w600_para.heartbeatpkg.crc[1] = 0xDD;
return _s_task_w600_para.heartbeatpkg.num + 3;
}
U8 constructor_QueryTaskPkg()
{
_s_task_w600_para.querytaskpkg.filter[0] = 0xAA;
_s_task_w600_para.querytaskpkg.filter[1] = 0xBB;
_s_task_w600_para.querytaskpkg.num = 0x07;
_s_task_w600_para.querytaskpkg.cmd = 0xA1;
_s_task_w600_para.querytaskpkg.did[0] = G.mcu_id[3];
_s_task_w600_para.querytaskpkg.did[1] = G.mcu_id[4];
_s_task_w600_para.querytaskpkg.did[2] = G.mcu_id[5];
_s_task_w600_para.querytaskpkg.did[3] = G.mcu_id[6];
_s_task_w600_para.querytaskpkg.crc[0] = 0xCC;
_s_task_w600_para.querytaskpkg.crc[1] = 0xDD;
return _s_task_w600_para.querytaskpkg.num + 3;
}
U8 constructor_SubmitTaskPkg()
{
_s_task_w600_para.submittaskpkg.filter[0] = 0xAA;
_s_task_w600_para.submittaskpkg.filter[1] = 0xBB;
_s_task_w600_para.submittaskpkg.num = 0x12;
_s_task_w600_para.submittaskpkg.cmd = 0xA3;
_s_task_w600_para.submittaskpkg.did[0] = G.mcu_id[3];
_s_task_w600_para.submittaskpkg.did[1] = G.mcu_id[4];
_s_task_w600_para.submittaskpkg.did[2] = G.mcu_id[5];
_s_task_w600_para.submittaskpkg.did[3] = G.mcu_id[6];
// 其他属性在游戏完成时赋值
_s_task_w600_para.submittaskpkg.crc[0] = 0xCC;
_s_task_w600_para.submittaskpkg.crc[1] = 0xDD;
return _s_task_w600_para.submittaskpkg.num + 3;
}
U8 parse_QueryAckPkg(U8* d,U8 num)
{
if (num != 0x0F)
{
return 0;
}
_s_task_w600_para.queryackpkg.filter[0] = d[0];
_s_task_w600_para.queryackpkg.filter[1] = d[1];
if ( _s_task_w600_para.queryackpkg.filter[0] != 0xAA ||
_s_task_w600_para.queryackpkg.filter[1] != 0xBB )
{
return 0;
}
_s_task_w600_para.queryackpkg.num = d[2];
_s_task_w600_para.queryackpkg.cmd = d[3];
_s_task_w600_para.queryackpkg.did[0] = d[4];
_s_task_w600_para.queryackpkg.did[1] = d[5];
_s_task_w600_para.queryackpkg.did[2] = d[6];
_s_task_w600_para.queryackpkg.did[3] = d[7];
_s_task_w600_para.queryackpkg.Plan_ID[0] = d[8];
_s_task_w600_para.queryackpkg.Plan_ID[1] = d[9];
_s_task_w600_para.queryackpkg.Game_ID[0] = d[10];
_s_task_w600_para.queryackpkg.Game_ID[1] = d[11];
_s_task_w600_para.queryackpkg.Tranning_Status = d[12];
_s_task_w600_para.queryackpkg.crc[0] = d[13];
_s_task_w600_para.queryackpkg.crc[1] = d[14];
if ( _s_task_w600_para.queryackpkg.crc[0] != 0xCC ||
_s_task_w600_para.queryackpkg.crc[1] != 0xDD )
{
return 0;
}
return 1;
}

122
source/app/task_w600_ptc.h

@ -0,0 +1,122 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _app_task_w600_TPC_H
#define _app_task_w600_TPC_H
#include "../clib/type.h"
//心跳数据包
typedef struct {
//起始码
U8 filter[2];
//长度
U8 num;
//Cmd
U8 cmd;
//设备ID
U8 did[4];
//校验
U8 crc[2];
}HeartBeatPkg;
//任务请求数据包
typedef struct {
//起始码
U8 filter[2];
//长度
U8 num;
//Cmd
U8 cmd;
//设备ID
U8 did[4];
//校验
U8 crc[2];
}QueryTaskPkg;
//请求响应数据包
typedef struct {
//起始码
U8 filter[2];
//长度
U8 num;
//Cmd
U8 cmd;
//设备ID
U8 did[4];
//训练方案编号
U8 Plan_ID[2];
//游戏ID
U8 Game_ID[2];
//训练完成情况
U8 Tranning_Status; //0正常训练;1今日训练完成;2今日无训练任务
//校验
U8 crc[2];
}QueryAckPkg;
//成绩提交数据包
typedef struct {
//起始码
U8 filter[2];
//长度
U8 num;
//Cmd
U8 cmd;
//设备ID
U8 did[4];
//训练方案编号
U8 Plan_ID[2];
//游戏ID
U8 Game_ID[2];
//游戏时长
U8 Second[2];
//错误次数
U8 Error_Time[2];
//超时标志 0未超时 1超时
U8 TimeOver_Flag;
//得分
U8 Score[2];
//校验
U8 crc[2];
}SubmitTaskPkg;
extern U8 constructor_HeartBeatPkg(void);
extern U8 constructor_QueryTaskPkg(void);
extern U8 constructor_SubmitTaskPkg(void);
extern U8 parse_QueryAckPkg(U8* d,U8 num);
#endif

145
source/bsp/bsp_WT2605B.c

@ -0,0 +1,145 @@
#include "../bsp/bsp_WT2605B.h"
#include "../app/app_config.h"
#include "../msp/UART3.h"
#include "../msp/UART0.h"
#include "../msp/msp_eeprom.h"
/****************************************系统提示音****************************************/
TS_SPEECH_AUDIO audio_powerdown = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x31,0x8F,0xEF}; //T001 谢谢使用,再见
TS_SPEECH_AUDIO audio_poweron = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x32,0x90,0xEF}; //T002 欢迎使用睿思认知训练系统
TS_SPEECH_AUDIO audio_wifi_connected = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x33,0x91,0xEF}; //T003 WIFI链接成功
TS_SPEECH_AUDIO audio_TCP_connected = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x34,0x92,0xEF}; //T004 服务器连接成功
TS_SPEECH_AUDIO audio_config_mode = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x35,0x93,0xEF}; //T005 进入配网模式
TS_SPEECH_AUDIO audio_config_complete = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x36,0x94,0xEF}; //T006 配网成功,请重启设备
TS_SPEECH_AUDIO audio_config_phone = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x37,0x95,0xEF}; //T007 进入配网模式,请打开APP进行配置
TS_SPEECH_AUDIO audio_volume_up = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x38,0x96,0xEF}; //T008 音量增大
TS_SPEECH_AUDIO audio_volume_down = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x39,0x97,0xEF}; //T009 音量减小
TS_SPEECH_AUDIO audio_low_power = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x32,0x92,0xEF}; //T022 电池电量低,请及时充电
/****************************************训练提示音****************************************/
TS_SPEECH_AUDIO audio_game_maze_1 = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x30,0x8F,0xEF}; //T010 走迷宫,一星。请按照要求画出一条从入口到出口的线,不能跨越实线
TS_SPEECH_AUDIO audio_game_different_1 = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x31,0x90,0xEF}; //T011 找不同,一星。请找出两张图片中不同的地方
TS_SPEECH_AUDIO audio_game_shulte_1 = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x32,0x91,0xEF}; //T012 舒尔特方格,一星。请按照从小到大的顺序依次指出1-25
TS_SPEECH_AUDIO audio_game_zlxs_4 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x33,0x93,0xEF}; //T023 众里寻3,四星。请按顺序逐行依次指出3和3的倍数,以及含3的数字方块
TS_SPEECH_AUDIO audio_game_hyjj_3 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x34,0x94,0xEF}; //T024 火眼金晶,三星。请快速找出顺时针旋转90度的数字方块
TS_SPEECH_AUDIO audio_game_hyjj_4 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x35,0x95,0xEF}; //T025 火眼金晶,四星。请快速找出顺时针旋转180度的数字方块
TS_SPEECH_AUDIO audio_game_hyjj_5 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x36,0x96,0xEF}; //T026 火眼金晶,五星。请快速找出顺时针旋转270度的数字方块
TS_SPEECH_AUDIO audio_game_cxdd_4 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x34,0x94,0xEF}; //T027 从小到大,四星。请按照从小到大的顺序依次指出刚才出现的数字
TS_SPEECH_AUDIO audio_game_mcqh_4 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x35,0x95,0xEF}; //T028 明察秋毫,四星。请按顺序指出数字积木的位置
TS_SPEECH_AUDIO audio_game_mcqh_5 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x36,0x96,0xEF}; //T029 明察秋毫,五星。请按顺序指出数字积木的位置
TS_SPEECH_AUDIO audio_game_jmzx_3 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x34,0x94,0xEF}; //T030 积木再现,三星。请回忆数字积木的位置并指出
TS_SPEECH_AUDIO audio_game_jmzx_4 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x35,0x95,0xEF}; //T031 积木再现,四星。请回忆数字积木的位置并指出
TS_SPEECH_AUDIO audio_game_jmzx_5 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x36,0x96,0xEF}; //T032 积木再现,五星。请回忆数字积木的位置并指出
TS_SPEECH_AUDIO audio_game_hyzb_1 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x34,0x94,0xEF}; //T033 还原钟表,一星。请将数字摆放在钟表合适的位置上
TS_SPEECH_AUDIO audio_game_hyzb_2 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x35,0x95,0xEF}; //T034 还原钟表,二星。请将数字摆放在钟表合适的位置上
TS_SPEECH_AUDIO audio_game_sjgh_3 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x36,0x96,0xEF}; //T035 时间规划,三星。请按提示将指针指向相应的时间
TS_SPEECH_AUDIO audio_game_jssj_4 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x34,0x94,0xEF}; //T036 计算时间,四星。计算并将钟表拨动至相应的位置
TS_SPEECH_AUDIO audio_game_jssj_5 = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x35,0x95,0xEF}; //T037 计算时间,五星。计算并将钟表拨动至相应的位置
TS_SPEECH_AUDIO audio_game_error = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x33,0x92,0xEF}; //T013 错误
TS_SPEECH_AUDIO audio_game_correct = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x34,0x93,0xEF}; //T014 “正确提示音”
TS_SPEECH_AUDIO audio_game_overtime = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x35,0x94,0xEF}; //T015 超时结束,再接再励
TS_SPEECH_AUDIO audio_game_complete = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x36,0x95,0xEF}; //T016 恭喜你,任务完成
/****************************************服务器下发任务************************************/
TS_SPEECH_AUDIO audio_tcp_maze = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x37,0x96,0xEF}; //T017 请进行走迷宫游戏训练
TS_SPEECH_AUDIO audio_tcp_different = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x38,0x97,0xEF}; //T018 请进行找不同游戏训练
TS_SPEECH_AUDIO audio_tcp_shulte = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x39,0x98,0xEF}; //T019 请进行舒尔特方格游戏训练
TS_SPEECH_AUDIO audio_tcp_complete = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x30,0x90,0xEF}; //T020 恭喜你,今天所有训练任务已完成
TS_SPEECH_AUDIO audio_tcp_noplan = {0x7E,0x07,0xA3,0x54,0x30,0x32,0x31,0x91,0xEF}; //T021 今天暂无训练任务,可以进行自由训练哦
TS_SPEECH_VOLUME volume_control = {0x7E,0x04,0xAE,0x1E,0xD0,0xEF}; //音量控制
void L2_WT2605B_init()
{
// 初始化管脚
D_stdIO_P0(BITN0);
D_stdIO_P0(BITN1);
// 初始化功放控制引脚P26
// 0 开启 1 关闭
D_stdIO_P2(BITN6);
// 初始化音量
L2_WT2605B_VolumeControl(G.volume);
L2_WT2605B_ON();
}
void L2_WT2605B_ON()
{
D_P26_OFF();
}
void L2_WT2605B_OFF()
{
D_P26_ON();
}
void L2_WT2605B_Broadcast(TS_SPEECH_AUDIO *music)
{
L0_uart3_sendArray((U8 *)music,9);
}
void L2_WT2605B_Broadcast_TPC(U8* GameID)
{
if (GameID[0] == 0x31 && GameID[1] == 0x52)
{
L2_WT2605B_Broadcast(&audio_tcp_maze);
}
else if (GameID[0] == 0x31 && GameID[1] == 0x33)
{
L2_WT2605B_Broadcast(&audio_tcp_different);
}
else if (GameID[0] == 0x31 && GameID[1] == 0x42)
{
L2_WT2605B_Broadcast(&audio_tcp_shulte);
}
}
// 音量控制
void L2_WT2605B_VolumeControl(U8 grade)
{
volume_control.grade = grade;
volume_control.crc = volume_control.num + volume_control.cmd + volume_control.grade;
L0_uart3_sendArray((U8 *)&volume_control,6);
}
// 音量设置6个档位:0x15,0x17,0x19,0x1B,0x1D,0x1F
// 音量增大
void L2_WT2605B_VioceUp(void)
{
if (volume_control.grade >= 0x15 && volume_control.grade < 0x1F)
{
volume_control.grade = volume_control.grade + 2;
G.volume = volume_control.grade;
L0_Iap_Program_array(EEPROM_DATA_ADDR,(U8*)&G,sizeof(G));
}
else
{
volume_control.grade = volume_control.grade;
G.volume = volume_control.grade;
L0_Iap_Program_array(EEPROM_DATA_ADDR,(U8*)&G,sizeof(G));
}
L2_WT2605B_VolumeControl(G.volume);
L2_WT2605B_Broadcast(&audio_volume_up);
}
// 音量减小
void L2_WT2605B_VioceDown(void)
{
if (volume_control.grade > 0x15 && volume_control.grade <= 0x1F)
{
volume_control.grade = volume_control.grade - 2;
G.volume = volume_control.grade;
L0_Iap_Program_array(EEPROM_DATA_ADDR,(U8*)&G,sizeof(G));
}
else
{
volume_control.grade = volume_control.grade;
G.volume = volume_control.grade;
L0_Iap_Program_array(EEPROM_DATA_ADDR,(U8*)&G,sizeof(G));
}
L2_WT2605B_VolumeControl(G.volume);
L2_WT2605B_Broadcast(&audio_volume_down);
}

81
source/bsp/bsp_WT2605B.h

@ -0,0 +1,81 @@
#ifndef BSP_WT2605B_H
#define BSP_WT2605B_H
#include "bsp_config.h"
// 播放指定音频
typedef struct
{
vU8 start;
vU8 num;
vU8 cmd;
vU8 file[4];
vU8 crc;
vU8 end;
}TS_SPEECH_AUDIO;
// 音量控制
typedef struct
{
vU8 start;
vU8 num;
vU8 cmd;
vU8 grade;
vU8 crc;
vU8 end;
}TS_SPEECH_VOLUME;
extern TS_SPEECH_AUDIO audio_powerdown;
extern TS_SPEECH_AUDIO audio_poweron;
extern TS_SPEECH_AUDIO audio_wifi_connected;
extern TS_SPEECH_AUDIO audio_TCP_connected;
extern TS_SPEECH_AUDIO audio_config_mode;
extern TS_SPEECH_AUDIO audio_config_complete;
extern TS_SPEECH_AUDIO audio_config_phone;
extern TS_SPEECH_AUDIO audio_volume_up;
extern TS_SPEECH_AUDIO audio_volume_down;
extern TS_SPEECH_AUDIO audio_game_maze_1; //迷宫,一星
extern TS_SPEECH_AUDIO audio_game_different_1; //找不同,一星
extern TS_SPEECH_AUDIO audio_game_shulte_1; //舒尔特方格,三星
extern TS_SPEECH_AUDIO audio_game_zlxs_4; //众里寻3,四星
extern TS_SPEECH_AUDIO audio_game_hyjj_3; //火眼金晶,三星
extern TS_SPEECH_AUDIO audio_game_hyjj_4; //火眼金晶,四星
extern TS_SPEECH_AUDIO audio_game_hyjj_5; //火眼金晶,五星
extern TS_SPEECH_AUDIO audio_game_cxdd_4; //从小到大,四星
extern TS_SPEECH_AUDIO audio_game_mcqh_4; //明察秋毫,四星
extern TS_SPEECH_AUDIO audio_game_mcqh_5; //明察秋毫,五星
extern TS_SPEECH_AUDIO audio_game_jmzx_3; //积木再现,三星
extern TS_SPEECH_AUDIO audio_game_jmzx_4; //积木再现,四星
extern TS_SPEECH_AUDIO audio_game_jmzx_5; //积木再现,五星
extern TS_SPEECH_AUDIO audio_game_hyzb_1; //还原钟表,一星
extern TS_SPEECH_AUDIO audio_game_hyzb_2; //还原钟表,二星
extern TS_SPEECH_AUDIO audio_game_sjgh_3; //时间规划,三星
extern TS_SPEECH_AUDIO audio_game_jssj_4; //计算时间,四星
extern TS_SPEECH_AUDIO audio_game_jssj_5; //计算时间,五星
extern TS_SPEECH_AUDIO audio_game_error; //错误
extern TS_SPEECH_AUDIO audio_game_correct; //正确
extern TS_SPEECH_AUDIO audio_game_overtime; //训练时间到
extern TS_SPEECH_AUDIO audio_game_complete; //训练完成
extern TS_SPEECH_AUDIO audio_tcp_maze;
extern TS_SPEECH_AUDIO audio_tcp_different;
extern TS_SPEECH_AUDIO audio_tcp_shulte;
extern TS_SPEECH_AUDIO audio_tcp_complete;
extern TS_SPEECH_AUDIO audio_tcp_noplan;
extern TS_SPEECH_AUDIO audio_low_power;
extern TS_SPEECH_VOLUME volume_control;
extern void L2_WT2605B_init();
extern void L2_WT2605B_ON();
extern void L2_WT2605B_OFF();
extern void L2_WT2605B_Broadcast(TS_SPEECH_AUDIO *music);
extern void L2_WT2605B_Broadcast_TPC(U8* GameID);
extern void L2_WT2605B_VolumeControl(U8 grade);
extern void L2_WT2605B_VioceUp();
extern void L2_WT2605B_VioceDown();
#endif

23
source/bsp/bsp_config.c

@ -1,7 +1,7 @@
#include "bsp_config.h"
#include "../msp/msp_UART0.h"
// #include "../msp/msp_UART0.h"
// #include "../msp/eeprom.h"
#include "../msp/msp_eeprom.h"
// #include "../msp/msp_eeprom.h"
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
@ -22,7 +22,6 @@
//初始化为NULL,timer0_isr中判断为NULL则不调用
//==========================================================
void L0_board_config(void)
{
#if (PIN_UART0_Rxd_30_Txd_31 == D_PIN_UART0)
@ -59,38 +58,24 @@ void L0_board_config(void)
//LED
//D_stdIO_P1(BITN7);
//D_stdIO_P5(BITN5);
D_stdIO_P5(BITN5);
//IO
D_stdIO_P1(BITN0);
D_stdIO_P1(BITN1);
D_stdIO_P1(BITN2);
//D_OpenD_P0(BITN0);
//D_OpenD_P0(BITN1);
D_stdIO_P0(BITN0);
D_stdIO_P0(BITN1);
D_stdIO_P1(BITN6);
// D_stdIO_P3(BITN2);
D_HighR_P3(BITN2);
D_HighR_P3(BITN3);
D_stdIO_P3(BITN4);
D_stdIO_P3(BITN5);
D_stdIO_P3(BITN6);
D_stdIO_P3(BITN7);
D_stdIO_P2(BITN7);
D_stdIO_P2(BITN6);
//D_HighI_P5(BITN5);
D_stdIO_P0(BITN2);
D_OpenD_P5(BITN5);
D_HighR_P4(BITN0);
D_HighI_P3(BITN4);
D_HighI_P5(BITN0);
D_HighI_P0(BITN5);
P05 = 0;

28
source/bsp/bsp_config.h

@ -77,7 +77,14 @@
#define D_MCU_NAME "STC8H3K64S4"
//存储器特殊参数地址配置
#define D_MCU_SPEC_PARAM_CHIPID 0xFDF9
#define MSP_ID_LEN 7
#define D_MCU_SPEC_PARAM_ID_IN_RAM 0x00F1
#define D_MCU_SPEC_PARAM_ID_IN_ROM 0xFDF9
#define D_MCU_SPEC_PARAM_ID_IN_CHIPID 0xFDE0
#define ID_ADDR_IN_RAM ((char idata *)(D_MCU_SPEC_PARAM_ID_IN_RAM + 0x00))
#define ID_ADDR_IN_ROM ((char code *)(D_MCU_SPEC_PARAM_ID_IN_ROM + 0x00))
#define ID_ADDR_IN_CHIPID ((unsigned char volatile xdata *)(D_MCU_SPEC_PARAM_ID_IN_CHIPID + 0x00))
//...其他参数
#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC)
@ -158,28 +165,10 @@
#define D_MODBUS_SPLIT_ENTRY L1_modbus_split //modbus切割函数,在tpc_modbus.c中实现,依据实际情况修改
#define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应
//外设定义
#define LED1 P27 //D4
#define LED2 P26 //D4
#define LED3 P02 //D4
#define LED4 P55 //D4
//笔头
#define SCK P34
#define SDIO P50
// 3V3输出控制(WIFI,笔头供电)
#define L0_PW_3V3_INIT() D_HighI_P5(BITN3)
#define L0_PW_3V3_ON() D_P53_OFF()
#define L0_PW_3V3_OFF() D_P53_ON()
//按键
#define key1 P32 //音量增大
#define key2 P33 //音量减小
#define key3 P40 //开关机
#define Key (key1 && key2 && key3)
//EEP存储地址定义
#define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes
#define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等
@ -338,7 +327,6 @@ L1_tick_tick
extern void L0_board_config(void);
#endif//_BSP_CONFIG_H
/*********************************end file*********************************************/

48
source/bsp/bsp_key.c

@ -0,0 +1,48 @@
#include "bsp_key.h"
void L2_key_init()
{
D_stdIO_P2(BITN1);
D_stdIO_P2(BITN0);//准双向口
D_stdIO_P0(BITN2);
//初始化为高电平
Key1 = Key2 = Key3 = 1;
}
U8 L2_ReadKey1(void)
{
Key1 = 1;
if (Key1 == 0)
{
return Key_Down;
}
else
{
return Key_Up;
}
}
U8 L2_ReadKey2(void)
{
Key2 = 1;
if (Key2 == 0)
{
return Key_Down;
}
else
{
return Key_Up;
}
}
U8 L2_ReadKey3(void)
{
Key3 = 1;
if (Key3 == 0)
{
return Key_Down;
}
else
{
return Key_Up;
}
}

22
source/bsp/bsp_key.h

@ -0,0 +1,22 @@
#ifndef BSP_KEY_H
#define BSP_KEY_H
#include "bsp_config.h"
//按键
#define Key_Down 0
#define Key_Up 1
#define Key1 P21 //音量增大
#define Key2 P20 //音量减小
#define Key3 P02 //开关机
// #define Key (key1 && key2 && key3)
extern void L2_key_init();
extern U8 L2_ReadKey1(void);
extern U8 L2_ReadKey2(void);
extern U8 L2_ReadKey3(void);
#endif

29
source/bsp/bsp_led.c

@ -0,0 +1,29 @@
#include "bsp_led.h"
void L2_led_init()
{
D_HighI_P1(BITN2);
D_HighI_P4(BITN7);
GREEN_LED = LED_OFF;
RED_LED = LED_OFF;
}
void L2_GREEN_LED_ON(void)
{
GREEN_LED = LED_ON;
RED_LED = LED_OFF;
}
void L2_RED_LED_ON(void)
{
GREEN_LED = LED_OFF;
RED_LED = LED_ON;
}
void L2_LED_OFF(void)
{
GREEN_LED = LED_OFF;
RED_LED = LED_OFF;
}

19
source/bsp/bsp_led.h

@ -0,0 +1,19 @@
#ifndef BSP_LED_H
#define BSP_LED_H
#include "bsp_config.h"
#define GREEN_LED P12 //双色红灯
#define RED_LED P47 //双色绿灯
#define LED_ON 0
#define LED_OFF 1
extern void L2_led_init();
extern void L2_RED_LED_ON();
extern void L2_GREEN_LED_ON();
extern void L2_LED_OFF();
#endif

397
source/bsp/bsp_oid.c

@ -6,34 +6,25 @@
#include "../ctask/task.h"
#include "../ctask/tick.h"
#include "../app/app_task_speech.h"
#include "../bsp/bsp_WT2605B.h"
#include "../bsp/bsp_wifi.h"
/******************************************************************************************************
*******************************************************************************************************/
AppDevice eAppDevice = ePointRead_2000A;
///volatile uint32_t RecvData[3];
Ts_OID_ ts_oid;
uint8_t TransCmd[7];
///#define MAIN_Fosc 11059260L
#if 0
#define MAIN_Fosc (12459260L/4)
#define D_DELAY_10US 10
#define D_DELAY_ROD_80US 80
#else
#define MAIN_Fosc (12459260L/2)
#define D_DELAY_10US 20
#define D_DELAY_ROD_80US 160
#endif
//========================================================================
// 函数: void delay_ms(uint8_t ms)
// 描述: 延时函数。
@ -51,10 +42,9 @@ void delay_ms(uint8_t ms)
while(--i); //10T per loop
}while(--ms);
}
void delay_us(uint8_t us)
{
uint16_t i;
// uint16_t i;
do{
// i = MAIN_Fosc / 10000000L;
// i = 1;///5 10 150u 1---50us
@ -62,11 +52,6 @@ void delay_us(uint8_t us)
}while(--us);
}
/******************************************************************************************************
Function:
Input:
Output:
*******************************************************************************************************/
void L0_oid_SendCmd(uint8_t Cmd)
{
uint8_t i;
@ -109,7 +94,6 @@ uint16_t L0_oid_RecvAck16(void)
uint8_t i;
uint16_t AckValue;
AckValue = 0;
///
LD_Oid_SDIO_OUT();
delay_us(D_DELAY_10US);
LD_Oid_SCK_HIGH();
@ -128,12 +112,10 @@ uint16_t L0_oid_RecvAck16(void)
{
AckValue +=1;
}
if(i < 15)
{
AckValue <<= 1;
}
delay_us(D_DELAY_10US);
}
delay_us(D_DELAY_ROD_80US);
@ -141,7 +123,6 @@ uint16_t L0_oid_RecvAck16(void)
return AckValue;
}
void L0_oid_Recv64(void)
{
uint8_t i;
@ -187,9 +168,6 @@ uint8_t L1_oid_TransCmd(uint8_t Cmd)
uint8_t TxCmd;///,det_busy;
uint32_t RxAckCnt = 0;
// L0_uart0_sendstr("\r\n w cmd=");
/// L0_uart0_uchex(Cmd);
//
while(!OID_DET)
{
L0_oid_Recv64();
@ -212,14 +190,12 @@ uint8_t L1_oid_TransCmd(uint8_t Cmd)
break;
}
}
if(RxAckCnt <= D_oid_waitrcv_delay)
{
TxCmd = (uint8_t)L0_oid_RecvAck16();
TxCmd -= 1;
if(TxCmd == Cmd)
{
L0_uart0_sendstr("\r\nCmd=");
L0_uart0_uchex(Cmd);L0_uart0_uc('-');
L0_uart0_uchex(TxCmd);
@ -254,12 +230,11 @@ uint32_t L1_oidReadRegister (uint16_t Data1)
if(!OID_DET)
{
L0_oid_Recv64();
/// uxReturn = RecvData[1];
//uxReturn = RecvData[1];
uxReturn = ts_oid.rec.d32[1];
uxReturn &= 0xFFFF;
return uxReturn;
}
delay_us(100);
i += 1;
if(i >= 20) // check 100ms
@ -306,55 +281,8 @@ uint8_t Write_Register(uint16_t Data1,uint16_t Data2)
void L1_print_rcv(char *str)
{
L0_uart0_sendstr(str);
/********
// Lc_delay_ms(1);
L0_uart0_ulhex(RecvData[0]);
// Lc_delay_ms(1);
L0_uart0_uc(0x09);
L0_uart0_ulhex(RecvData[1]);
L0_uart0_uc(0x09);
**********/
/// L0_uart0_ulhex(ts_oid.rec.d32[1]);L0_uart0_uc(0x09);
///
// L0_uart0_sendArrayHex(ts_oid.rec.d,8);
///L2_oid_ParseF1();
}
/******************************************************************************************************
Function:
Input:
Output:
BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7
666655555555554444444444333333333322222222221111111111
3210987654321098765432109876543210987654321098765432109876543210
76543210 76543210 76543210 76543210
76543210 76543210 76543210 76543210
BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7
U16[0] U16[1] U16[2] U16[3]
111111 111111 111111 111111
5432109876543210543210987654321054321098765432105432109876543210
666655555555554444444444333333333322222222221111111111
3210987654321098765432109876543210987654321098765432109876543210
u32[0] u32[1]
3322222222221111111111 3322222222221111111111
1098765432109876543210987654321010987654321098765432109876543210
666655555555554444444444333333333322222222221111111111
3210987654321098765432109876543210987654321098765432109876543210
U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45
U8 Ydec; //小数部分43–36 1111 0010b (Y decimal)
U8 Xdec; //小数部分35–28 0111 0100b (X decimal)
U8 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer)
U8 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer)
*******************************************************************************************************/
vU16 Lc_dec_us100(vU16 pint,u8 pdec)
{
pint *= 100;
@ -364,13 +292,11 @@ vU16 Lc_dec_us100(vU16 pint,u8 pdec)
pint -= 100;
}else
{
}
pdec *= 100;
pdec /= 128;
pint += (vU16)pdec;
return pint;
}
void L2_oid_ParseF1(void) //解析
@ -380,21 +306,8 @@ void L2_oid_ParseF1(void) //解析
// L1_print_rcv("\r\n F1=");
ts_oid.oid_type = ts_oid.rec.d[0];
R.game.type = ts_oid.rec.d[6];
R.game.dat = ts_oid.rec.d[7];
L0_uart0_sendstr("R.game.type = ");
L0_uart0_uchex(R.game.type);
L0_uart0_0d0a();
L0_uart0_sendstr("R.game.dat = ");
L0_uart0_uchex(R.game.dat);
L0_uart0_0d0a();
// R.oid.type = ts_oid.rec.d[6];
// R.oid.dat = ts_oid.rec.d[7];
L1_Oid_Rec_PRINT();
if(ts_oid.rec.d[0] == 0x00) // 4
{/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分
///组成,整数部分 14bit,小数部分 8bit
@ -402,33 +315,9 @@ void L2_oid_ParseF1(void) //解析
ts_oid.last_time = s_nos_tick.t_1s;
ts_oid.Xint = ts_oid.rec.d16[3] & 0x3fff;
#if 0
// 测试oid,led,喇叭联动
if(ts_oid.rec.d16[3] == 0x4E85)
{
L0_uart3_sendArray((U8 *)&audio_SchulteGrid,9);
LED1 = ~LED1;
}
if(ts_oid.rec.d16[3] == 0x4E86)
{
L0_uart3_sendArray((U8 *)&audio_up,9);
LED2 = ~LED2;
}
if(ts_oid.rec.d16[3] == 0x4E87)
{
L0_uart3_sendArray((U8 *)&audio_down,9);
LED3 = ~LED3;
}
if(ts_oid.rec.d16[3] == 0x4E88)
{
L0_uart3_sendArray((U8 *)&audio_zmg,9);
LED4 = ~LED4;
}
#endif
if(ts_oid.Xint < 300)///取决于图片 fixme: cc //0E87 --- 3719
{
L0_uart0_sendstr("ts_oid.Xint < 300");
ts_oid.oid_x = 1;
u32t[0] = ts_oid.rec.d32[0];
@ -440,30 +329,10 @@ void L2_oid_ParseF1(void) //解析
ts_oid.Ydec = (ts_oid.rec.d[2]<<4) | (ts_oid.rec.d[3]>>4);
///28 35
ts_oid.Xdec = (ts_oid.rec.d[3]<<4) | (ts_oid.rec.d[4]>>4);
#ifdef docsdfads
C0EC58E5 60 4D 24 23 A0 23 80 57 (12800.4500,142.5156) 105
C0EC58E5 60 4C E4 54 C0 23 40 5A (12800.5900,141.5391) 103
C0EC58E5 60 4D 44 B5 A0 23 00 5D (12800.7000,140.5859) 106
C0EC58E5 60 4D 24 AF 30 22 C0 61 (12800.9000,139.5781) 105
C0EC58E5 60 4D 24 B1 E0 22 80 64 (12800.2300,138.5859) 105
A0 23 80 57 (12800.4500,142.5156) 105
A0 23 80 57
C0 23 40 5A
A0 23 00 5D
30 22 C0 61
E0 22 80 64
1010 0000 0010 0011 1000 0000 0101 0111
3322 2222 2222 1111 1111 11
1098 7654 3210 9876 5432 1098 7654 3210
#endif
u32t[1] >>= 14;
ts_oid.Yint = (vU16)u32t[1];
ts_oid.Yint &= 0x3fff;
#if 0
if(ts_oid.Xdec&0x80)
{
@ -496,10 +365,8 @@ void L2_oid_ParseF1(void) //解析
#endif
//数据存储到寄存器
printf(" %hd %hd %hd ",
printf(" 1111111 %hd %hd %hd ",
ts_oid.X100,ts_oid.Y100,
ts_oid.angle);
}
@ -511,17 +378,9 @@ void L2_oid_ParseF1(void) //解析
}
else if(ts_oid.rec.d[0] == 0x40)///手写
{
//// 普通码(bit61=0)
//// Bit60:码是否有效(1:无效码;0:有效码)
//// Bit59~Bit28:保留
/// Bit27~Bit0:有效数据
/// G.oid_p = 1;
ts_oid.oid_p = 1;
ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF;
/// R.oid3_order = (int)ts_oid.gCode *100;
printf(" %ld %x ",ts_oid.gCode,(int)ts_oid.gCode);
printf(" 2222222 %ld %x ",ts_oid.gCode,(int)ts_oid.gCode);
L0_uart0_ulhex(ts_oid.gCode);
}
else
@ -545,7 +404,6 @@ void L2_oid_status(void)
//L0_uart2_sendstr("456");
}
}
}
uint8_t L1_OID_WakeUp(void)
@ -556,7 +414,6 @@ uint8_t L1_OID_WakeUp(void)
LD_Oid_SCK_HIGH();
delay_ms(30);
LD_Oid_SCK_LOW();
L0_uart0_sendstr(" 44 ");
while(1)
@ -577,7 +434,6 @@ uint8_t L1_OID_WakeUp(void)
///use
L0_uart0_sendstr(" ok\r\n");
return 1;//ucCheckVersionAndInit(eAppDevice);
}
else
{
@ -587,8 +443,6 @@ uint8_t L1_OID_WakeUp(void)
}
}
}
/******************************************************************************************************
Function:
Input:
@ -597,111 +451,53 @@ Output:
void L0_Oid_Init(void)
{
LD_Oid_DIO_INIT();
/******************************************************************************************************
5430C2000A/3000A点读应用初始化设置
1 single command 0x4D
2 REG(0xD40) = 0x00 OID码0X00仅读OID3/OID2,0X10仅读OID3S0X20仅读OID4
3 single command 0x36
4 "REG(0x0DAD) = 4250 //设置AE Target
REG(0x0DB1) = 4000 //设置AE LOW
REG(0x0DAF) = 4000 //设置AE LOW
REG(0x0DB0) = 4500 //设置AE HIGH
REG(0x0DAE) = 4500 //设置AE HIGH
REG(0x1641) = 0xA0 //设置dot filter
REG(0x0D6A) = 0x3F //此项不要改动
REG(0x0D2C) = 0x3F //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。
AE Range和dot filter
AE_LOW < AE_Target <AE_HIGH.
Dot filter0x40,0x50,0x60"
5
6 REG(0xD63) = 0x80
6 "i = REG(0xD63)
i &= 0xFFFE
REG(0xD63) = i" 打开解码,方法是把寄存器0xD63中的数据的bit0清零,其它bit不可动。
*******************************************************************************************************/
L0_uart0_sendstr("\r\nL1_OID_WakeUp3 ");
L1_OID_WakeUp();
L0_uart0_sendstr("666666");
/***
L1_oid_TransCmd(0x4D);//// 1 single command 0x4D 关闭解码
Write_Register(0x0D40,0x00); //// 2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4
L1_oid_TransCmd(0x36);///3 single command 0x36 关闭手写码侦测
Write_Register(0x0DAD,4250); //设置 AE Target 4 "REG(0x0DAD) = 4250 //设置AE Target
Write_Register(0x0DB1,4000); //设置 AE LOW
Write_Register(0x0DAF,4000); //设置 AE LOW
Write_Register(0x0DB0,4500); //设置 AE High
Write_Register(0x0DAE,4500); //设置 AE High 0x1194
Write_Register(0x1641,0xA0); //设置 dot filter
Write_Register(0x0D6A,0x3F); //此项不要改动
Write_Register(0x0D2C,0x3F); //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。
******/
Write_Register(0x0D63,0x80); //cc 好像数据分辨率有区别 此项不要改动 6 REG(0xD63) = 0x80 打开解码。此命令错误改为如下命令。
///L1_oid_CheckVersionAndInit();///cc 仍然有读取错误的时候
// 6 "i = REG(0xD63)
// i &= 0xFFFE
// REG(0xD63) = i" 打开解码,方法是把寄存器0xD63中的数据的bit0清零,其它bit不可动。
L1_oid_TransCmd(USERCMD_20FPS);//cc 必须添加
L1_oid_TransCmd(USERCMD_EN_ANGLE);//cc 必须添加
L1_oid_TransCmd(USERCMD_EN_POSITION);//cc 必须添加
printf("\r\n L0_Oid_Init finish\r\n");
///while(9)
{
L1_Oid_readoid();
}
ts_oid.ok = 0;
}
void L1_Oid_readoid(void)
{
if(!OID_DET)
{
// LED1 = ~LED1;
// 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;
L2_oid_ParseF1();
ts_oid.ok = 1;
//L2_oid_status();
L1_print_rcv("\r\n ");
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");
}
else if((s_nos_tick.t_1s - ts_oid.last_time >= 2)&& (G.pen_t == 0))
{
G.pen_up = 1;
G.pen_t =1;
L0_uart0_sendstr("789");
}
/// delay_us(100);
// else if((s_nos_tick.t_1s - ts_oid.last_time >= 5) && (G.pen_t == 0))
// {
// G.pen_up = 1;
// G.pen_t =1;
// L0_uart0_sendstr("789789aabbcc");
// }
// else if((G.pen_t == 0))
// {
// G.pen_up = 1;
// G.pen_t =1;
// L0_uart0_sendstr("789789aabbcc");
// }
}
void L1_Oid_Rec_PRINT(void)
{
// d[7]
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[0] = ");
L0_uart0_uchex(ts_oid.rec.d[0]);
L0_uart0_0d0a();
@ -753,150 +549,3 @@ void L1_Oid_Rec_PRINT(void)
}
#if 0
step1
if(!OID_DET)
{
L0_oid_Recv64();
step2
L2_oid_ParseF1();
step 3
///#ifdef doc980808
unsigned char s[64]=
{
1 , // 0
1 , // 1
1 , // 2
1 , // 3
1 , // 4
1 , // 5
1 , // 6
1 , // 7 xxxx
1 , // 8
1 , // 9
1 , // 10
1 , // 11
1 , // 12
1 , // 13
1 , // 14
1 , // 15 xxxx
1 , // 16
1 , // 17
1 , // 18
1 , // 19
1 , // 20
1 , // 21
1 , // 22
1 , // 23 xxxx
1 , // 24
1 , // 25
1 , // 26
1 , // 27
1 , // 28
1 , // 29
1 , // 30
1 , // 31 xxxx
1 , // 32
1 , // 33
1 , // 34
1 , // 35
1 , // 36
1 , // 37
1 , // 38
1 , // 39 xxxx
1 , // 40
1 , // 41
1 , // 42
1 , // 43
1 , // 44
1 , // 45
1 , // 46
1 , // 47 xxxx
1 , // 48
1 , // 49
1 , // 50
1 , // 51
1 , // 52
1 , // 53
1 , // 54
1 , // 55 xxxx
1 , // 56
1 , // 57
1 , // 58
1 , // 59
1 , // 60
1 , // 61
1 , // 62
1 // 63 xxxx
};
int x =0;
int i;
void t(void)
{RecvData[0] = 0;RecvData[1] = 0;
for(i = 0; i < 64; i++)
{
if(s[63-i])
{
if(i < 32)
{
RecvData[0] += 1;
}
if(i>=32 && i<64)
{
RecvData[1] += 1;
}
}
if(i < 31)
{
RecvData[0] <<= 1;
}
if( i >31 && i < 63)
{
RecvData[1] <<= 1;
}
}
for(i = 0; i < 64; i++)
{
ts_oid.d[i/8] <<= 1;
if(s[63-i])
{
ts_oid.d[i/8] |= 1;
}
else
{
ts_oid.d[i/8] &= 0xfe;
}
}
i =5;
}
#endif

4
source/bsp/bsp_oid.h

@ -163,6 +163,8 @@ typedef struct _ts_OID
U8 oid_x;
U8 oid_p;
U8 ok;
}Ts_OID_;
extern Ts_OID_ ts_oid;
@ -170,6 +172,8 @@ extern Ts_OID_ ts_oid;
void L0_Oid_Init(void);
extern void L2_OID_init();
uint8_t L1_oid_TransCmd(uint8_t Cmd);
void L1_print_rcv(char *str);
uint32_t L1_oidReadRegister (uint16_t Data1);

183
source/bsp/bsp_oid_undelect..h

@ -0,0 +1,183 @@
#ifndef __OPTICALDATA__
#define __OPTICALDATA__
#include "bsp_config.h"
#include "../app/app_config.h"
/******************************************************************************************************
*******************************************************************************************************/
#define ROM009_HANDWRITE 0
#define DATA_FORMAT_2 0
#define OID_4C 0
#define DEBOUNCE_FUNC 0
#define LOG_REGISTER 0
#if DEBOUNCE_FUNC
#define DEBOUNCE_TIMES 3 // 连续三笔相同,才触发,debounce时,可设置。去抖动时间
#define DEBOUNCE_RELESE_TIME 20 //5ms * 20 = 100ms,100ms无任何码,认为抬笔。
#endif
/******************************************************************************************************
2-wire GPIO
#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流
#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻
#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
*******************************************************************************************************/
#define LD_oid_io_init() LD_Oid_SCK_INIT()
////#define LD_Oid_SCK_INIT() D_stdIO_P3(BITN4);
#define LD_Oid_SCK_LOW() D_P34_OFF();
#define LD_Oid_SCK_HIGH() D_P34_ON();
#define LD_Oid_SCK_INIT(); D_HighI_P3(BITN4);LD_Oid_SCK_LOW();
#define LD_Oid_SDIO_INIT() D_HighR_P5(BITN0)
#define LD_Oid_SDIO_LOW() D_P50_OFF()
#define LD_Oid_SDIO_HIGH() D_P50_ON()
#define LD_Oid_SDIO_IN() D_HighR_P5(BITN0)//高阻输入
#define LD_Oid_SDIO_OUT() D_HighI_P5(BITN0)//推挽输出
#define LD_Oid_SDIO_AT() D_P50_AT()
#define LD_Oid_DIO_INIT(); LD_Oid_SCK_INIT();LD_Oid_SDIO_INIT();
#define OID_DET P50
/******************************************************************************************************
OID命令
*******************************************************************************************************/
////20211229依据53xx和54xx系列操作
#define USERCMD_20FPS 0x24
#define USERCMD_30FPS 0x25
#define USERCMD_40FPS 0x26
#define USERCMD_50FPS 0x27
#define USERCMD_80FPS 0x3C
#define USERCMD_80FPS_EXIT 0x3B
#define USERCMD_DECODE_SHUT 0x4D
#define USERCMD_LIANCHUAN 0x40
#define USERCMD_SUSPEND 0x57
#define USERCMD_EN_ANGLE 0x10
#define USERCMD_EN_POSITION 0x35
#define USERCMD_SW_POSITION 0x43
#define USERCMD_DATA_FORMAT_2 0x2C
#define USERCMD_LOU_GUANG 0xD7
#define USERCMD_POWER_DOWN 0x56
#define OIDCMD_POWER_ON 0x0000FFF8
#define OIDCMD_POWER_OFF 0x0000FFF7
/******************************************************************************************************
OID版本
*******************************************************************************************************/
#define OID_VER_D 0x1169
#define OID_VER_REG 0x1670
#define OID_VER_F 0x1168
#define REG_READOID_SET 0xD40
#define REG_EN_DECODE 0xD63
#define REG_ROM008 0xDA5
#define REG_ROM009 0xDA6
#define ROM_009 0x09
#define ROM_008 0x00
/******************************************************************************************************
Dataformat 2
*******************************************************************************************************/
#define CHECK_INVALID_DF2 0x40000000
#define CHECK_OID_VERSION_DF2 0xFC000000
#define OID_2_GENERAL_DF2 0x00000000
#define OID_3_GENERAL_DF2 0x08000000
#define OID_3_POSITION_DF2 0x04000000
#define OID_3S_GENERAL_DF2 0x10000000
#define OID_3S_POSITION_DF2 0x0C000000
#define OID_35_GENERAL_DF2 0x14000000
#define OID_4_GENERAL_DF2 0x1C000000
#define OID_4_POSITION_DF2 0x18000000
#define OID_4C_POSITION_DF2 0x20000000
/******************************************************************************************************
*******************************************************************************************************/
typedef enum
{
eHandWrite = 0,
ePointRead_2000A = 1,
ePointRead_3000A = 2,
ePointRead_LightGuide = 3,
eCar_LightGuide = 4,
}AppDevice;
extern AppDevice eAppDevice;
/*****************
void OidTaskLoop(void);
uint8_t L1_oid_TransCmd(uint8_t Cmd);
uint8_t WakeUpOID(void);
void L1_oid_RecvOptData(void);
void LogRegister(void);
uint8_t L1_oid_CheckVersionAndInit(AppDevice eAppDevice);
/*****************************/
/**********************************************************
Bit Indication
6360 0110b
5954 Reserved
5345 Angle
44 Reserved
4336 1111 0010b (Y decimal)
3528 0111 0100b (X decimal)
2714 00 0000 0000 0100b (Y integer)
130 00 0000 0000 0100b (X integer)
******************************************************/
typedef struct _ts_OID
{
U_U64 rec;
// Data format of OID
U8 oid_type; //oid类型 :63–60 0110b
U16 angle; //Angle :53–45
U8 Ydec; //小数部分(Y decimal) :43–36 1111 0010b
U8 Xdec; //小数部分(X decimal) :35–28 0111 0100b
vU16 Yint; //整数部分(Y integer) :27–14 00 0000 0000 0100b
vU16 Xint; //整数部分(X integer) :13–0 00 0000 0000 0100b
vU16 Y100,X100; ///放大100倍的输出
vU32 gCode; //
vU32 time;
vU32 last_time;
vU32 overtime;
float x,y;//cut
vU16 pre_x,pre_y;//cut
U8 oid_x;
U8 oid_p;
}Ts_OID_;
extern Ts_OID_ ts_oid;
///extern volatile uint32_t RecvData[3];
void L0_Oid_Init(void);
uint8_t L1_oid_TransCmd(uint8_t Cmd);
void L1_print_rcv(char *str);
uint32_t L1_oidReadRegister (uint16_t Data1);
void L1_Oid_readoid(void);
uint8_t L1_OID_WakeUp(void);
void L2_oid_ParseF1(void);
void L0_oid_Recv64(void);
void L1_Oid_Rec_PRINT(void);
#endif // __OPTICALDATA__

903
source/bsp/bsp_oid_undelect.c

@ -0,0 +1,903 @@
#include "bsp_oid.h"
#include "intrins.h"
#include "../msp/uart0.h"
#include "../msp/uart3.h"
#include <stdio.h>
#include "../ctask/task.h"
#include "../ctask/tick.h"
#include "../app/app_task_speech.h"
#include "../bsp/bsp_WT2605B.h"
/******************************************************************************************************
*******************************************************************************************************/
AppDevice eAppDevice = ePointRead_2000A;
///volatile uint32_t RecvData[3];
Ts_OID_ ts_oid;
uint8_t TransCmd[7];
///#define MAIN_Fosc 11059260L
#if 0
#define MAIN_Fosc (12459260L/4)
#define D_DELAY_10US 10
#define D_DELAY_ROD_80US 80
#else
#define MAIN_Fosc (12459260L/2)
#define D_DELAY_10US 20
#define D_DELAY_ROD_80US 160
#endif
//========================================================================
// 函数: void delay_ms(uint8_t ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2021-3-9
// 备注:
//========================================================================
void delay_ms(uint8_t ms)
{
uint16_t i;
do{
i = MAIN_Fosc / 10000L;
while(--i); //10T per loop
}while(--ms);
}
void delay_us(uint8_t us)
{
// uint16_t i;
do{
// i = MAIN_Fosc / 10000000L;
// i = 1;///5 10 150u 1---50us
/// while(--i); //10T per loop
}while(--us);
}
/******************************************************************************************************
Function:
Input:
Output:
*******************************************************************************************************/
void L0_oid_SendCmd(uint8_t Cmd)
{
uint8_t i;
LD_Oid_SDIO_OUT();
LD_Oid_SCK_HIGH();
LD_Oid_SDIO_HIGH(); // Write control bit
delay_us(D_DELAY_10US);
LD_Oid_SCK_LOW();
delay_us(D_DELAY_10US);
for(i=0;i<8;i++)
{
LD_Oid_SCK_HIGH();
if(Cmd & 0x80)
{
LD_Oid_SDIO_HIGH();
}
else
{
LD_Oid_SDIO_LOW();
}
delay_us(D_DELAY_10US);
LD_Oid_SCK_LOW();
#if 0
if(i == 7)
{
LD_Oid_SDIO_IN();
}
#endif
delay_us(D_DELAY_10US);
Cmd <<= 1;
}
delay_us(D_DELAY_ROD_80US);
LD_Oid_SDIO_IN();
}
uint16_t L0_oid_RecvAck16(void)
{
uint8_t i;
uint16_t AckValue;
AckValue = 0;
///
LD_Oid_SDIO_OUT();
delay_us(D_DELAY_10US);
LD_Oid_SCK_HIGH();
LD_Oid_SDIO_LOW();
delay_us(D_DELAY_10US);
LD_Oid_SCK_LOW();
delay_us(D_DELAY_10US);
for(i = 0; i < 16; i++)
{
LD_Oid_SCK_HIGH();
LD_Oid_SDIO_IN()
delay_us(D_DELAY_10US);
LD_Oid_SCK_LOW();
if(OID_DET)
{
AckValue +=1;
}
if(i < 15)
{
AckValue <<= 1;
}
delay_us(D_DELAY_10US);
}
delay_us(D_DELAY_ROD_80US);
return AckValue;
}
void L0_oid_Recv64(void)
{
uint8_t i;
Lc_memset8bits(ts_oid.rec.d, 0, 8);
LD_Oid_SDIO_OUT();
delay_us(D_DELAY_10US);
LD_Oid_SCK_HIGH();
LD_Oid_SDIO_LOW();
delay_us(D_DELAY_10US);
LD_Oid_SCK_LOW();
delay_us(D_DELAY_10US);
LD_Oid_SDIO_IN()
for(i = 0; i < 64; i++)
{
LD_Oid_SCK_HIGH();
delay_us(D_DELAY_10US);
LD_Oid_SCK_LOW();
ts_oid.rec.d[i/8] <<= 1;
if(OID_DET)
{
ts_oid.rec.d[i/8] |= 1;
}
else
{
ts_oid.rec.d[i/8] &= 0xfe;
}
delay_us(D_DELAY_10US);
}
ts_oid.time = D_sys_now;
delay_us(D_DELAY_ROD_80US);
return;
}
uint8_t L1_oid_TransCmd(uint8_t Cmd)
{
uint8_t TxCmd;///,det_busy;
uint32_t RxAckCnt = 0;
// L0_uart0_sendstr("\r\n w cmd=");
/// L0_uart0_uchex(Cmd);
//
while(!OID_DET)
{
L0_oid_Recv64();
L1_print_rcv("\r\n busy: RD=");
}
TxCmd = Cmd;
L0_oid_SendCmd(TxCmd);
LD_Oid_SCK_LOW();
delay_us(10);
#define D_oid_waitrcv_delay 100000
while(OID_DET)
{
/// L1_oid_RecvOptData();
RxAckCnt ++;
if(RxAckCnt > D_oid_waitrcv_delay)
{
L0_uart0_sendstr("\r\nno rec");
L0_uart0_uchex(Cmd);
break;
}
}
if(RxAckCnt <= D_oid_waitrcv_delay)
{
TxCmd = (uint8_t)L0_oid_RecvAck16();
TxCmd -= 1;
if(TxCmd == Cmd)
{
L0_uart0_sendstr("\r\nCmd=");
L0_uart0_uchex(Cmd);L0_uart0_uc('-');
L0_uart0_uchex(TxCmd);
return 1;
}
}
}
uint32_t L1_oidReadRegister (uint16_t Data1)
{
uint8_t i,Ret;
uint32_t uxReturn;
TransCmd[0] = 0x74;
TransCmd[1] = 3;
TransCmd[2] = Data1 >> 8;
TransCmd[3] = Data1 & 0x00FF;
TransCmd[4] = (TransCmd[1] + TransCmd[2] + TransCmd[3]) & 0xFF;
for(i=0;i<5;i++)
{
Ret = L1_oid_TransCmd(TransCmd[i]);
if(Ret == 0)
{
return 0x5FFFFFFF;
}
}
i = 0;
while(1)
{
if(!OID_DET)
{
L0_oid_Recv64();
/// uxReturn = RecvData[1];
uxReturn = ts_oid.rec.d32[1];
uxReturn &= 0xFFFF;
return uxReturn;
}
delay_us(100);
i += 1;
if(i >= 20) // check 100ms
{
return 0x2FFFFFFF;
}
}
}
/******************************************************************************************************
Function:
Input:
Output:
*******************************************************************************************************/
uint8_t Write_Register(uint16_t Data1,uint16_t Data2)
{
uint8_t Ret,i;
uint16_t j;
Ret = 1;
TransCmd[0] = 0X73;
TransCmd[1] = 0x05;
j = Data1>>8;
TransCmd[2] = (uint8_t)j;
j = Data1;
TransCmd[3] = (uint8_t)j;
j = Data2>>8;
TransCmd[4] = (uint8_t)j;
j = Data2;
TransCmd[5] = (uint8_t)j;
TransCmd[6] = (TransCmd[1] + TransCmd[2] + TransCmd[3] + TransCmd[4] + TransCmd[5]);
for(i=0;i<7;i++)
{
Ret = L1_oid_TransCmd(TransCmd[i]);
if(Ret == 0)
{
break;
}
}
return Ret;
}
void L1_print_rcv(char *str)
{
L0_uart0_sendstr(str);
/********
// Lc_delay_ms(1);
L0_uart0_ulhex(RecvData[0]);
// Lc_delay_ms(1);
L0_uart0_uc(0x09);
L0_uart0_ulhex(RecvData[1]);
L0_uart0_uc(0x09);
**********/
/// L0_uart0_ulhex(ts_oid.rec.d32[1]);L0_uart0_uc(0x09);
///
// L0_uart0_sendArrayHex(ts_oid.rec.d,8);
///L2_oid_ParseF1();
}
/******************************************************************************************************
Function:
Input:
Output:
BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7
666655555555554444444444333333333322222222221111111111
3210987654321098765432109876543210987654321098765432109876543210
76543210 76543210 76543210 76543210
76543210 76543210 76543210 76543210
BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7
U16[0] U16[1] U16[2] U16[3]
111111 111111 111111 111111
5432109876543210543210987654321054321098765432105432109876543210
666655555555554444444444333333333322222222221111111111
3210987654321098765432109876543210987654321098765432109876543210
u32[0] u32[1]
3322222222221111111111 3322222222221111111111
1098765432109876543210987654321010987654321098765432109876543210
666655555555554444444444333333333322222222221111111111
3210987654321098765432109876543210987654321098765432109876543210
U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45
U8 Ydec; //小数部分43–36 1111 0010b (Y decimal)
U8 Xdec; //小数部分35–28 0111 0100b (X decimal)
U8 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer)
U8 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer)
*******************************************************************************************************/
vU16 Lc_dec_us100(vU16 pint,u8 pdec)
{
pint *= 100;
if(pdec&0x80)///负数
{
pdec &= 0x7f;
pint -= 100;
}else
{
}
pdec *= 100;
pdec /= 128;
pint += (vU16)pdec;
return pint;
}
void L2_oid_ParseF1(void) //解析
{
uint16_t u16i = 0;
uint32_t u32t[2] = 0;
// L1_print_rcv("\r\n F1=");
ts_oid.oid_type = ts_oid.rec.d[0];
R.game.type = ts_oid.rec.d[6];
R.game.dat = ts_oid.rec.d[7];
L0_uart0_sendstr("R.game.type = ");
L0_uart0_uchex(R.game.type);
L0_uart0_0d0a();
L0_uart0_sendstr("R.game.dat = ");
L0_uart0_uchex(R.game.dat);
L0_uart0_0d0a();
// R.oid.type = ts_oid.rec.d[6];
// R.oid.dat = ts_oid.rec.d[7];
L1_Oid_Rec_PRINT();
if(ts_oid.rec.d[0] == 0x00) // 4
{/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分
///组成,整数部分 14bit,小数部分 8bit
G.pen_t = 0;
ts_oid.last_time = s_nos_tick.t_1s;
ts_oid.Xint = ts_oid.rec.d16[3] & 0x3fff;
#if 0
// 测试oid,led,喇叭联动
if(ts_oid.rec.d16[3] == 0x4E85)
{
L0_uart3_sendArray((U8 *)&audio_SchulteGrid,9);
LED1 = ~LED1;
}
if(ts_oid.rec.d16[3] == 0x4E86)
{
L0_uart3_sendArray((U8 *)&audio_up,9);
LED2 = ~LED2;
}
if(ts_oid.rec.d16[3] == 0x4E87)
{
L0_uart3_sendArray((U8 *)&audio_down,9);
LED3 = ~LED3;
}
if(ts_oid.rec.d16[3] == 0x4E88)
{
L0_uart3_sendArray((U8 *)&audio_zmg,9);
LED4 = ~LED4;
}
#endif
if(ts_oid.Xint < 300)///取决于图片 fixme: cc //0E87 --- 3719
{
ts_oid.oid_x = 1;
u32t[0] = ts_oid.rec.d32[0];
u32t[1] = ts_oid.rec.d32[1];
ts_oid.angle = (vU16)(u32t[0]>>13); //45-32= 13
ts_oid.angle &= 0x01ff; //53-45+1=8
///36-43
ts_oid.Ydec = (ts_oid.rec.d[2]<<4) | (ts_oid.rec.d[3]>>4);
///28 35
ts_oid.Xdec = (ts_oid.rec.d[3]<<4) | (ts_oid.rec.d[4]>>4);
#ifdef docsdfads
C0EC58E5 60 4D 24 23 A0 23 80 57 (12800.4500,142.5156) 105
C0EC58E5 60 4C E4 54 C0 23 40 5A (12800.5900,141.5391) 103
C0EC58E5 60 4D 44 B5 A0 23 00 5D (12800.7000,140.5859) 106
C0EC58E5 60 4D 24 AF 30 22 C0 61 (12800.9000,139.5781) 105
C0EC58E5 60 4D 24 B1 E0 22 80 64 (12800.2300,138.5859) 105
A0 23 80 57 (12800.4500,142.5156) 105
A0 23 80 57
C0 23 40 5A
A0 23 00 5D
30 22 C0 61
E0 22 80 64
1010 0000 0010 0011 1000 0000 0101 0111
3322 2222 2222 1111 1111 11
1098 7654 3210 9876 5432 1098 7654 3210
#endif
u32t[1] >>= 14;
ts_oid.Yint = (vU16)u32t[1];
ts_oid.Yint &= 0x3fff;
#if 0
if(ts_oid.Xdec&0x80)
{
ts_oid.x -= 1.0;
}
ts_oid.Xdec&=0x7f;
ts_oid.x = (float)ts_oid.Xdec;
ts_oid.x /= 128.0;
if(ts_oid.Xdec&0x80)
{
ts_oid.x -= 1.0;
}
ts_oid.x += ts_oid.Xint;
ts_oid.Ydec&=0x7f;
ts_oid.y = (float)ts_oid.Ydec;
ts_oid.y /= 128.0;
if(ts_oid.Ydec&0x80)
{
ts_oid.y -= 1.0;
}
ts_oid.y += ts_oid.Yint;
#else
ts_oid.X100 = Lc_dec_us100(ts_oid.Xint,ts_oid.Xdec);
ts_oid.Y100 = Lc_dec_us100(ts_oid.Yint,ts_oid.Ydec);
#endif
//数据存储到寄存器
printf(" %hd %hd %hd ",
ts_oid.X100,ts_oid.Y100,
ts_oid.angle);
}
else
{
ts_oid.oid_type = 0;
L0_uart0_uc(';');
}
}
else if(ts_oid.rec.d[0] == 0x40)///手写
{
//// 普通码(bit61=0)
//// Bit60:码是否有效(1:无效码;0:有效码)
//// Bit59~Bit28:保留
/// Bit27~Bit0:有效数据
/// G.oid_p = 1;
ts_oid.oid_p = 1;
ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF;
/// R.oid3_order = (int)ts_oid.gCode *100;
printf(" %ld %x ",ts_oid.gCode,(int)ts_oid.gCode);
L0_uart0_ulhex(ts_oid.gCode);
}
else
{
ts_oid.oid_type = 0;
L0_uart0_uc(',');
}
}
void L2_oid_status(void)
{
if(G.oid_x)
{
if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0)
{
G.pen_down = 1;
//L0_uart2_sendstr("123");
}
else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0)
{
G.pen_hold = 1;
//L0_uart2_sendstr("456");
}
}
}
uint8_t L1_OID_WakeUp(void)
{
uint32_t i = 0;
LD_Oid_SCK_LOW();
delay_ms(2);
LD_Oid_SCK_HIGH();
delay_ms(30);
LD_Oid_SCK_LOW();
L0_uart0_sendstr(" 44 ");
while(1)
{
delay_ms(10);
i += 1;
if(i >= 400) // 400*5ms = 2s
{
L0_uart0_sendstr(" !!out!! ");
return 0;
}
if(!OID_DET)
{
L0_oid_Recv64();
L1_print_rcv("\r\n WakeUpOID get=");
if(ts_oid.rec.d[7] == 0xf8)
{
///use
L0_uart0_sendstr(" ok\r\n");
return 1;//ucCheckVersionAndInit(eAppDevice);
}
else
{
L0_uart0_sendstr("\r\nno?? OIDCMD_POWER_ON \r\n");
return 0;
}
}
}
}
/******************************************************************************************************
Function:
Input:
Output:
*******************************************************************************************************/
void L0_Oid_Init(void)
{
LD_Oid_DIO_INIT();
/******************************************************************************************************
5430C2000A/3000A点读应用初始化设置
1 single command 0x4D
2 REG(0xD40) = 0x00 OID码0X00仅读OID3/OID2,0X10仅读OID3S0X20仅读OID4
3 single command 0x36
4 "REG(0x0DAD) = 4250 //设置AE Target
REG(0x0DB1) = 4000 //设置AE LOW
REG(0x0DAF) = 4000 //设置AE LOW
REG(0x0DB0) = 4500 //设置AE HIGH
REG(0x0DAE) = 4500 //设置AE HIGH
REG(0x1641) = 0xA0 //设置dot filter
REG(0x0D6A) = 0x3F //此项不要改动
REG(0x0D2C) = 0x3F //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。
AE Range和dot filter
AE_LOW < AE_Target <AE_HIGH.
Dot filter0x40,0x50,0x60"
5
6 REG(0xD63) = 0x80
6 "i = REG(0xD63)
i &= 0xFFFE
REG(0xD63) = i" 打开解码,方法是把寄存器0xD63中的数据的bit0清零,其它bit不可动。
*******************************************************************************************************/
L0_uart0_sendstr("\r\nL1_OID_WakeUp3 ");
L1_OID_WakeUp();
L0_uart0_sendstr("666666");
/***
L1_oid_TransCmd(0x4D);//// 1 single command 0x4D 关闭解码
Write_Register(0x0D40,0x00); //// 2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4
L1_oid_TransCmd(0x36);///3 single command 0x36 关闭手写码侦测
Write_Register(0x0DAD,4250); //设置 AE Target 4 "REG(0x0DAD) = 4250 //设置AE Target
Write_Register(0x0DB1,4000); //设置 AE LOW
Write_Register(0x0DAF,4000); //设置 AE LOW
Write_Register(0x0DB0,4500); //设置 AE High
Write_Register(0x0DAE,4500); //设置 AE High 0x1194
Write_Register(0x1641,0xA0); //设置 dot filter
Write_Register(0x0D6A,0x3F); //此项不要改动
Write_Register(0x0D2C,0x3F); //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。
******/
Write_Register(0x0D63,0x80); //cc 好像数据分辨率有区别 此项不要改动 6 REG(0xD63) = 0x80 打开解码。此命令错误改为如下命令。
///L1_oid_CheckVersionAndInit();///cc 仍然有读取错误的时候
// 6 "i = REG(0xD63)
// i &= 0xFFFE
// REG(0xD63) = i" 打开解码,方法是把寄存器0xD63中的数据的bit0清零,其它bit不可动。
L1_oid_TransCmd(USERCMD_20FPS);//cc 必须添加
L1_oid_TransCmd(USERCMD_EN_ANGLE);//cc 必须添加
L1_oid_TransCmd(USERCMD_EN_POSITION);//cc 必须添加
printf("\r\n L0_Oid_Init finish\r\n");
///while(9)
{
L1_Oid_readoid();
}
}
void L1_Oid_readoid(void)
{
if(!OID_DET)
{
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;
L2_oid_ParseF1();
//L2_oid_status();
L1_print_rcv("\r\n ");
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");
}
else if((s_nos_tick.t_1s - ts_oid.last_time >= 10)&& (G.pen_t == 0))
{
G.pen_up = 1;
G.pen_t =1;
L0_uart0_sendstr("789");
}
/// delay_us(100);
}
void L1_Oid_Rec_PRINT(void)
{
// d[7]
L0_uart0_sendstr("ts_oid.rec.d[0] = ");
L0_uart0_uchex(ts_oid.rec.d[0]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[1] = ");
L0_uart0_uchex(ts_oid.rec.d[1]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[2] = ");
L0_uart0_uchex(ts_oid.rec.d[2]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[3] = ");
L0_uart0_uchex(ts_oid.rec.d[3]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[4] = ");
L0_uart0_uchex(ts_oid.rec.d[4]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[5] = ");
L0_uart0_uchex(ts_oid.rec.d[5]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[6] = ");
L0_uart0_uchex(ts_oid.rec.d[6]);
L0_uart0_0d0a();
L0_uart0_sendstr("ts_oid.rec.d[7] = ");
L0_uart0_uchex(ts_oid.rec.d[7]);
L0_uart0_0d0a();
// // d16
// L0_uart0_sendstr("ts_oid.rec.d16[0] = ");
// L0_uart0_ushex(ts_oid.rec.d16[0]);
// L0_uart0_0d0a();
// L0_uart0_sendstr("ts_oid.rec.d16[1] = ");
// L0_uart0_ushex(ts_oid.rec.d16[1]);
// L0_uart0_0d0a();
// L0_uart0_sendstr("ts_oid.rec.d16[2] = ");
// L0_uart0_ushex(ts_oid.rec.d16[2]);
// L0_uart0_0d0a();
// L0_uart0_sendstr("ts_oid.rec.d16[3] = ");
// L0_uart0_ushex(ts_oid.rec.d16[3]);
// L0_uart0_0d0a();
// // d32
// L0_uart0_sendstr("ts_oid.rec.d32[0] = ");
// L0_uart0_ulhex(ts_oid.rec.d32[0]);
// L0_uart0_0d0a();
// L0_uart0_sendstr("ts_oid.rec.d32[1] = ");
// L0_uart0_ulhex(ts_oid.rec.d32[1]);
// L0_uart0_0d0a();
// // oid_type
// L0_uart0_sendstr("ts_oid.oid_type = ");
// L0_uart0_uchex(ts_oid.oid_type);
// L0_uart0_0d0a();
}
#if 0
step1
if(!OID_DET)
{
L0_oid_Recv64();
step2
L2_oid_ParseF1();
step 3
///#ifdef doc980808
unsigned char s[64]=
{
1 , // 0
1 , // 1
1 , // 2
1 , // 3
1 , // 4
1 , // 5
1 , // 6
1 , // 7 xxxx
1 , // 8
1 , // 9
1 , // 10
1 , // 11
1 , // 12
1 , // 13
1 , // 14
1 , // 15 xxxx
1 , // 16
1 , // 17
1 , // 18
1 , // 19
1 , // 20
1 , // 21
1 , // 22
1 , // 23 xxxx
1 , // 24
1 , // 25
1 , // 26
1 , // 27
1 , // 28
1 , // 29
1 , // 30
1 , // 31 xxxx
1 , // 32
1 , // 33
1 , // 34
1 , // 35
1 , // 36
1 , // 37
1 , // 38
1 , // 39 xxxx
1 , // 40
1 , // 41
1 , // 42
1 , // 43
1 , // 44
1 , // 45
1 , // 46
1 , // 47 xxxx
1 , // 48
1 , // 49
1 , // 50
1 , // 51
1 , // 52
1 , // 53
1 , // 54
1 , // 55 xxxx
1 , // 56
1 , // 57
1 , // 58
1 , // 59
1 , // 60
1 , // 61
1 , // 62
1 // 63 xxxx
};
int x =0;
int i;
void t(void)
{RecvData[0] = 0;RecvData[1] = 0;
for(i = 0; i < 64; i++)
{
if(s[63-i])
{
if(i < 32)
{
RecvData[0] += 1;
}
if(i>=32 && i<64)
{
RecvData[1] += 1;
}
}
if(i < 31)
{
RecvData[0] <<= 1;
}
if( i >31 && i < 63)
{
RecvData[1] <<= 1;
}
}
for(i = 0; i < 64; i++)
{
ts_oid.d[i/8] <<= 1;
if(s[63-i])
{
ts_oid.d[i/8] |= 1;
}
else
{
ts_oid.d[i/8] &= 0xfe;
}
}
i =5;
}
#endif

11
source/bsp/bsp_ooid.c

@ -0,0 +1,11 @@
#include "../bsp/bsp_ooid.h"
#include "../bsp/bsp_wifi.h"
void L2_OID_init()
{
D_HighI_P3(BITN4);
P34 = 0;
D_HighR_P5(BITN0);
L2_OID_WIFI_Open();
}

8
source/bsp/bsp_ooid.h

@ -0,0 +1,8 @@
#ifndef BSP_OOID_H
#define BSP_OOID_H
#include "bsp_config.h"
extern void L2_OID_init();
#endif

20
source/bsp/bsp_wifi.c

@ -0,0 +1,20 @@
#include "../bsp/bsp_wifi.h"
void L2_Wifi_init()
{
D_stdIO_P1(BITN0);
D_stdIO_P1(BITN1);
D_stdIO_P5(BITN2);
L2_OID_WIFI_Open();
}
void L2_OID_WIFI_Open()
{
D_P52_OFF();
}
void L2_OID_WIFI_Close()
{
D_P52_ON();
}

10
source/bsp/bsp_wifi.h

@ -0,0 +1,10 @@
#ifndef BSP_WIFI_H
#define BSP_WIFI_H
#include "bsp_config.h"
extern void L2_Wifi_init();
extern void L2_OID_WIFI_Close();
extern void L2_OID_WIFI_Open();
#endif

15
source/bsp/chipid.c

@ -11,8 +11,9 @@
//////////////////////////////////////////////////////////////////////////////
#include "chipid.h"
#include "../bsp/bsp_config.h"
#include "../app/app_config.h"
#define MSP_ID_LEN 7
// #define MSP_ID_LEN 7
void L0_id_get(U8 *id)
{
@ -27,13 +28,23 @@ void L0_id_get(U8 *id)
void L0_id_get_rom(U8 *id)
{
U8 i = 0;
char *ID = (char code *)(D_MCU_SPEC_PARAM_CHIPID);
char *ID = (char code *)(D_MCU_SPEC_PARAM_ID_IN_ROM);
for(i=0;i<MSP_ID_LEN;i++)
{
id[i] = ID[i];
}
}
void L0_id_get_chipid()
{
U8 i = 0;
//使能访问XFR
P_SW2 |= 0x80;
for(i=0;i<MSP_ID_LEN;i++)
{
G.mcu_id[i] = ID_ADDR_IN_CHIPID[i];
}
}
#if 1
void L0_id_main(void)

1
source/bsp/chipid.h

@ -32,6 +32,7 @@
extern void L0_id_get(U8 *id);
extern void L0_id_get_rom(U8 *id);
extern void L0_id_main(void);
extern void L0_id_get_chipid(void);
#endif// #ifndef _msp_eeprom_H_

6
source/clib/bit.h

@ -351,12 +351,16 @@
#define BITN_1(X,BITNx) (X)|= (BITNx)
#define BITN_0(X,BITNx) (X)&=~(BITNx)
#define BITN_G(X,BITNx) ((X)&(BITNx))
#define BITN_M(X,mask) (X)&=(mask)
#define BITN_S(X,BITNx,mask) BITN_M(X,mask);BITN_1(X,BITNx)///设置类似通道之类的多位操作
//BITN_1(reg,BITN0)
#define BITS_1(X,BITx) (X)|= (BITx)
#define BITS_0(X,BITx) (X)&=~(BITx)
#define BITC_1 0X01
#define BITC_2 0X03
#define BITC_3 0X07

14
source/clib/clib.c

@ -13,9 +13,17 @@
#include "type.h"
#include "clib.h"
#include "../msp/uart0.h"
#include "../msp/time.h"
//#include "../msp/time.h"
U8 Lc_strcmp(U8 *s1,U8 *s2)
{
while(*s1 != 0 && *s2 != 0 && *s1 == *s2)
{
s1++;
s2++;
}
return *s1 - *s2;
}
U8 Lc_strStartsWith(U8 *s1,U8 *s2)
{
while(*s1 && *s2)
@ -291,7 +299,7 @@ int hexToDec(const char *source)
}
long hex2Dec(U8 *source ,U16 len)
{
int i,t,m;
int i,t;
long sum=0;
for(i=0;i<len;i++)
{

1
source/clib/clib.h

@ -122,6 +122,7 @@ extern U32 Lc_vS32_media(U32 *d, U8 n);
extern int Lc_memset(U8 *buf,U8 c,U16 len);
extern void Lc_buf_copy_uc(U8 *dst,U8 *src,U16 len);
extern U8 Lc_strStartsWith(U8 *s1,U8 *s2);
extern U8 Lc_strcmp(U8 *s1,U8 *s2);
void Lc_memset8bits (void *s,unsigned char c,unsigned char n);

1401
source/clib/stdio.h

File diff suppressed because it is too large

2
source/ctask/time.c

@ -40,7 +40,7 @@ void timer0_isrHandle (void) D_SERVE_TIMER0
L1_tick_tick(); ///系统中的1sflag 和以10ms为颗粒的延时使用 为tdelay服务
Key_Scan();
// Key_Scan();
//串口回调
for(i = 0; i < SERIAL_MAX_NUM; i++)

2
source/msp/UART0.C

@ -33,7 +33,7 @@ void L0_uart0_buf_init(void)
ts_uart[uNum0].r.overtime_t = 0;
//定义接收处理协议
ts_uart[uNum0].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum0].tp_handler = NULL;
ts_uart[uNum0].uartx = uNum0;
//串口初始化

4
source/msp/UART2.c

@ -51,6 +51,10 @@ void L0_uart2_buf_init(void)
// D_UART2_485_RX()
}
/*************************************************
UART
*************************************************/

3
source/msp/UART3.c

@ -40,7 +40,8 @@ void L0_uart3_buf_init(void)
ts_uart[uNum3].r.overtime_t = 0;
//串口协议解析专用字段
ts_uart[uNum3].tp_handler = L0_uartN_overtime_callback;
// ts_uart[uNum3].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum3].tp_handler = NULL;
ts_uart[uNum3].uartx = uNum3;
//串口初始化

2
source/msp/UART4.C

@ -49,7 +49,7 @@ void L0_uart4_buf_init(void)
ts_uart[uNum4].r.overtime_t = 0;
//串口协议解析专用字段
ts_uart[uNum4].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum4].tp_handler = NULL;
ts_uart[uNum4].uartx = uNum4;
//串口初始化

17
source/msp/UARTX.h

@ -13,16 +13,17 @@
#define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t)))
/////可以依据实际使用独立定制
#define D_send1_max 64
#define D_send2_max 64
#define D_send3_max 128
#define D_send4_max 64
// #define D_send1_max 64
#define D_send1_max 32
#define D_send2_max 32
#define D_send3_max 32
#define D_send4_max 32
/////可以依据实际使用独立定制
#define D_recv1_max 64
#define D_recv2_max 64
#define D_recv3_max 128
#define D_recv4_max 64
#define D_recv1_max 32
#define D_recv2_max 128
#define D_recv3_max 32
#define D_recv4_max 32
typedef struct
{

226
source/msp/msp_adc.c

@ -0,0 +1,226 @@
#include "../msp/msp_adc.h"
#include "../msp/uart0.h"
#include <stdio.h>
void L0_ADC_init(void)
{
P0M0 = 0x00;
P0M1 = 0x10; //设置P0.4为ADC口
ADC_CONTR = 0;
D_ADC_POWER_ON(); //打开ADC电源
// D_ADC_average();
// D_EN_EREG();
///CSSETUP:ADC 通道选择时间控制 CSHOLD[1:0]:ADC 通道选择保持时间控制//22M
///SMPDUTY[4:0]:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置小于 01010B)
ADCTIM = B1010_0000|B0000_1111;
ADCCFG = B0010_0000|4; //SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)}
Lc_delay_ms(1); //给MCU的内部ADC模块电源打开后,需等待约1ms,等MCU内部的ADC电源稳定后再让ADC工作
D_ADC_CH(D_ADC_CH_12); //选择ADC12(P04)
D_ADC_START();
}
U16 L1_ADC_Read(u8 CHA)
{
vU16 adc_data;
vU32 overtimes;
int *BGV; //内部1.19V参考信号源值存放在idata中
//idata的EFH地址存放高字节
//idata的F0H地址存放低字节
BGV = (int idata *)0xef;
//vcc = (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压
//注意,此电压的单位为毫伏(mV)
D_ADC_CH(CHA);
D_ADC_START();
// NOP2();
NOP();
NOP();
// BITN_S(ADCEXCFG,)
// while(1 == D_ADC_OVER())
// {
// if(overtimes++ > 600000)////
// {
// // printf2("\r\n !3A%x W%x\t",(int)ADC_CONTR,(int)CHA);
// L0_uart0_sendstr("ADC_CONTR = ");
// L0_uart0_ushex(ADC_CONTR);
// L0_uart0_0d0a();
// L0_uart0_sendstr("CHA = ");
// L0_uart0_ushex(CHA);
// return 0;/// !3Ac7 W7 291
// }
// }
D_ADC_CLEARFLAG();
adc_data = ADC_RES;
adc_data <<= 8;
adc_data |= ADC_RESL;
///adc_data >>= 3;
///r = adc_data;
return adc_data;
}
//平均值滤波
U16 ADC_Average_Filter(U8 N)
{
U16 sum = 0;
U16 Aver = 0;
U8 i;
U16 arr[10] = 0;
FP32 Variance = 0;
// 平均值
for(i = 0; i < N; i++)
{
arr[i] = L1_ADC_Read(12);
sum += L1_ADC_Read(12);
}
Aver = sum/N;
for (i = 0; i < N; i++)
{
L0_uart0_ushex(arr[i]);
L0_uart0_0d0a();
}
// 方差
for(i = 0; i < N; i++)
{
Variance += (arr[i] - Aver) * (arr[i] - Aver);
}
Variance /= N;
// printf("%.7f", Variance);
return Aver;
}
#if 0
U16 L1_ADC_Read(u8 CHA)
{
vU16 adc_data;
ADC_CONTR &=0xF8;
ADC_CONTR |=0x40;//启动AD转换
//ADC_CONTR |= CHA;
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = (ADC_CONTR & 0xF0) | CHA;
NOP();
NOP();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清标志
adc_data = ADC_RES;
adc_data <<= 8;
adc_data |= ADC_RESL;
//adc_data = adc_data<<2;
//adc_data = ADC_RESL & 0X03;
//adc_data = adc_data | adc_data;
///L0_uart1_sendstr("ADC:");
///L0_uart1_ushex(adc_data);
///L0_uart1_0d0a();
return (adc_data); //返回A/D转换结果(8位)
}
///D_cmd_filter_adc L3_ADC_debug(D_cmd_filter_adc)
void L3_ADC_debug(u8 filter)
{
u8 i;
if(filter == Ts_debug.td->filter)
{///filter num d1 d2 d3 ....dn
//// FD 08 11 22 33 44 55 66 77 88
L1_uartD_uchexArray(Ts_debug.td,Ts_debug.td->R1);
if(0x10 == Ts_debug.td->ocr)///read 读,判断哪个adc读取
{//fa 05 f1 33 10
//NUM: 0 1 2 3 4
// Fx R1 R2 R3 ocr
// sla reg1 num
/// f1 32 15 06 10
//printf("\r\n ch(%d)=",(int)Ts_debug.td->R2);
for(i = 0xf1;i <= 0xf8;i++)
{
Ts_debug.au16 = L1_ADC_Read_PT(i);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc1
}
/*
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf2);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc2
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf3);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc3
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf4);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc4
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf5 );
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc5
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf6);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc6
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf7);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc7
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf8);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc8
*/
}
else if(0x11 == Ts_debug.td->ocr)
{
//printf("\r\n ch(%d)=",(int)Ts_debug.td->R1);
//Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1);
}
else if(0x12 == Ts_debug.td->ocr)
{
}
else
{
//printf"(\r\n ch(%d)=",(int)Ts_debug.td->R1);
//Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1);
}
}
}
U16 L1_ADC_Read_VBAT (unsigned char CHA)//CHA通道号
{
U16 adc_data;
#if 0
U8 AD_FIN=0; //存储A/D转换标志
//CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置
Lc_delay_nop(1);
//ADC_CONTR |= CHA; //选择A/D当前通道
//Lc_delay_nop(1);
ADC_CONTR |= 0x80; //启动A/D电源
Lc_delay_ms(1); //使输入电压达到稳定(1ms即可)
ADC_CFG = 0x20;
Lc_delay_nop(1);
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
//ADC_CONTR |= CHA; //选择A/D当前通道
ADC_CONTR = (ADC_CONTR & 0xF0) | CHA;
Lc_delay_nop(1);
ADC_CONTR |= 0x40; //启动AD转换
NOP();
NOP();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
//P2 = ADC_RES; //读取ADC结果
#endif
ADC_CONTR &=0xF8;
ADC_CONTR |=0x40;//启动AD转换
//ADC_CONTR |= CHA;
ADC_CONTR = (ADC_CONTR & 0xF0) | CHA;
NOP();
NOP();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清标志
adc_data = ADC_RES;
adc_data <<= 8;
adc_data |= ADC_RESL;
//adc_data = adc_data<<2;
//adc_data = ADC_RESL & 0X03;
//adc_data = adc_data | adc_data;
//L0_uart0_ushex(adc_data);
//L0_uart0_0d0a();
return (adc_data); //返回A/D转换结果(8位)
}
#endif

63
source/msp/msp_adc.h

@ -0,0 +1,63 @@
#ifndef _msp_adc_H_
#define _msp_adc_H_
#include "../bsp/bsp_config.h"
#include "../msp/UART0.h"
#include "../cpu/STC_stc8h3k.H"
#include "../clib/bit.h"
#define ADC_POWER BITN7
#define ADC_START BITN6
#define ADC_FLAG BITN5
#define ADC_EPWMT BITN4
#define D_ADC_CHS_mask 0xF0
#define ADC_CHS3 BITN3
#define ADC_CHS2 BITN2
#define ADC_CHS1 BITN1
#define ADC_CHS0 BITN0
#define ADC_RESFMT BITN5
#define ADC_SPEED3 BITN3
#define ADC_SPEED2 BITN2
#define ADC_SPEED1 BITN1
#define ADC_SPEED0 BITN0
#define D_CVTIMESEL_mask 0xF8
#define D_CVTIMESEL_1 0
#define D_CVTIMESEL_2 4
#define D_CVTIMESEL_4 5
#define D_CVTIMESEL_8 6
#define D_CVTIMESEL_16 7
#define D_ADC_average() D_EN_EREG(); BITN_S(ADCEXCFG,D_CVTIMESEL_16,D_CVTIMESEL_mask)////4 22M 1ms---
#define D_ADC_POWER_ON() BITN_1(ADC_CONTR, ADC_POWER)
#define D_ADC_POWER_OFF() BITN_0(ADC_CONTR, ADC_POWER)
#define D_ADC_START() BITN_1(ADC_CONTR, ADC_START)
#define D_ADC_STOP() BITN_0(ADC_CONTR, ADC_START)
#define D_ADC_OVER() BITN_G(ADC_CONTR, ADC_FLAG)
#define D_ADC_CLEARFLAG() BITN_0(ADC_CONTR, ADC_FLAG)
#define D_ADC_CH(X) BITN_S(ADC_CONTR,X,D_ADC_CHS_mask)
#define D_ADC_CH_12 12
#define D_cmd_filter_adc 0xfa
extern void L0_ADC_init (void);
extern U16 L1_ADC_Read(u8 CHA);
#endif //#ifndef _msp_adc_H_

2
source/msp/msp_eeprom.c

@ -28,7 +28,7 @@ fixme:注意时钟和flash 相关 同时关注掉电和容错
#include "msp_eeprom.h"
#include "debug_drv.h"
//#include "debug_drv.h"
#if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F)
xxx

4
source/msp/msp_eeprom.h

@ -18,8 +18,8 @@
#ifndef _msp_eeprom_H_
#define _msp_eeprom_H_
#include "c_type51.h"
#include "c_lib.h"
//#include "c_type51.h"
//#include "c_lib.h"
///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Loading…
Cancel
Save