main.c 8.1 KB

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