main.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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] = {0xF1,0x02,0x88,0x11,0x43,0XF1};
  225. uint8_t addr[6] = {0xac,0x02,0x88,0x11,0x43,0Xac};//官方代码mac地址
  226. uint8_t name[] = {"Smart Light"};//Light Life
  227. Bt_Renew_Le_AdvData(advD,22);
  228. Bt_SetLeMac(addr); //设置蓝牙地址
  229. Bt_Re_LeAdvName(name,sizeof(name));
  230. Bt_Re_LeDeivcename(name,sizeof(name));
  231. Lpm_Set_Conn_Interval(0x1a0);
  232. Bt_SetLocalMtuSize(200);
  233. Bt_StartAdv(100,80);
  234. }
  235. int main(void)
  236. {
  237. if(HREAD(mem_wake_flag)==POWERON_WAKE)
  238. {
  239. //初始化蓝牙回调函数
  240. IPC_init(&gTIPCHandleCb);
  241. //初始化定时器
  242. SYS_TimerInit();
  243. printport_init();//初始化UARTB
  244. // BLE profile init.
  245. Att_profile_Config();
  246. //clos lpm
  247. Lpm_exit();
  248. //init
  249. Bt_Reset();
  250. }
  251. else
  252. {
  253. SysTick_Config(SYSTEM_CLOCK/100);
  254. }
  255. //SYS_ClkTicks();
  256. HWRITE(mem_le_adv_led,1);//解除gpio0的系统占用 解决官方代码bug
  257. GPIO_SetOut(GPIO_0,OUT_LOW);//同时将io 输出低电平 上电熄灭灯
  258. GPIO_SetOut(GPIO_25,OUT_LOW);
  259. GPIO_SetOut(GPIO_24,OUT_LOW);
  260. #ifdef DEBUG_DRV_APP
  261. MyPrintf("\r\n****************RESET_BOOT*****************\r\n");
  262. #endif
  263. Audio_sampling_init();
  264. u_init();
  265. TaskManager_Init();
  266. #ifdef HW_WATCH_DOG_FUNC
  267. WDT_Enable();//开启看门狗
  268. #endif
  269. #ifdef DEBUG_DRV_APP
  270. MyPrintf("\r\nOTA_VERSION_Dev\r\n");
  271. MyPrintf("\r\nRUN_ADDR:%x\r\n",Get_runAddr());
  272. #endif
  273. while(1)
  274. {
  275. #ifdef HW_WATCH_DOG_FUNC
  276. WDT_Kick();//喂狗
  277. #endif
  278. ag_timer_sched();//定时轮询
  279. TaskManager_Run();//任务调度器运行
  280. Audio_to_uart_start();
  281. switch (HREAD(IPC_MCU_STATE))
  282. {
  283. case IPC_MCU_STATE_RUNNING:
  284. {
  285. IPC_HandleRxPacket(); //m0和bt交互数据类型判断,是evt还是ble data?并执行对应回调函数
  286. //SYS_timerPolling();//定时器任务轮询
  287. Lpm_LockLpm(M0_LPM_FLAG);
  288. }
  289. break;
  290. case IPC_MCU_STATE_LMP: //lpm
  291. {
  292. if (IPC_IsTxBuffEmpty())
  293. {
  294. OS_ENTER_CRITICAL();
  295. Bt_ActionBeforeLpm();
  296. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_STOP);
  297. }
  298. else{
  299. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_RUNNING);
  300. }
  301. }
  302. break;
  303. case IPC_MCU_STATE_HIBERNATE: // HIBERNATE
  304. {
  305. OS_ENTER_CRITICAL();
  306. Bt_ActionBeforeHibernate();
  307. HWRITE(IPC_MCU_STATE,IPC_MCU_STATE_STOP);
  308. }
  309. break;
  310. case IPC_MCU_STATE_STOP:
  311. break;
  312. }
  313. }
  314. }