main.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #include <stdarg.h>
  2. #include "yc11xx.h"
  3. #include "yc11xx_uart.h"
  4. #include "yc11xx_gpio.h"
  5. #include "yc_timer.h"
  6. #include "ipc.h"
  7. #include "yc_lpm.h"
  8. #include "system.h"
  9. #include "yc11xx_bt_interface.h"
  10. #include "att.h"
  11. #include "core_cm0.h"
  12. #include "yc11xx_pwm.h"
  13. #include "user_driver.h"
  14. #include "Drv_adc.h"
  15. #include "yc11xx_gpio.h"
  16. #include "yc11xx_qspi.h"
  17. #include "LH_TaskManager.h"
  18. #include "u_main.h"
  19. #include "yc11xx_wdt.h"
  20. #include "user_driver.h"
  21. #include "u_main.h"
  22. #include "u_ble.h"
  23. #include "drv_ota.h"
  24. #define LED_GPIO 28
  25. #define adv_len 30
  26. BleRecv_t BleRecDataMsg;
  27. static uint8_t UrataReDataIndex = 0x00;
  28. void Bt_NecCallBack(uint8_t len,uint8_t *dataPtr);
  29. #define IO_TXA 6 //暂时没有用到 定义一个没有硬件的io
  30. #define IO_RXA 20 //暂时没有用到 定义一个没有硬件的io
  31. #define IO_TXB 31
  32. #define IO_RXB 14
  33. #define UARTBUFSIZE 256
  34. volatile uint32_t UserCnt=0;
  35. BLE_STATE gBLEState;
  36. void Bt_init()
  37. {
  38. gBLEState.topState = BLE_IDLE;
  39. gBLEState.secondState = BLE_IDLE;
  40. }
  41. void Bt_setBLEState(uint8_t inState)
  42. {
  43. switch (inState){
  44. case BLE_IDLE:
  45. case BLE_ADV:
  46. case BLE_CONNECTED:
  47. case BLE_CONNECTING:
  48. case BLE_DIRECT_ADV:
  49. case BLE_PAIRED:
  50. gBLEState.topState = inState;
  51. default:
  52. break;
  53. }
  54. }
  55. void BT_OTA_Sleep_func(int i){
  56. Lpm_unLockLpm(OTA_UPDATE_FLAG);
  57. }
  58. void Bt_lpm_enable(int none){
  59. Lpm_unLockLpm(CONNECT_WAKE_FLAG);
  60. }
  61. void Bt_StartAdv(int time_10ms,uint16_t gap){
  62. Bt_setBLEState(BLE_ADV);
  63. Bt_SetLeAdvInterval(gap);//设置广播间隔
  64. Lpm_Set_Interval(gap);
  65. Bt_SndCmdLeStartAdv();
  66. }
  67. void Bt_EvtCallBack(uint8_t len,uint8_t *dataPtr)
  68. {
  69. BLE_Conn_param Ble_Conn_Param;
  70. switch(*dataPtr)
  71. {
  72. case IPC_EVT_LE_DISCONNECTED: //断连
  73. u_gapc_disconnect_cd(IPC_EVT_LE_DISCONNECTED);
  74. gBLEState.topState = BLE_IDLE;
  75. Bt_CONNECTED_State=0;
  76. #ifdef DEBUG_DRV_BT
  77. MyPrintf("\r\n***************IPC_EVT_LE_DISCONNECTED***************\r\n");
  78. #endif
  79. Bt_StartAdv(60,0x80);
  80. break;
  81. case IPC_EVT_LE_CONNECTED: //连接
  82. Bt_CONNECTED_State=1;
  83. IPC_TxControlCmd(IPC_CMD_UPDATE_CONN);
  84. //SYS_ReleaseTimer(&gAdv_Timer);
  85. Bt_SndCmdLeUpdateAttMTU();
  86. u_gapc_connection_cd();
  87. Lpm_unLockLpm(ADV_FLAG);
  88. Lpm_LockLpm(CONNECT_WAKE_FLAG);
  89. Bt_setBLEState(BLE_CONNECTED);
  90. UserTimerTask_Create((void*)Bt_lpm_enable,400);
  91. //SYS_SetTimer(&gConnect_Timer,400,TIMER_SINGLE|TIMER_TYPE_BIT,Bt_lpm_enable);
  92. #ifdef DEBUG_DRV_BT
  93. MyPrintf("\r\n***************IPC_EVT_LE_CONNECTED***************\r\n");
  94. #endif
  95. break;
  96. case IPC_EVT_BB_CONNECTED:
  97. #ifdef DEBUG_DRV_BT
  98. MyPrintf("\r\n****************IPC_EVT_BB_CONNECTED*****************\r\n");
  99. #endif
  100. break;
  101. case IPC_EVT_SETUP_COMPLETE:
  102. #ifdef DEBUG_DRV_BT
  103. MyPrintf("\r\n****************IPC_EVT_SETUP_COMPLETE*****************\r\n");
  104. #endif
  105. break;
  106. case IPC_EVT_BT_PAIRING_SUCCESS:
  107. #ifdef DEBUG_DRV_BT
  108. MyPrintf("\r\n****************IPC_EVT_BT_PAIRING_SUCCESS*****************\r\n");
  109. #endif
  110. break;
  111. case IPC_EVT_LINKKEY_GENERATE:
  112. #ifdef DEBUG_DRV_BT
  113. MyPrintf("\r\n****************IPC_EVT_LINKKEY_GENERATE*****************\r\n");
  114. #endif
  115. break;
  116. case IPC_EVT_RESET: //上电
  117. #ifdef DEBUG_DRV_BT
  118. MyPrintf("\r\n****************IPC_EVT_RESET*****************\r\n");
  119. #endif
  120. break;
  121. case IPC_EVT_WAKEUP: //唤醒
  122. #ifdef DEBUG_DRV_BT
  123. MyPrintf("\r\n****************IPC_EVT_WAKEUP*****************\r\n");
  124. #endif
  125. OS_EXIT_CRITICAL();
  126. break;
  127. case IPC_EVT_LE_TK_GENERATE:
  128. #ifdef DEBUG_DRV_BT
  129. MyPrintf("\r\n****************IPC_EVT_LE_TK_GENERATE*****************\r\n");
  130. #endif
  131. break;
  132. case IPC_EVT_LE_DISCONNECTED_ABNORMAL:
  133. #ifdef DEBUG_DRV_BT
  134. MyPrintf("\r\n******************IPC_EVT_LE_DISCONNECTED_ABNORMAL******************\r\n");
  135. #endif
  136. break;
  137. default:
  138. break;
  139. }
  140. return;
  141. }
  142. #define ATT_WRITE_REQUEST 0x12
  143. #define ATT_PREPARE_WRITE_REQUEST 0x16
  144. #define ATT_WRITE_COMMAND 0X52
  145. void Bt_SndWriteResponse()
  146. {
  147. IPC_TxControlCmd(IPC_CMD_SEND_WRITE_RESPONSE);
  148. }
  149. void Bt_BleCallBack(uint8_t len,uint8_t *dataPtr)
  150. {
  151. uint16_t handle;
  152. uint8_t opcode;
  153. opcode = dataPtr[0];
  154. handle = dataPtr[1] +(dataPtr[2]<<8);
  155. switch(opcode)
  156. {
  157. case ATT_WRITE_REQUEST:
  158. switch(handle)
  159. {
  160. case 0x0004:
  161. break;
  162. case 0x000e:
  163. break;
  164. case 0x0011:
  165. break;
  166. }
  167. Bt_SndWriteResponse();
  168. break;
  169. case ATT_PREPARE_WRITE_REQUEST:
  170. switch(handle)
  171. {
  172. case 0x001c:
  173. break;
  174. }
  175. break;
  176. case ATT_WRITE_COMMAND:
  177. switch(handle)
  178. {
  179. case OTA_BLE_WRITE_HANDLE: //ota write handle
  180. Lpm_LockLpm(OTA_UPDATE_FLAG); //停止进入休眠
  181. Bt_BleOTA(len-1, dataPtr+1); //ota 升级
  182. //SYS_SetTimer(&OTA_sleep_timer,50,TIMER_SINGLE|TIMER_TYPE_BIT,BT_OTA_Sleep_func);
  183. UserTimerTask_Create((void*)BT_OTA_Sleep_func,50);
  184. break;
  185. case 0x001c:
  186. {
  187. /*app通过ble发的数据串口打印出来*/
  188. if((len-3)<=20)
  189. {
  190. memcpy(BleRecDataMsg.recv_data,dataPtr+3,len-3);
  191. BleRecDataMsg.recv_len=len-3;
  192. //Bt_SndBleData(BLE_SEND_HANDLE,BleReDataBuf,BleCntData);
  193. }else
  194. {
  195. memcpy(BleRecDataMsg.recv_data,dataPtr+3,20);
  196. BleRecDataMsg.recv_len=20;
  197. }
  198. // UserSet_OutPWM(0,PWM_CHANNEL_0,20000,BleRecDataMsg.recv_data[0]);// G
  199. //light_set_color(BleRecDataMsg.recv_data[0]);
  200. u_ble_data_recv(BleRecDataMsg.recv_data,BleRecDataMsg.recv_len);
  201. }
  202. break;
  203. }
  204. break;
  205. }
  206. }
  207. tIPCHandleCb gTIPCHandleCb[IPC_TYPE_NUM]=
  208. {
  209. 0,
  210. IpcDefaultCallBack,//cmd
  211. Bt_EvtCallBack,//evt //evt回调函数,函数在drv_bt.c实现
  212. IpcDefaultCallBack,//hid
  213. IpcDefaultCallBack,//spp
  214. Bt_BleCallBack,//ble //ble data回调函数,函数在drv_bt.c实现
  215. IpcDefaultCallBack,//24g
  216. IpcDefaultCallBack,//mesh
  217. IpcDefaultCallBack,
  218. IpcDefaultCallBack,//mesh
  219. IpcDefaultCallBack,//a2dp
  220. IpcDefaultCallBack,//hfp
  221. #if (NEC_ENABLE==1)
  222. Bt_NecCallBack
  223. #else
  224. IpcDefaultCallBack
  225. #endif
  226. };
  227. void Bt_Reset()
  228. {
  229. uint8_t advD[22] = {0x02,0x01,0x06,0x05,0x03,0x12,0x18,0x0f,0x18,0x03,0x19,0x80,0x01,0x08,0x09,0x31,0x31,0x58,0x58,0x42,0x4c,0x45};
  230. uint8_t addr[6] = {0xAC,0x02,0x88,0x11,0x43,0Xac};
  231. uint8_t name[] = {"LH_TEST"};//Light Life
  232. Bt_Renew_Le_AdvData(advD,22);
  233. Bt_SetLeMac(addr); //设置蓝牙地址
  234. Bt_Re_LeAdvName(name,sizeof(name));
  235. Bt_Re_LeDeivcename(name,sizeof(name));
  236. Lpm_Set_Conn_Interval(0x1a0);
  237. Bt_SetLocalMtuSize(200);
  238. Bt_StartAdv(100,80);
  239. }
  240. int user_task1(void)
  241. {
  242. //MyPrintf("sys_time:%d\r\n",sys_time_handle.get_run_ticks());
  243. return 2000;
  244. }
  245. int user_task2(void)
  246. {
  247. return 50;
  248. }
  249. int test1()
  250. {
  251. MyPrintf("\r\ntest1\r\n");
  252. }
  253. int main(void)
  254. {
  255. if(HREAD(mem_wake_flag)==POWERON_WAKE)
  256. {
  257. //初始化蓝牙回调函数
  258. IPC_init(&gTIPCHandleCb);
  259. //初始化定时器
  260. SYS_TimerInit();
  261. printport_init();//初始化UARTB
  262. // BLE profile init.
  263. Att_profile_Config();
  264. //clos lpm
  265. Lpm_exit();
  266. //init
  267. Bt_Reset();
  268. }
  269. else
  270. {
  271. SysTick_Config(SYSTEM_CLOCK/100);
  272. }
  273. //SYS_ClkTicks();
  274. HWRITE(mem_le_adv_led,1);//解除gpio0的系统占用 解决官方代码bug
  275. GPIO_SetOut(GPIO_0,OUT_LOW);//同时将io 输出低电平 上电熄灭灯
  276. // GPIO_SetOut(GPIO_25,OUT_LOW);
  277. GPIO_SetOut(GPIO_24,OUT_LOW);
  278. MyPrintf("\r\n****************RESET_BOOT*****************\r\n");
  279. Audio_sampling_init();
  280. u_init();
  281. TaskManager_Init();
  282. UserTask_Create(1,user_task1,1);
  283. UserTask_Create(2,user_task2,1);
  284. //UserTimerTask_Create(test1,1000);
  285. #ifdef HW_WATCH_DOG_FUNC
  286. WDT_Enable();//开启看门狗
  287. #endif
  288. MyPrintf("\r\nOTA_VERSION_Dev\r\n");
  289. MyPrintf("\r\nRUN_ADDR:%x\r\n",Get_runAddr());
  290. while(1)
  291. {
  292. #ifdef HW_WATCH_DOG_FUNC
  293. WDT_Kick();//喂狗
  294. #endif
  295. ag_timer_sched();//定时轮询
  296. TaskManager_Run();//任务调度器运行
  297. Audio_to_uart_start();
  298. switch (HREAD(IPC_MCU_STATE))
  299. {
  300. case IPC_MCU_STATE_RUNNING:
  301. {
  302. IPC_HandleRxPacket(); //m0和bt交互数据类型判断,是evt还是ble data?并执行对应回调函数
  303. // SYS_timerPolling();//定时器任务轮询
  304. Lpm_LockLpm(M0_LPM_FLAG);
  305. }
  306. break;
  307. case IPC_MCU_STATE_LMP: //lpm
  308. {
  309. if (IPC_IsTxBuffEmpty())
  310. {
  311. OS_ENTER_CRITICAL();
  312. Bt_ActionBeforeLpm();
  313. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_STOP);
  314. }
  315. else{
  316. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  317. }
  318. }
  319. break;
  320. case IPC_MCU_STATE_HIBERNATE: // HIBERNATE
  321. {
  322. OS_ENTER_CRITICAL();
  323. Bt_ActionBeforeHibernate();
  324. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_STOP);
  325. }
  326. break;
  327. case IPC_MCU_STATE_STOP:
  328. break;
  329. }
  330. }
  331. }