u_app_handler.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. #include "u_app_handler.h"
  2. #include "u_main.h"
  3. #include "u_time.h"
  4. #include "u_ble.h"
  5. #include "u_light_ctrl.h"
  6. #include "u_effect_normal.h"
  7. #include "u_effect_color.h"
  8. #include "u_effect_rhythm.h"
  9. #include "user_driver.h"
  10. #include "LH_TaskManager.h"
  11. uint32_t m_clr_play_buff[APP_MODE_CLR_MAX_NUM] = {0x00};
  12. void light_state_upload(void) //回发灯的状态给app
  13. {
  14. uint8_t upload_buff[14] = {0};
  15. if(g_light_para.power_st == GLO_EN) //灯当前是否开关
  16. {
  17. upload_buff[0] = 1;
  18. }
  19. else
  20. {
  21. upload_buff[0] = 0;
  22. }
  23. if (g_light_para.app_mode[0] >= LIGHT_APP_MODE_RC_MIN)
  24. {
  25. upload_buff[1] = LIGHT_APP_MODE_COLORUR;
  26. }
  27. else
  28. {
  29. upload_buff[1] = g_light_para.app_mode[0]; //灯当前的模式
  30. upload_buff[2] = g_light_para.app_mode[1];
  31. }
  32. upload_buff[3] = g_light_para.bright; //灯当前的亮度
  33. upload_buff[4] = g_light_para.app_speed;//灯速度
  34. upload_buff[5] = 100 - g_light_para.rhythm_sensit * APP_SENSIT_K;
  35. upload_buff[6] = g_light_para.clr_temp[0];
  36. upload_buff[7] = g_light_para.clr_temp[1];
  37. upload_buff[8] = g_light_para.clr_temp[2];
  38. upload_buff[9] = g_light_para.clr_temp[3];
  39. upload_buff[10] = g_light_para.rgb_order[0];
  40. upload_buff[11] = g_light_para.rgb_order[1];
  41. upload_buff[12] = g_light_para.rgb_order[2];
  42. upload_buff[13] = 0x00;
  43. //UART_PRINTF("user_send_light_state %d %d %d\r\n",Rgb_Para.color_arr[10],Rgb_Para.color_arr[11],Rgb_Para.color_arr[12]);
  44. reply_app_encode(0x10, upload_buff, 14);
  45. }
  46. static void app_light_colour_enter(const uint32_t *static_clr, uint8_t static_bright)
  47. {
  48. u_rhythm_timer_ctrl(GLO_DIS);
  49. light_mode_static_cfg(&g_light_info, static_clr, static_bright);
  50. }
  51. static void app_rhythm_enter(uint8_t *app_mode)
  52. {
  53. if (app_mode[0] == APP_RHYTHM_MODE_MUSIC)
  54. {
  55. light_rhythm_enter(RHYTHM_MODE_GRADUAL_7);
  56. }
  57. else
  58. {
  59. switch (app_mode[1])
  60. {
  61. case APP_RHYTHM_MODE_FADE3:
  62. {
  63. light_rhythm_enter(RHYTHM_MODE_FADE_3);
  64. }
  65. break;
  66. case APP_RHYTHM_MODE_FADE7:
  67. {
  68. light_rhythm_enter(RHYTHM_MODE_FADE_7);
  69. }
  70. break;
  71. case APP_RHYTHM_MODE_JUMP3:
  72. {
  73. light_rhythm_enter(RHYTHM_MODE_JUMP_3);
  74. }
  75. break;
  76. case APP_RHYTHM_MODE_JUMP7:
  77. {
  78. light_rhythm_enter(RHYTHM_MODE_JUMP_7);
  79. }
  80. break;
  81. }
  82. }
  83. }
  84. void light_mode_set(uint8_t *app_mode)
  85. {
  86. memcpy(g_light_para.app_mode, app_mode, 2);
  87. switch (g_light_para.app_mode[0])
  88. {
  89. case LIGHT_APP_MODE_WHITE_LIGHT:
  90. case LIGHT_APP_MODE_COLORUR:
  91. {
  92. clr_format_transition(CLR_TS_TYPE_8_32, 1, g_light_para.clr_temp, m_clr_play_buff);
  93. app_light_colour_enter(m_clr_play_buff, g_light_para.bright);
  94. }
  95. break;
  96. case LIGHT_APP_MODE_S_RED:
  97. case LIGHT_APP_MODE_S_BLUE:
  98. case LIGHT_APP_MODE_S_GREEN:
  99. case LIGHT_APP_MODE_S_CYAN:
  100. case LIGHT_APP_MODE_S_YELLOW:
  101. case LIGHT_APP_MODE_S_PURPLE:
  102. case LIGHT_APP_MODE_S_WHITE:
  103. {
  104. uint8_t clr_ind = g_light_para.app_mode[0] - LIGHT_APP_MODE_S_RED;
  105. light_mode_static_cfg(&g_light_info, &app_static_clr[clr_ind], g_light_para.bright);
  106. }
  107. break;
  108. case LIGHT_APP_MODE_JUMP_3:
  109. {
  110. light_mode_jump_cfg(&g_light_info, base_clr, 3, g_light_para.speed, g_light_para.bright);
  111. }
  112. break;
  113. case LIGHT_APP_MODE_JUMP_7:
  114. {
  115. light_mode_jump_cfg(&g_light_info, base_clr, 7, g_light_para.speed, g_light_para.bright);
  116. }
  117. break;
  118. case LIGHT_APP_MODE_FADE_3:
  119. {
  120. light_mode_gradual_cfg(&g_light_info, base_clr, 3, g_light_para.speed, g_light_para.bright);
  121. }
  122. break;
  123. case LIGHT_APP_MODE_FADE_7:
  124. {
  125. light_mode_gradual_cfg(&g_light_info, base_clr, 7, g_light_para.speed, g_light_para.bright);
  126. }
  127. break;
  128. case LIGHT_APP_MODE_BREATH_RED:
  129. case LIGHT_APP_MODE_BREATH_BLUE:
  130. case LIGHT_APP_MODE_BREATH_GREEN:
  131. case LIGHT_APP_MODE_BREATH_YELLOW:
  132. case LIGHT_APP_MODE_BREATH_CYAN:
  133. case LIGHT_APP_MODE_BREATH_PURPLE:
  134. case LIGHT_APP_MODE_BREATH_WHITE:
  135. {
  136. uint8_t clr_ind = g_light_para.app_mode[0] - LIGHT_APP_MODE_BREATH_RED;
  137. light_mode_breath_cfg(&g_light_info, &base_clr[clr_ind], 1, g_light_para.speed, g_light_para.bright);
  138. }
  139. break;
  140. case LIGHT_APP_MODE_FADE_RG:
  141. {
  142. light_mode_gradual_cfg(&g_light_info, base_clr, 2, g_light_para.speed, g_light_para.bright);
  143. }
  144. break;
  145. case LIGHT_APP_MODE_FADE_RB:
  146. {
  147. light_mode_gradual_cfg(&g_light_info, app_static_clr, 2, g_light_para.speed, g_light_para.bright);
  148. }
  149. break;
  150. case LIGHT_APP_MODE_FADE_GB:
  151. {
  152. light_mode_gradual_cfg(&g_light_info, &base_clr[1], 2, g_light_para.speed, g_light_para.bright);
  153. }
  154. break;
  155. case LIGHT_APP_MODE_BLINK_7:
  156. {
  157. light_mode_blink_cfg(&g_light_info, base_clr, 7, 5, g_light_para.speed, g_light_para.bright);
  158. }
  159. break;
  160. case LIGHT_APP_MODE_BLINK_RED:
  161. case LIGHT_APP_MODE_BLINK_GREEN:
  162. case LIGHT_APP_MODE_BLINK_BLUE:
  163. case LIGHT_APP_MODE_BLINK_YELLOW:
  164. case LIGHT_APP_MODE_BLINK_CYAN:
  165. case LIGHT_APP_MODE_BLINK_PURPLE:
  166. case LIGHT_APP_MODE_BLINK_WHITE:
  167. {
  168. uint8_t clr_ind = g_light_para.app_mode[0] - LIGHT_APP_MODE_BLINK_RED;
  169. light_mode_blink_cfg(&g_light_info, &base_clr[clr_ind], 1, 5, g_light_para.speed, g_light_para.bright);
  170. }
  171. break;
  172. case LIGHT_APP_MODE_RHYTHM_APP:
  173. case LIGHT_APP_MODE_RHYTHM_MUSIC:
  174. {
  175. app_rhythm_enter(app_mode);
  176. }
  177. break;
  178. }
  179. }
  180. static void app_mode_enter(uint8_t *app_mode)
  181. {
  182. light_mode_set(app_mode);
  183. }
  184. void reply_app_encode(uint8_t cmd, uint8_t *data, uint8_t len) //回发app解码数据
  185. {
  186. static uint8_t send[64]={0};
  187. uint8_t i;
  188. uint16_t crc;
  189. send[0] = 0xA1;
  190. send[1] = cmd;
  191. send[2] = len + 3;
  192. for(i = 0; i<len; i++)
  193. {
  194. send[3+i] = data[i];
  195. }
  196. crc = crc_16(send, len +3);
  197. send[3+len] = crc & 0xff;
  198. send[4+len] = crc >> 8;
  199. //UART_PRINTF("crc: %x\r\n", crc);
  200. #if 1
  201. U_UART_PRINTF("\r\ntx:");
  202. for(i = 0; i < len + 5; i++)
  203. {
  204. U_UART_PRINTF("%02X ", send[i]);
  205. }
  206. U_UART_PRINTF("\r\n");
  207. #endif
  208. u_ble_data_send(send, len + 5);
  209. }
  210. int PrintfOut(void)
  211. {
  212. U_UART_PRINTF("\r\nTimer is:%d %d\r\n",sys_time_handle.get_run_ticks(),g_light_para.rebootCnt);
  213. }
  214. //app下发数据的处理函数
  215. void decode_app_cmd(uint8_t cmd, uint8_t *data, uint8_t len)
  216. {
  217. static uint8_t xx = 0, yy = 0;
  218. uint8_t reply_state;
  219. #if 0
  220. //UART_PRINTF("app cmd: 0x%x, %d\r\n", cmd, len);
  221. UART_PRINTF("app cmd: %02x, %02x %02x\r\n",data[0],data[1],data[2]);
  222. #endif
  223. switch(cmd)
  224. {
  225. case 0x00: //握手指令
  226. {
  227. if(memcmp(&data[0], "CCHIP", 5) == 0)
  228. {
  229. uint8_t str[7] = "CCHIP";
  230. xx = HW_Get_Native_Clk_Avoid_Race() % 8;
  231. yy = HW_Get_Native_Clk_Avoid_Race() /100 % 8;
  232. str[5] = xx;
  233. str[6] = yy;
  234. reply_app_encode(0x00, str, 7);
  235. U_UART_PRINTF("check device1: %02x,%02x\r\n", xx, yy);
  236. }
  237. }
  238. break;
  239. case 0x01: //握手指令
  240. {
  241. if(memcmp(&data[0], "CCHIP", 5) == 0)
  242. {
  243. uint8_t send[6] = "CCHIP";
  244. U_UART_PRINTF("check device2: %02x,%02x, %02x,%02x\r\n", (xx^36),data[5],(yy^63+13)&0xff,data[6]);
  245. if((((xx^36) &0xff) == data[5]) && (((yy^63+13) &0xff) == data[6]))
  246. {
  247. send[5] = 0x00;
  248. reply_app_encode(0x01, send, 6);
  249. //user_connect();
  250. U_UART_PRINTF("check ok\r\n");
  251. }
  252. else
  253. {
  254. send[5] = 0x01;
  255. reply_app_encode(0x01, send, 6);
  256. U_UART_PRINTF("check error\r\n");
  257. }
  258. }
  259. }
  260. break;
  261. case 0x10: //读取灯属性的指令
  262. {
  263. light_state_upload();
  264. }
  265. break;
  266. case 0x11: //设置灯开关的指令
  267. {
  268. U_UART_PRINTF("light_power_st = %d\r\n", data[0]);
  269. light_power_set(data[0]);
  270. reply_state = 1;
  271. reply_app_encode(cmd, &reply_state, 1);
  272. }
  273. break;
  274. case 0x12: //设置灯模式
  275. {
  276. reply_state = 1;
  277. reply_app_encode(cmd, &reply_state, 1);
  278. U_UART_PRINTF("\r\n app_mode = %X, app_effect = %X\r\n",data[0], data[1]);
  279. app_mode_enter(data);
  280. light_power_set(g_light_para.power_st);
  281. }
  282. break;
  283. case 0x13: //设置灯亮度
  284. {
  285. //data[0] bright
  286. light_bright_ctrl(data[0]);
  287. reply_state = 1;
  288. reply_app_encode(cmd, &reply_state, 1);
  289. }
  290. break;
  291. case 0x15: //设置灯颜色
  292. {
  293. memcpy(g_light_para.clr_temp, &data[0], 4);
  294. reply_state = 0x01;
  295. reply_app_encode(cmd, &reply_state, 1);
  296. clr_format_transition(CLR_TS_TYPE_8_32, 1, g_light_para.clr_temp, m_clr_play_buff);
  297. app_light_colour_enter(m_clr_play_buff, g_light_para.bright);
  298. g_light_para.app_mode[0] = LIGHT_APP_MODE_COLORUR;
  299. light_power_set(g_light_para.power_st);
  300. }
  301. break;
  302. case 0x16: //设置灯速度
  303. {
  304. //data[0] speed
  305. light_speed_ctrl(data[0]);
  306. reply_state = 1;
  307. reply_app_encode(cmd, &reply_state, 1);
  308. }
  309. break;
  310. case 0x17: //设置律动灵敏度
  311. {
  312. rhythm_sensit_ctrl(NULL, data[0]);
  313. reply_state = 1;
  314. reply_app_encode(cmd, &reply_state, 1);
  315. }
  316. break;
  317. case 0x18: //设置RGB线序
  318. {
  319. memcpy(g_light_para.rgb_order, data, 3);
  320. rgb_line_order_check();
  321. light_power_set(g_light_para.power_st);
  322. reply_state = 1;
  323. reply_app_encode(cmd, &reply_state, 1);
  324. }
  325. break;
  326. case 0x19: //设置白光
  327. {
  328. reply_state = 1;
  329. reply_app_encode(cmd, &reply_state, 1);
  330. }
  331. break;
  332. case 0x1A: //设置律动 颜色&亮度
  333. {
  334. }
  335. break;
  336. case 0x20: //白光颜色&色温
  337. {
  338. memcpy(g_light_para.clr_temp, data, 4);
  339. reply_state = 1;
  340. reply_app_encode(cmd, &reply_state, 1);
  341. clr_format_transition(CLR_TS_TYPE_8_32, 1, g_light_para.clr_temp, m_clr_play_buff);
  342. app_light_colour_enter(m_clr_play_buff, g_light_para.bright);
  343. g_light_para.app_mode[0] = LIGHT_APP_MODE_COLORUR;
  344. }
  345. break;
  346. case 0x21: //律动开始&暂停
  347. {
  348. u_rhythm_timer_ctrl(data[0]);
  349. reply_state = 1;
  350. reply_app_encode(cmd, &reply_state, 1);
  351. }
  352. break;
  353. case 0x28: //读取设置
  354. {
  355. uint8_t reply_buff[2] = {0x00};
  356. reply_buff[0] = g_light_para.app_seting >> 4;
  357. reply_buff[1] = g_light_para.app_seting & 0x0F;
  358. reply_app_encode(cmd, reply_buff, 2);
  359. }
  360. break;
  361. case 0x29: //设置连接状态
  362. {
  363. g_light_para.app_seting = (data[0] << 4) | (g_light_para.app_seting & 0x0F);
  364. reply_state = 0x01;
  365. reply_app_encode(cmd, &reply_state, 1);
  366. }
  367. break;
  368. case 0x2A: //设置断开状态
  369. {
  370. g_light_para.app_seting = (g_light_para.app_seting & 0xF0) | (data[0] & 0x0F);
  371. reply_state = 0x01;
  372. reply_app_encode(cmd, &reply_state, 1);
  373. }
  374. break;
  375. case 0x31: //同步当前的时间
  376. {
  377. time_app_driver_sync(data);
  378. reply_state = 1;
  379. reply_app_encode(cmd, &reply_state, 1);
  380. }
  381. break;
  382. case 0x34: //闹钟的设置
  383. {
  384. time_alarm_set(data);
  385. reply_state = 1;
  386. reply_app_encode(cmd, &reply_state, 1);
  387. }
  388. break;
  389. case 0x35: //读取闹钟的状态
  390. {
  391. uint8_t reply_len = 0, alarm_st[24] = {0x00};
  392. time_alarm_state_query(alarm_st, &reply_len);
  393. reply_app_encode(cmd, alarm_st, reply_len);
  394. }
  395. break;
  396. case 0x51: //律动值
  397. {
  398. app_rhythm_val_up(data[0]);
  399. reply_state = 1;
  400. reply_app_encode(cmd, &reply_state, 1);
  401. }
  402. break;
  403. case 0x41: //读取版本号
  404. {
  405. uint8_t temp[] = "1.1.1";
  406. reply_app_encode(0x41, temp, sizeof(temp) - 1);
  407. }
  408. break;
  409. case 0xFD:
  410. {
  411. g_light_para.rebootCnt=0;
  412. U_UART_PRINTF("\r\nErase save Count \r\n");
  413. light_info_save();
  414. }
  415. break;
  416. case 0xFE:
  417. {
  418. U_UART_PRINTF("\r\nTimer_Start\r\n");
  419. UserTimerTask_Create(PrintfOut,2000);
  420. }
  421. break;
  422. }
  423. light_info_save_set();//设置保存标志位
  424. }