cookoo_sdk.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /*
  2. * Copyright : Cookoo Science, All Rights Reserved ©2022
  3. *
  4. * cookoo_sdk.h
  5. *
  6. * Author cookoo
  7. */
  8. #ifndef COOKOO_SDK
  9. #define COOKOO_SDK
  10. /* COOKOO SDK 设备接口
  11. * 设备包含:
  12. * CAN * 5
  13. * CAN0-CAN1 支持波特率, 支持扩展帧 或者使用linux/can/raw
  14. * CAN2-CAN4 固定波特率500k, 不支持设置波特率, 不支持扩展帧
  15. * IO * 8
  16. 输入口 * 4
  17. 输出口 * 4
  18. * ADC * 2
  19. *
  20. * RS232 * 2
  21. * 封装MCU上的232,
  22. * 封装ARM上的232设备,可使用本接口,或使用/dev/下的设备符
  23. * RS485 * 1
  24. * 封装ARM上的485设备,可使用本接口,或使用/dev/下的设备符
  25. *
  26. * 相机 * 8
  27. * 封装ARM上的video(/dev/video*)
  28. */
  29. namespace cookoo {
  30. // CAN设备
  31. class Ck_Can
  32. {
  33. public:
  34. // COOKOO CAN设备ID*5
  35. enum CK_CAN {
  36. CK_CAN0 = 0,
  37. CK_CAN1,
  38. CK_CAN2,
  39. CK_CAN3,
  40. CK_CAN4,
  41. };
  42. struct ck_can_frame {
  43. uint32_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
  44. uint8_t can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
  45. uint8_t data[8] __attribute__((aligned(8)));
  46. };
  47. public:
  48. /**
  49. * @fn (Ck_Can)
  50. * @brief
  51. * @param CAN通道号, 波特率
  52. * @return None
  53. */
  54. Ck_Can(CK_CAN can_ch, int rate);
  55. /**
  56. * @fn (~Ck_Can)
  57. * @brief
  58. * @param None
  59. * @return None
  60. */
  61. ~Ck_Can();
  62. public:
  63. /**
  64. * @fn (Ck_Can::Read)
  65. * @brief 数据读取
  66. * @param data: can frame to read,
  67. * @return 读取长度
  68. */
  69. int Read(ck_can_frame& data);
  70. /**
  71. * @fn (Ck_Can::Write)
  72. * @brief 数据写入
  73. * @param data: can frame to read,
  74. * @return 写入长度
  75. */
  76. int Write(const ck_can_frame& data);
  77. private:
  78. // 对象不支持 拷贝/移动/赋值
  79. Ck_Can(const Ck_Can&) = delete;
  80. Ck_Can(Ck_Can&&) = delete;
  81. void operator=(const Ck_Can&) = delete;
  82. void operator=(Ck_Can&&) = delete;
  83. private:
  84. void* m_performer = nullptr;
  85. };
  86. // GPIO+AD
  87. class Ck_Pin
  88. {
  89. public:
  90. // GPIO * 8, 输入口*4, 输出口*4
  91. enum CK_PIN {
  92. CK_PIN_I1,
  93. CK_PIN_I2,
  94. CK_PIN_I3,
  95. CK_PIN_I4,
  96. CK_PIN_O1,
  97. CK_PIN_O2,
  98. CK_PIN_O3,
  99. CK_PIN_O4
  100. };
  101. // AD 电压检测口*2
  102. enum CK_AD {
  103. CK_AD_1,
  104. CK_AD_2,
  105. };
  106. public:
  107. /**
  108. * @fn (Ck_Pin)
  109. * @brief
  110. * @param None
  111. * @return None
  112. */
  113. Ck_Pin();
  114. /**
  115. * @fn (~Ck_Pin)
  116. * @brief
  117. * @param None
  118. * @return None
  119. */
  120. ~Ck_Pin();
  121. /**
  122. * 暂不支持
  123. * @fn (Ck_Pin::Set)
  124. * @brief 设置管脚-只支持O1~O4设置
  125. * @param idx: GPIO index, value: 1-High, 0-Low
  126. * @return true:OK, false:Failed
  127. */
  128. bool Set(CK_PIN idx, bool value);
  129. /**
  130. * @fn (Ck_Pin::Get)
  131. * @brief 获取GPIO状态
  132. * @param idx: GPIO index
  133. * @return 1:High, 0:Low
  134. */
  135. bool Get(CK_PIN idx);
  136. /**
  137. * @fn (Ck_Pin::Get)
  138. * @brief 获取AD电压
  139. * @param idx: AD index
  140. * @return 电压值 单位V
  141. */
  142. float Get(CK_AD ad_id);
  143. const char* Check();
  144. private:
  145. // 对象不支持 拷贝/移动/赋值
  146. Ck_Pin(const Ck_Pin&) = delete;
  147. Ck_Pin(Ck_Pin&&) = delete;
  148. void operator=(const Ck_Pin&) = delete;
  149. void operator=(Ck_Pin&&) = delete;
  150. private:
  151. void* m_performer = nullptr;
  152. };
  153. // 串口
  154. class Ck_Serial
  155. {
  156. public:
  157. // 串口设备: RS232 * 2, RS485 * 1
  158. enum CK_SERIAL {
  159. CK_SERIAL_RS232_1,// ARM
  160. CK_SERIAL_RS232_2,// MCU, 固定波特率
  161. CK_SERIAL_RS485_0 // ARM
  162. };
  163. public:
  164. /**
  165. * @fn (Ck_Serial)
  166. * @brief
  167. * @param port: Serial port
  168. * rate: Serial bitrate
  169. * CK_SERIAL_RS232_0, 固定波特率, 此参数无效
  170. * @return None
  171. */
  172. explicit Ck_Serial(CK_SERIAL port, int rate);
  173. /**
  174. * @fn (~Ck_Serial)
  175. * @brief
  176. * @param None
  177. * @return None
  178. */
  179. ~Ck_Serial();
  180. public:
  181. /**
  182. * @fn (Ck_Serial::Read)
  183. * @brief 数据读取
  184. * @param data: buffer to read,
  185. * len : max length of data
  186. * @return 读取长度
  187. */
  188. int Read(void* data, int len);
  189. /**
  190. * @fn (Ck_Serial::Write)
  191. * @brief 数据写入
  192. * @param data: buffer to read,
  193. * len : length of data
  194. * @return 写入长度
  195. */
  196. int Write(const void* data, int len);
  197. private:
  198. // 对象不支持 拷贝/移动/赋值
  199. Ck_Serial(const Ck_Serial&) = delete;
  200. Ck_Serial(Ck_Serial&&) = delete;
  201. void operator=(const Ck_Serial&) = delete;
  202. void operator=(Ck_Serial&&) = delete;
  203. private:
  204. void* m_performer = nullptr;
  205. };
  206. // 设置激光雷达电源开关
  207. /**
  208. * @fn (Set_Power)
  209. * @brief 设置激光雷达供电开关
  210. * @param ch:通道1-4
  211. sw: 开关 0-1
  212. */
  213. void Set_Power(uint8_t ch, bool sw);
  214. // 相机外触发
  215. /**
  216. * @fn (Set_Poe)
  217. * @brief 设置POE供电开关
  218. * @param sw: 开关 0-1
  219. */
  220. void Set_Poe(bool sw);
  221. /**
  222. * @fn (Cam_Trigger_On)
  223. * @brief 相机外触发开
  224. * @param channel: 相机线束通道 0-1
  225. * rate : 帧率
  226. * duty : 占空比
  227. */
  228. void Cam_Trigger_On(uint8_t channel, uint16_t rate, uint8_t duty);
  229. /**
  230. * @fn (Cam_Trigger_Off)
  231. * @brief 相机外触发关
  232. * @param channel: 相机线束通道 0-1
  233. */
  234. void Cam_Trigger_Off(uint8_t channel);
  235. //相机设备
  236. class Ck_Cam
  237. {
  238. public:
  239. /**
  240. * @st (Ck_Frame)
  241. * @brief 相机图像帧数据
  242. * @param cnt: 帧序号
  243. * size:数据大小
  244. * data:数据
  245. * type:图像格式
  246. * 1-YUYV
  247. * 2-UYVY
  248. */
  249. typedef struct _st_ck_frame_
  250. {
  251. unsigned int cnt;
  252. unsigned int size;
  253. unsigned char* data;
  254. unsigned char type;
  255. } Ck_Frame;
  256. public:
  257. /**
  258. * @fn (Ck_Cam::Ck_Cam)
  259. * @brief 相机设备类构造
  260. * @param dev:设备描述符
  261. * w:分辨率-宽
  262. * h:分辨率-高
  263. * fps:帧率
  264. */
  265. Ck_Cam(const std::string& dev, int w, int h, int fps);
  266. /**
  267. * @fn (Ck_Cam::~Ck_Cam)
  268. * @brief 相机设备类析构
  269. */
  270. ~Ck_Cam();
  271. /**
  272. * @fn (Ck_Cam::Start)
  273. * @brief 相机设备对象开始运行
  274. */
  275. void Start();
  276. /**
  277. * @fn (Ck_Cam::Stop)
  278. * @brief 相机设备对象停止运行
  279. */
  280. void Stop();
  281. /**
  282. * @fn (Ck_Cam::GetFrame)
  283. * @brief 相机设备获取图像
  284. * @return 图像数据
  285. */
  286. Ck_Frame GetFrame();
  287. private:
  288. std::string m_dev;
  289. int m_w;
  290. int m_h;
  291. int m_fps;
  292. void* m_performer = nullptr;
  293. private:
  294. // 对象不支持 拷贝/移动/赋值
  295. Ck_Cam(const Ck_Cam&) = delete;
  296. Ck_Cam(Ck_Cam&&) = delete;
  297. void operator=(const Ck_Cam&) = delete;
  298. void operator=(Ck_Cam&&) = delete;
  299. };
  300. class Ck_GPS
  301. {
  302. public:
  303. static Ck_GPS* GetInstance();
  304. static void DelInstance();
  305. /**
  306. * @fn (Ck_GPS::Start)
  307. * @brief 开始运行
  308. * @param
  309. * @return None
  310. */
  311. void Start();
  312. /**
  313. * @fn (Ck_GPS::Start)
  314. * @brief 停止运行
  315. * @param
  316. * @return None
  317. */
  318. void Stop();
  319. /**
  320. * @fn (Ck_GPS::Calibrate)
  321. * @brief F9K配置标定参数
  322. * x1, y1, z1 惯导到后轮中心,参数单位为 cm
  323. * x2, y2, z2 惯导到定位天线,参数单位为 cm
  324. * e 量取杆臂值的配置误差, 可填0
  325. * @param
  326. * @return None
  327. */
  328. void Set_Calibrate(
  329. float x1, float y1, float z1,
  330. float x2, float y2, float z2,
  331. float e);
  332. /**
  333. * @fn (Ck_GPS::Save_Calibrate)
  334. * @brief 保存标定结果
  335. * @return true:保存成功,false:保存失败
  336. */
  337. bool Save_Calibrate();
  338. /**
  339. * @fn (Ck_GPS::Set_Ntrip)
  340. * @brief 配置nrtip服务器
  341. * 不使用RTK可不调用此接口
  342. * @param
  343. * @return None
  344. */
  345. void Set_Ntrip(std::string const& ip, int port,
  346. std::string const& user, std::string const& passwd,
  347. std::string const& mountpoint);
  348. /**
  349. * @fn (Ck_GPS::Set_IMU_DATA_OUT)
  350. * @brief 设置IMU数据输出
  351. * @param freq 0-100, 0:不输出,其他:输出频率
  352. * @return None
  353. */
  354. void Set_IMU_DATA_OUT(uint8_t freq);
  355. /**
  356. * @fn (Ck_GPS::Read_GPS)
  357. * @brief 定位数据读取 支持NMEA格式:GGA,RMC输出
  358. * @param None
  359. * @return 定位数据
  360. */
  361. std::string Read_GPS();
  362. /**
  363. * @fn (Ck_GPS::Get_IMU_STATE)
  364. * @brief 获取IMU状态
  365. * @return
  366. * bit7-4 Automatic IMU-mount alignment on/off
  367. * 0:automatic alignment is not running,
  368. * 1:automatic alignment is running
  369. * bit3-0 Status of IMU-mount alignment
  370. * 0:user-defined/fixed angles are used,
  371. * 1:IMU-mount roll/pitch angles alignment is ongoing,
  372. * 2:IMU-mount roll/pitch/yaw angles alignment is ongoing,
  373. * 3:coarse IMU-mount alignment are used,
  374. * 4:fine IMU-mount alignment are used
  375. */
  376. uint8_t Get_IMU_STATE();
  377. /**
  378. * @fn (Ck_GPS::Read_IMU_DATA)
  379. * @brief IMU数据读取
  380. * @param acc_x m/s2
  381. * @param acc_y m/s2
  382. * @param acc_z m/s2
  383. * @param gyr_x m/s2
  384. * @param gyr_y m/s2
  385. * @param gyr_z m/s2
  386. * @return none
  387. */
  388. void Read_IMU_DATA(float& acc_x, float& acc_y, float& acc_z,
  389. float& gyr_x, float& gyr_y, float& gyr_z);
  390. /**
  391. * @fn (Ck_GPS::Set_SPD_IN_MOD)
  392. * @brief 车速输入模式
  393. * @param mod输入模式
  394. * 0-不输入,
  395. * 1-软件接口输入
  396. * 2-硬件接口输入
  397. * @return none
  398. */
  399. void Set_SPD_IN_MOD(uint8_t mod);
  400. /**
  401. * @fn (Ck_GPS::Send_SPD)
  402. * @brief 发送车速
  403. * @param spd-车速 精度*1000 单位m/s
  404. * 使用Set_SPD_IN_MOD(1)设置软件接口输入,
  405. * 再使用此接口传入车速, 输入频率>=10HZ
  406. * @return none
  407. */
  408. void Send_SPD(int spd);
  409. /**
  410. * @fn (Ck_GPS::Set_NMEA_FREQ)
  411. * @brief 设置NMEA输出频率
  412. * @param freq: 输出频率 0, 1, 10, 20, 30 Hz
  413. * @return none
  414. */
  415. void Set_NMEA_FREQ(uint8_t freq);
  416. /**
  417. * @fn (Ck_GPS::Set_NMEA_MSG)
  418. * @brief 设置NMEA报文输出开关
  419. * @param name: "GGA", "RMC"...
  420. * output: 0-关, 1-开
  421. * @return none
  422. */
  423. void Set_NMEA_MSG(const std::string& name, bool output);
  424. /**
  425. * @fn (~Ck_GPS)
  426. * @brief
  427. * @param None
  428. * @return None
  429. */
  430. ~Ck_GPS();
  431. private:
  432. Ck_GPS();
  433. // 对象不支持 拷贝/移动/赋值
  434. Ck_GPS(const Ck_GPS&) = delete;
  435. Ck_GPS(Ck_GPS&&) = delete;
  436. void operator=(const Ck_GPS&) = delete;
  437. void operator=(Ck_GPS&&) = delete;
  438. private:
  439. static Ck_GPS* m_instance;
  440. };
  441. }
  442. #endif /* COOKOO_SDK */