control.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-05-30 Administrator the first version
  9. */
  10. #ifndef APPLICATIONS_INC_CONTROL_H_
  11. #define APPLICATIONS_INC_CBD_CONTROL_H_
  12. #include <rtthread.h>
  13. #include <board.h>
  14. #include "stdio.h"
  15. #include <rtdevice.h>
  16. // 定制相关//////////////////////////////////////////////////////
  17. #define SENSOR_EN 1 // 温湿度:0关闭,1打开
  18. #define ROBOT_EN 0 // 机器人
  19. #define Color_EN 0 // 定制色诱
  20. #define BZYV2_EN 0 // 孢子仪2.0
  21. #define BOOT_ERR 1 // 1-新bootloader,0-旧bootloader()2023年9月份之前的设备升级需要设置为0
  22. ////////////////////////////////////////////////////////////////
  23. // #define TESTMODE
  24. #define VERSION_NUM "D047"
  25. #define VERSION_KEY "SwversionVSY2"
  26. #define MAX_StepTime 5 // 最大步进上下行超时时间(秒)
  27. #define JD_REMAIN_MAX 600 // 胶带最大用量
  28. #define CompileTime sprintf(device_status.driver_compile, "%s-%s", __DATE__, __TIME__) // 编译时间,每次更新代码修改
  29. /*********************************************************************/
  30. extern uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr);
  31. #define chk_log_time CheckLogTime(&log_en_cnt, log_en_inr) // 检查是否打印log的宏定义
  32. /**
  33. * @brief dtype的编号 实际使用中直接填写名称代替编号
  34. *
  35. * 设备类型区分
  36. *
  37. */
  38. typedef enum
  39. {
  40. dt_CBD = 7, // 测报灯
  41. dt_BZY = 3 // 孢子仪
  42. } dtype_list;
  43. /**
  44. * @brief vtype的编号 实际使用中直接填写名称代替编号
  45. *
  46. * 版本号区分
  47. *
  48. */
  49. typedef enum
  50. {
  51. vt_ZP = 1, // 转盘
  52. //vt_HK = 4, // 海康
  53. vt_XCTm = 6, // 吸虫塔
  54. vt_BZY = 7, // 孢子仪
  55. vt_BZY_JD = 10, // 孢子仪 胶带结构 0x0A
  56. vt_GK = 11, // 高空
  57. vt_ROBOT = 30, // 海康机器人
  58. //vt_SD = 41, // 水稻
  59. vt_4800 = 48, // 4800
  60. vt_XCT = 4 // 小虫体
  61. } vtype_list;
  62. /**
  63. * @brief run_sta的编号 实际使用中直接填写名称代替编号
  64. *
  65. * 主工作流程的状态
  66. */
  67. typedef enum
  68. {
  69. rs_RESET = 0x00, // 起始状态/复位
  70. rs_type_MX
  71. } run_sta_list;
  72. /*
  73. 前:front - F
  74. 后:back - B
  75. 中:center - C
  76. */
  77. typedef enum
  78. {
  79. tl_Front = 0, // 尚未到
  80. tl_Back, // 已超过
  81. tl_Center, // 处于时间段
  82. tl_Verifi, // 参数校验失败
  83. tl_Error // 无效时间段
  84. } Temporal_list; // 工作时间段的详细状态划分
  85. typedef enum
  86. {
  87. mct_Foreward = 0, // 正转
  88. mct_Reversal, // 反转
  89. mct_Stop, // 停止
  90. mct_auto // 自动 //阀头使用
  91. } Motor_Ctl_type; // 适用于电机端口的类型选择
  92. typedef enum
  93. {
  94. lt_Angle_0 = 1, // 0度限位 对应LIMIT_0->PC13
  95. lt_Angle_90, // 90 度限位 对应LIMIT_90->PB9
  96. } Limit_type; // 适用于限位开关的类型选择
  97. typedef enum
  98. {
  99. mot_ZP = 0, // 转盘电机
  100. mot_CM = 1 // 上仓门电机
  101. } Motor_type; // 适用于电机端口的类型选择
  102. typedef enum
  103. {
  104. res_OK = 0, // 执行成功
  105. res_Verifi, // 校验失败
  106. res_Error, // 执行失败
  107. res_Timeout // 超时
  108. } Res_def; // 适用于功能函数的返回值类型
  109. typedef enum
  110. {
  111. res_ok = 0, // 没问题
  112. res_Time, // 时控
  113. res_Light, // 光控
  114. res_Temp, // 温控
  115. res_Humi, // 湿控
  116. res_Temp_D, // 温控(定位)
  117. res_Humi_D, // 湿控(定位)
  118. res_Rain, // 雨控
  119. res_PwrOff, // 设备已关机
  120. } Caw_def; // 适用于功能函数的返回值类型
  121. typedef struct
  122. {
  123. uint8_t year;
  124. uint8_t month;
  125. uint8_t day;
  126. } work_day_def;
  127. typedef enum
  128. {
  129. ws_standby = 0, // 待机
  130. ws_wait0, // 等待开始工作
  131. ws_start_coll, // 收集开始
  132. ws_wait_coll, // 等待收集完成
  133. ws_takephoto, // 立即拍照
  134. ws_jumptake, // 跳过拍照(退出)
  135. ws_flap, // 翻板
  136. ws_once_finsh, // 单次工作循环结束
  137. ws_finsh, // 今日工作结束
  138. ws_waitTig, // 红外触发模式 等待触发
  139. ws_KeyTig , // 按键触发模式
  140. ws_demo,
  141. ws_typemax // 最大值
  142. } works_def;
  143. typedef enum
  144. {
  145. RunTime_wx= 0,
  146. // RunTime_Tig_wx ,
  147. // RunFRMS_wx ,
  148. TypeMAX_wx
  149. }wm_Def;
  150. typedef struct
  151. {
  152. wm_Def wm;
  153. char keyword[24];
  154. }WorkMode_Def;
  155. typedef struct _packed
  156. {
  157. uint8_t iSave; // 存储标志位
  158. uint8_t dtype; // 设备类型?7-孢子仪,3-测报灯
  159. /*孢子仪*/
  160. uint8_t run_sta; // 转盘的位置:0原始;1收集;2培养;3拍照;4凡士林,其他-测试
  161. uint8_t cul_time; // 培养时间
  162. uint8_t stay_time; // 已培养时间
  163. uint8_t pre_temp; // 培养仓温度
  164. uint8_t box_temp; // 箱体温度
  165. uint8_t auto_test_sw; // 一键测试 0-关 1-开
  166. uint8_t cold_status; // 制冷状态 0-关 1-开
  167. uint8_t cold_sw; // 制冷开关 0-关 1-开
  168. uint8_t wind_sw; // 风机开关 0-关 1-开
  169. uint8_t collect_fan_status; // 采集状态 0-关 1-开
  170. uint8_t autotakepic; // 对焦拍照 0-关 1-开
  171. uint8_t develop_flag; // 是否进入培养模式
  172. uint8_t cool_fan_status; // 散热风机状态 0-停止 1-打开
  173. uint8_t fsl_sw; // 凡士林开关:0-关,1-开
  174. uint8_t collecting_sh1; // 采集开启1
  175. uint8_t collecting_eh1; // 采集关闭1
  176. uint8_t collecting_sh2; // 采集开启2
  177. uint8_t collecting_eh2; // 采集关闭2
  178. uint8_t collecting_sh3; // 采集开启3
  179. uint8_t collecting_eh3; // 采集关闭3
  180. /*测报灯*/
  181. uint8_t heat_sw; // 加热开关
  182. uint8_t photo_ws; // 拍照
  183. uint8_t power_status; // 电源
  184. uint8_t sun_test; // 光控测测试标志位
  185. uint8_t heat_status; // 加热状态 0-关 1-开
  186. uint8_t lamp_status; // 灯管1状态 0-关 1-开
  187. uint8_t lamp1_status; // 灯管2状态 0-关 1-开
  188. uint8_t lamp2_status; // 灯管3状态 0-关 1-开
  189. uint8_t up_status; // 上仓门状态 0-停止 1-打开 2-关闭
  190. uint8_t down_status; // 下仓门状态 0-停止 1-打开 2-关闭
  191. uint8_t clear_status; // 清扫状态 0-停止 1-开始
  192. uint8_t shake_ws; // 震动 0-关 1-开
  193. uint8_t heatvalue; // 加热设定温度
  194. uint8_t ctr_up_motor; // 上仓门, 1打开,0关闭
  195. uint8_t ctr_down_motor; // 下仓门, 1打开,0关闭
  196. uint8_t rain_status; // 雨控 0-正常 1-欠压
  197. uint8_t temp_status; // 温控 0-正常 1-温控
  198. uint8_t sun_status; // 光控 0-正常 1-光控
  199. uint8_t ds; // 设备状态 0-关机 1-开机
  200. uint8_t work_status; // 工作状态 0-待机 1-工作
  201. uint8_t work_done; // 工作结束 1-正常 0-工作已结束
  202. uint8_t bat_status; // 电压状态 1-正常 0-欠压
  203. uint8_t heattime; // 加热时间
  204. uint8_t heat_time_min; // 实时加热时间
  205. uint8_t clt_time; // 收集时间
  206. uint8_t vol; // 音量
  207. uint8_t refresh_num; // DTU数据刷新时间
  208. uint8_t refresh_timeout; // 刷新超时时间
  209. uint8_t sunBar; // 光控定时时间
  210. uint8_t startBar; // 时控开始时间
  211. uint8_t stopBar; // 时控结束时间
  212. uint8_t tph; // 高温保护
  213. int8_t tpl; // 低温保护
  214. uint8_t timeSwitch; // 模式0光控,1时控
  215. uint8_t link_sta; // 有线接入状态:0-未接入,1已接入
  216. uint8_t heattem; // 加热仓温度(实时)
  217. uint8_t hmi_fresh; // 是否启动屏幕
  218. uint8_t update_flag; // 是否启动升级
  219. uint8_t photo_type; // 相机类型,0-USB,1-海康,2-大华
  220. uint8_t version_type; // 版本类型,1-转盘,4-海康,41-水稻,11-高空,48-4800,A-孢子仪
  221. uint8_t stop_in_bootloader; // 进入bootloader模式 1
  222. uint8_t account_status; // 卡状态
  223. uint8_t test_flag; // 测试标志
  224. uint8_t sensor_485_sta; // 485传感器
  225. #if BOOT_ERR == 1
  226. uint8_t gps_inuse;
  227. uint8_t gps_view;
  228. #endif
  229. // uint16_t dattim; // 数据上传间隔
  230. // uint16_t photim; // 照片上传间隔
  231. uint16_t shake_sec; // 震动时间
  232. uint16_t thsp; // 息屏时间
  233. rt_uint32_t num_updata; //
  234. rt_uint32_t rebootcnt; // 启动次数
  235. rt_uint32_t light_over_tim; // 光控定时差秒数,镇流器的结束时间
  236. rt_uint32_t data_plan; // 流量套餐
  237. rt_uint32_t expiry_date; // 到期时间
  238. int passWord; // 初始密码
  239. const char *coll_time[10];
  240. char mqttcfg1[64]; //
  241. char mqttcfg2[64]; //
  242. char csq[8]; // 信号强度
  243. char net[8]; // 网络
  244. char sim[8]; // SIM卡
  245. char gps[8]; // 定位类型
  246. char gps_state[8]; // 定位类型
  247. char tempture[12]; // 温度
  248. char humidity[12]; // 湿度
  249. char driver[64]; // 版本
  250. char driver_4g[64]; // 4g版本
  251. char driver_bl[64]; // BL版本
  252. char driver_compile[64]; // BL编译时间
  253. char project[32]; // project,用于判断升级
  254. char lng[32]; // 经度
  255. char lat[32]; // 纬度
  256. char stamp[32]; // 系统时间
  257. char fuse_voltage[32]; // 保险丝电压
  258. char iccid[32]; // SIM卡ICCID
  259. char imei[32]; // IMEI,唯一ID
  260. char json_w_clock[128]; // 修改时间
  261. char json_w_reset[128]; //
  262. char json_w_platform[128]; //
  263. char power[8]; // 功率
  264. char voltage[8]; // 电池电压
  265. uint8_t camsta; // 相机连接状态
  266. uint8_t traplampsta; // 诱捕灯状态
  267. uint8_t rain_update; // 雨控状态更新至雨控
  268. uint8_t C01;
  269. } Device_Status_typedef;
  270. // typedef struct
  271. // {
  272. // uint8_t addr;
  273. // uint8_t sreg;
  274. // }SYS;
  275. /************************************************/
  276. #define ON 1
  277. #define OFF 0
  278. #define LED0_PIN GET_PIN(B, 3)
  279. #define Beep GET_PIN(B, 4)
  280. #define OPEN 0x02
  281. #define CLOSE 0x03
  282. /************************************************/
  283. // 光控
  284. #define LIGHT_PIN GET_PIN(C, 0)
  285. // 雨控
  286. #define RAIN_PIN GET_PIN(C, 1)
  287. // 加热
  288. #define Heat_Pin GET_PIN(B, 12)
  289. // 采集/上仓门
  290. #define Collect_fan_R GET_PIN(C, 5)
  291. #define Collect_fan_L GET_PIN(C, 4)
  292. // 下仓门
  293. #define C_DOWN_R GET_PIN(B, 0)
  294. #define C_DOWN_L GET_PIN(B, 1)
  295. // 镇流器
  296. //#define LAMP_SW GET_PIN(C, 9)
  297. // 震动电机
  298. #define SHAKE_SW GET_PIN(B, 2)
  299. // 补光
  300. #define LED_SW GET_PIN(A, 15)
  301. // 清扫
  302. #define CLEAR_R GET_PIN(C, 7)
  303. #define CLEAR_L GET_PIN(C, 8)
  304. // 相机供电+
  305. //#define PHOTO GET_PIN(A, 12)
  306. // 路由器供电
  307. #define ROUTER GET_PIN(A, 8)
  308. #define RE GET_PIN(B, 14)
  309. //
  310. //// RTU/DTU供电
  311. //#define RTU_DTU GET_PIN(B, 13)
  312. //// 相机供电
  313. //#define CAM_CTL GET_PIN(B, 15)
  314. // 海康相机拍照
  315. //#define HK_TAKE GET_PIN(A, 11)
  316. //#define HK_IO GET_PIN(B, 14) // 备用触发拍照
  317. #define HK_IO GET_PIN(C, 13) //新的触发拍照io 适配xct小板子
  318. // 清扫限位
  319. //#define CLEAR_R_LIMIT GET_PIN(C, 13)
  320. //#define CLEAR_L_LIMIT GET_PIN(B, 9)
  321. #define CLEAR_R_LIMIT GET_PIN(B, 14) //unuse
  322. #define CLEAR_L_LIMIT GET_PIN(B, 14) //unuse
  323. /*****************************4.0定制多光源*********************************/
  324. #define LAMP_0_SW GET_PIN(B, 9)
  325. #define LAMP_1_SW GET_PIN(B, 10)
  326. #define LAMP_2_SW GET_PIN(B, 11)
  327. /***************************高空测报灯*************************/
  328. // 上仓门电机限位
  329. #define CTR_UPO_LIMIT GET_PIN(C, 13)
  330. #define CTR_UPC_LIMIT GET_PIN(B, 9)
  331. // 下仓门电机限位
  332. //#define CTR_DWO_LIMIT GET_PIN(B, 5)
  333. //#define CTR_DWC_LIMIT GET_PIN(B, 8)
  334. // 雨控电机限位,控制排水和落虫
  335. #define CTR_RO_LIMIT GET_PIN(B, 15)
  336. #define CTR_RC_LIMIT GET_PIN(C, 6)
  337. /******************************吸虫塔*********************************/
  338. #define HK_5000W_P GET_PIN(B, 12)
  339. #define ROUTER_P GET_PIN(B, 10)
  340. #define LED_P GET_PIN(B, 11)
  341. #define PC7_TIM3_CH 2 // pwm8
  342. #define PC8_TIM3_CH 3 // pwm8
  343. #define PB1_TIM3_CH 4 // pwm3
  344. //#define MOTOR1_CTR_PIN GET_PIN(C, 9) // 吸虫电机IO
  345. #define MOTOR2_CTR_PIN GET_PIN(B, 2) // 吸附电机IO
  346. #define MOTOR_CR_PIN GET_PIN(C, 7)
  347. #define MOTOR_CL_PIN GET_PIN(C, 8)
  348. #define MOTOR_C_LIMIT GET_PIN(C, 13) // 卷带限位
  349. void ctr_JD_Clear(uint8_t shake_sw);
  350. uint8_t ctr_Motor_xichong(uint8_t status_ws);
  351. uint8_t ctr_Motor_xifu(uint8_t status_ws);
  352. uint8_t ctr_Camera_Power(uint8_t status_ws);
  353. /*****************************5.0测报灯******************************/
  354. void ctr_turnv5(void);
  355. /*****************************孢子仪**********************************/
  356. // 制冷
  357. #define Cold_Pin GET_PIN(B, 11)
  358. // 采集
  359. #define Collect_Fan GET_PIN(B, 10)
  360. // 散热
  361. #define Cool_Fan_R GET_PIN(C, 5)
  362. #define Cool_Fan_L GET_PIN(C, 4)
  363. // 步进电机限位
  364. #define LIMIT_UP GET_PIN(B, 8)
  365. #define LIMIT_DOWN GET_PIN(B, 5)
  366. // 步进电机驱动
  367. #define Motor_EN GET_PIN(B, 14)
  368. #define Motor_DIR GET_PIN(B, 15)
  369. void ctr_turn(uint8_t v, uint8_t sta);
  370. uint8_t ctr_Cold(uint8_t status_cold);
  371. uint8_t ctr_Cool_Fan(uint8_t status_cool); // 散热风机
  372. uint8_t ctr_Collect_Fan(uint8_t status_collect); // 采集风机
  373. Res_def ctr_Motor_Driver(uint8_t EN, uint8_t DIR, rt_uint32_t pwm, rt_uint32_t time_out); // 步进电机
  374. void ctr_Petroleum_jelly(rt_uint32_t delay); // 凡士林
  375. /*****************************定制4.0-2000W***************************************/
  376. #define FAN_P GET_PIN(B, 10)
  377. #define FAN_I GET_PIN(B, 11)
  378. uint8_t ctr_Fan_IN(uint8_t status_ws);
  379. uint8_t ctr_Fan_PUT(uint8_t status_ws);
  380. /*******************************定制展厅机器人************************************/
  381. //#define LIMIT_OPEN GET_PIN(B, 8)
  382. //#define LIMIT_CLOSE GET_PIN(B, 5)
  383. #define Motor_Power GET_PIN(B, 10) // 电机驱动供电
  384. #define Motor_Direction_Button GET_PIN(B, 9) // IO输入,检测按键状态,用于控制方向
  385. #define Motor_Direction_Ctr GET_PIN(B, 15) // IO输出,控制电机运动方向
  386. #define EMS_Dir GET_PIN(B, 14)
  387. void ctr_Motor_Robot(uint8_t status_ws);
  388. /****************************定制色诱***************************************************/
  389. #define LIMIT_RESET GET_PIN(C, 13)
  390. #define LIMIT_BOARD GET_PIN(B, 9)
  391. //#define KEY_RESET GET_PIN(B, 8)
  392. //#define KEY_BACK GET_PIN(B, 5)
  393. int ctr_Color_board(uint8_t forward, uint16_t time_board);
  394. /***************************************************************/
  395. /***************************************************************/
  396. uint8_t ctr_Heat(uint8_t status_heat); // 加热
  397. uint8_t ctr_cangmen_up(uint8_t status_up); // 上仓门
  398. uint8_t ctr_cangmen_down(uint8_t status_down); // 下仓门
  399. uint8_t ctr_lamp(uint8_t status_lamp, uint8_t lamp_num); // 镇流器
  400. uint8_t ctr_shake(uint8_t status_shake, uint16_t shake_sec); // 震动
  401. uint8_t ctr_clear(uint16_t status_clear); // 清扫
  402. void ctr_TG_Clear(uint16_t clear_timeout); // 清扫2
  403. uint8_t ctr_led(uint8_t status_led); // 补光灯
  404. void calorstat(uint16_t heat_time); // 恒温
  405. void ctr_router(uint8_t status_router); // 路由器
  406. void turnzp(void); // 转仓
  407. // 拍照结果(供运维页远程诊断: 为什么没拍/拍了失败)
  408. typedef struct
  409. {
  410. uint32_t tig_tm; // 上次触发拍照时刻(Unix秒, 0-无记录)
  411. uint32_t res_tm; // 上次拍照出结果时刻(0-尚未出结果)
  412. uint8_t res; // 0-无记录 1-成功 2-失败(图像传输超时) 3-未执行(相机忙) 4-进行中
  413. uint8_t io_type; // 触发类型(Hk_Take_io 入参: 1-工作包 8-一键测试 9-立即拍照)
  414. } Photo_Stat_t;
  415. extern Photo_Stat_t photo_stat;
  416. Res_def Hk_Take_io(char type); // 触发拍照
  417. void HK_TakePhoto(void); // 拍照
  418. void ctr_photo(uint8_t status_photo);
  419. void HardWare_Init(uint8_t boot); // 初始化
  420. void HardWare_Check(uint8_t boot); // 自检
  421. void ResetInit(void); // 上电复位
  422. void SunTest(void); // 光控测试
  423. /*****************************************************/
  424. void WorkTask_XCT(void);
  425. /****************************************************/
  426. void WorkCheck(void); // 工作检测
  427. void WorkTask(void); // 工作任务
  428. //
  429. /***********************孢子仪****************************/
  430. void BZY_JD_AutoTest(void); // 孢子仪 一键测试
  431. /***************************************************/
  432. // 线程
  433. int Control_clear(void);
  434. int Workstatus_check(void);
  435. int Work_Loop_Task(void);
  436. int Control_heat(void);
  437. /***************************** 天牛的IO定义 **********************************/
  438. // RTU供电 已修改 √
  439. #define RTU_DTU GET_PIN(A, 8)
  440. // 相机供电 已修改 √
  441. #define CAM_CTL GET_PIN(B, 15)
  442. // 外部按键 已验证 √
  443. #define Key_IN GET_PIN(A, 11)
  444. #define Key_OUT GET_PIN(A, 12)
  445. // 落虫红外触发
  446. #define RayTigA GET_PIN(B, 8) // PB8
  447. #define RayTigB GET_PIN(B, 5) // PB5
  448. // 控制数字5V
  449. #define CTL_5V GET_PIN(C, 9)
  450. // 控制传感器12V
  451. #define CTL_SENSOR_12V GET_PIN(B, 13)
  452. // 上仓门
  453. #define TURN_CM_R GET_PIN(C, 8)
  454. #define TURN_CM_L GET_PIN(C, 7)
  455. // 翻板
  456. #define TURN_ZP_R GET_PIN(B, 0)
  457. #define TURN_ZP_L GET_PIN(B, 1)
  458. // 转盘限位
  459. #define LIMIT_0 GET_PIN(C, 13) // 其实此时电机是没有限位的 阀头自带 找了一个没用的IO先放上
  460. #define LIMIT_90 GET_PIN(C, 13) // 其实此时电机是没有限位的 阀头自带 找了一个没用的IO先放上
  461. /***************************** 天牛的IO定义 **********************************/
  462. Res_def SendReadInfo(char c);
  463. #endif /* APPLICATIONS_INC_CONTROL_H_ */