ubx.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. /*
  2. * ubxproto
  3. * Copyright (c) 2014, Alexey Edelev aka semlanik, All rights reserved.
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 3.0 of the License, or (at your option) any later version.
  9. *
  10. * This library is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public
  16. * License along with this library.
  17. *
  18. * Additionally to GNU Lesser General Public License you MUST NOT
  19. * static link this library and MUST add link to author
  20. * and source of this library in your application.
  21. *
  22. * Actual LGPL text https://www.gnu.org/licenses/lgpl.html
  23. *
  24. * File: ubx.c
  25. */
  26. #include "ubxmessage.h"
  27. #include "ubx.h"
  28. #include "malloc.h"
  29. #include "memory.h"
  30. void fletcherChecksum(unsigned char* buffer, int size, unsigned char* checkSumA, unsigned char* checkSumB)
  31. {
  32. int i = 0;
  33. *checkSumA = 0;
  34. *checkSumB = 0;
  35. for(; i < size; i++)
  36. {
  37. *checkSumA += buffer[i];
  38. *checkSumB += *checkSumA;
  39. }
  40. }
  41. void completeMsg(struct UBXMsgBuffer* buffer, int payloadSize)
  42. {
  43. unsigned char* checkSumA = (unsigned char*)(buffer->data + UBX_HEADER_SIZE + payloadSize);
  44. unsigned char* checkSumB = (unsigned char*)(buffer->data + UBX_HEADER_SIZE + payloadSize + 1);
  45. fletcherChecksum((unsigned char*)(buffer->data + sizeof(UBX_PREAMBLE)), payloadSize + 4, checkSumA, checkSumB);
  46. }
  47. void initMsg(struct UBXMsg* msg, int payloadSize, enum UBXMessageClass msgClass, enum UBXMessageId msgId)
  48. {
  49. msg->preamble = htobe16(UBX_PREAMBLE);
  50. msg->hdr.msgClass = msgClass;
  51. msg->hdr.msgId = msgId;
  52. msg->hdr.length = payloadSize;
  53. }
  54. struct UBXMsgBuffer createBuffer(int payloadSize)
  55. {
  56. struct UBXMsgBuffer buffer = {0, 0};
  57. buffer.size = UBX_HEADER_SIZE + payloadSize + UBX_CHECKSUM_SIZE;
  58. buffer.data = malloc(buffer.size);
  59. memset(buffer.data, 0, buffer.size);
  60. return buffer;
  61. }
  62. struct UBXMsgBuffer getAID_ALPSRV(struct UBXMsg* clientMgs, const struct UBXAlpFileInfo *fileInfo)
  63. {
  64. int requestedAlpSize = (clientMgs->payload.AID_ALPSRV.size << 1);
  65. if(fileInfo->dataSize < (clientMgs->payload.AID_ALPSRV.offset + requestedAlpSize))
  66. {
  67. requestedAlpSize = fileInfo->dataSize - clientMgs->payload.AID_ALPSRV.offset - 1;
  68. }
  69. int alpMsgSize = sizeof(struct UBXAID_ALPSRV);
  70. int payloadSize = alpMsgSize + requestedAlpSize;
  71. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  72. struct UBXMsg* msg = (struct UBXMsg*) buffer.data;
  73. if(requestedAlpSize < 0)
  74. {
  75. return buffer;
  76. }
  77. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALPSRV);
  78. msg->payload.AID_ALPSRV.idSize = clientMgs->payload.AID_ALPSRV.idSize;
  79. msg->payload.AID_ALPSRV.type = clientMgs->payload.AID_ALPSRV.type;
  80. msg->payload.AID_ALPSRV.offset = clientMgs->payload.AID_ALPSRV.offset;
  81. msg->payload.AID_ALPSRV.size = clientMgs->payload.AID_ALPSRV.size;
  82. msg->payload.AID_ALPSRV.fileId = fileInfo->fileId;
  83. msg->payload.AID_ALPSRV.dataSize = requestedAlpSize;
  84. msg->payload.AID_ALPSRV.id1 = clientMgs->payload.AID_ALPSRV.id1;
  85. msg->payload.AID_ALPSRV.id2 = clientMgs->payload.AID_ALPSRV.id2;
  86. msg->payload.AID_ALPSRV.id3 = clientMgs->payload.AID_ALPSRV.id3;
  87. memcpy(buffer.data + UBX_HEADER_SIZE + alpMsgSize, fileInfo->alpData + msg->payload.AID_ALPSRV.offset, requestedAlpSize);
  88. completeMsg(&buffer, payloadSize);
  89. return buffer;
  90. }
  91. struct UBXMsgBuffer getCFG_MSG_POLL(enum UBXMessageClass msgClass, enum UBXMessageId msgId)
  92. {
  93. int payloadSize = sizeof(struct UBXCFG_MSG_POLL);
  94. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  95. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  96. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_MSG);
  97. msg->payload.CFG_MSG_POLL.msgClass = msgClass;
  98. msg->payload.CFG_MSG_POLL.msgId = msgId;
  99. completeMsg(&buffer, payloadSize);
  100. return buffer;
  101. }
  102. struct UBXMsgBuffer getCFG_MSG_RATE(enum UBXMessageClass msgClass, enum UBXMessageId msgId, UBXU1_t rate)
  103. {
  104. int payloadSize = sizeof(struct UBXCFG_MSG_RATE);
  105. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  106. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  107. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_MSG);
  108. msg->payload.CFG_MSG_RATE.msgClass = msgClass;
  109. msg->payload.CFG_MSG_RATE.msgId = msgId;
  110. msg->payload.CFG_MSG_RATE.rate = rate;
  111. completeMsg(&buffer, payloadSize);
  112. return buffer;
  113. }
  114. struct UBXMsgBuffer getCFG_MSG_RATES(enum UBXMessageClass msgClass, enum UBXMessageId msgId, UBXU1_t rate[])
  115. {
  116. int payloadSize = sizeof(struct UBXCFG_MSG_RATES);
  117. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  118. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  119. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_MSG);
  120. msg->payload.CFG_MSG_RATES.msgClass = msgClass;
  121. msg->payload.CFG_MSG_RATES.msgId = msgId;
  122. memcpy(msg->payload.CFG_MSG_RATES.rate, rate, 6*sizeof(u_int8_t));
  123. completeMsg(&buffer, payloadSize);
  124. return buffer;
  125. }
  126. struct UBXMsgBuffer getCFG_RST(enum UBXResetMode mode, u_int16_t mask)
  127. {
  128. int payloadSize = sizeof(struct UBXCFG_RST);
  129. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  130. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  131. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RST);
  132. msg->payload.CFG_RST.resetMode = mode;
  133. msg->payload.CFG_RST.navBBRMask = mask;
  134. completeMsg(&buffer, payloadSize);
  135. return buffer;
  136. }
  137. struct UBXMsgBuffer getCFG_TP5_POLL_OPT(enum UBXCFGTimepulses tpIdx)
  138. {
  139. int payloadSize = sizeof(struct UBXCFG_TP5_POLL_OPT);
  140. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  141. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  142. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_TP5);
  143. msg->payload.CFG_TP5_POLL_OPT.tpIdx = tpIdx;
  144. completeMsg(&buffer, payloadSize);
  145. return buffer;
  146. }
  147. struct UBXMsgBuffer getCFG_TP5(enum UBXCFGTimepulses tpIdx,
  148. int16_t antCableDelay,
  149. int16_t rfGroupDelay,
  150. u_int32_t freqPeriod,
  151. u_int32_t freqPeriodLock,
  152. u_int32_t pulseLenRatio,
  153. u_int32_t pulseLenRatioLock,
  154. int32_t userConfigDelay,
  155. int32_t flags)
  156. {
  157. int payloadSize = sizeof(struct UBXCFG_TP5);
  158. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  159. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  160. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_TP5);
  161. msg->payload.CFG_TP5.tpIdx = tpIdx;
  162. msg->payload.CFG_TP5.antCableDelay = antCableDelay;
  163. msg->payload.CFG_TP5.rfGroupDelay = rfGroupDelay;
  164. msg->payload.CFG_TP5.freqPeriod = freqPeriod;
  165. msg->payload.CFG_TP5.freqPeriodLock = freqPeriodLock;
  166. msg->payload.CFG_TP5.pulseLenRatio = pulseLenRatio;
  167. msg->payload.CFG_TP5.pulseLenRatioLock = pulseLenRatioLock;
  168. msg->payload.CFG_TP5.userConfigDelay = userConfigDelay;
  169. msg->payload.CFG_TP5.flags = flags;
  170. completeMsg(&buffer, payloadSize);
  171. return buffer;
  172. }
  173. struct UBXMsgBuffer getAID_ALM_POLL()
  174. {
  175. int payloadSize = sizeof(struct UBXAID_ALM_POLL);
  176. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  177. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  178. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALP);
  179. completeMsg(&buffer, payloadSize);
  180. return buffer;
  181. }
  182. struct UBXMsgBuffer getAID_ALM_POLL_OPT(UBXU1_t svid)
  183. {
  184. int payloadSize = sizeof(struct UBXAID_ALM_POLL_OPT);
  185. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  186. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  187. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALP);
  188. msg->payload.AID_ALM_POLL_OPT.svid = svid;
  189. completeMsg(&buffer, payloadSize);
  190. return buffer;
  191. }
  192. struct UBXMsgBuffer getAID_ALM(UBXU4_t svid, UBXU4_t week)
  193. {
  194. int payloadSize = sizeof(struct UBXAID_ALM);
  195. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  196. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  197. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALM);
  198. msg->payload.AID_ALM.svid = svid;
  199. msg->payload.AID_ALM.week = week;
  200. completeMsg(&buffer, payloadSize);
  201. return buffer;
  202. }
  203. struct UBXMsgBuffer getAID_ALM_OPT(UBXU4_t svid, UBXU4_t week, UBXU4_t dwrd[8])
  204. {
  205. int payloadSize = sizeof(struct UBXAID_ALM_OPT);
  206. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  207. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  208. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALM);
  209. msg->payload.AID_ALM_OPT.svid = svid;
  210. msg->payload.AID_ALM_OPT.week = week;
  211. memcpy(msg->payload.AID_ALM_OPT.dwrd, dwrd, 8*sizeof(UBXU4_t));
  212. completeMsg(&buffer, payloadSize);
  213. return buffer;
  214. }
  215. struct UBXMsgBuffer getAID_ALP_POLL(UBXU4_t predTow,
  216. UBXU4_t predDur,
  217. UBXI4_t age,
  218. UBXU2_t predWno,
  219. UBXU2_t almWno,
  220. UBXU1_t svs)
  221. {
  222. int payloadSize = sizeof(struct UBXAID_ALP_POLL);
  223. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  224. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  225. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALP);
  226. msg->payload.AID_ALP_POLL.predTow = predTow;
  227. msg->payload.AID_ALP_POLL.predDur = predDur;
  228. msg->payload.AID_ALP_POLL.age = age;
  229. msg->payload.AID_ALP_POLL.predWno = predWno;
  230. msg->payload.AID_ALP_POLL.almWno = almWno;
  231. msg->payload.AID_ALP_POLL.svs = svs;
  232. completeMsg(&buffer, payloadSize);
  233. return buffer;
  234. }
  235. struct UBXMsgBuffer getAID_ALP_END()
  236. {
  237. int payloadSize = sizeof(struct UBXAID_ALP_END);
  238. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  239. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  240. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALP);
  241. msg->payload.AID_ALP_END.dummy = 0xAA;
  242. completeMsg(&buffer, payloadSize);
  243. return buffer;
  244. }
  245. struct UBXMsgBuffer getAID_ALP(UBXU2_t* chunk, int chunkSize)
  246. {
  247. int payloadSize = sizeof(struct UBXAID_ALP) + chunkSize;
  248. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  249. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  250. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_ALP);
  251. memcpy(&(msg->payload) + sizeof(struct UBXAID_ALP), chunk, chunkSize);
  252. completeMsg(&buffer, payloadSize);
  253. return buffer;
  254. }
  255. struct UBXMsgBuffer getAID_AOP_POLL()
  256. {
  257. int payloadSize = sizeof(struct UBXAID_AOP_POLL);
  258. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  259. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  260. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_AOP);
  261. completeMsg(&buffer, payloadSize);
  262. return buffer;
  263. }
  264. struct UBXMsgBuffer getAID_AOP_POLL_OPT(UBXU1_t svid)
  265. {
  266. int payloadSize = sizeof(struct UBXAID_AOP_POLL_OPT);
  267. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  268. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  269. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_AOP);
  270. msg->payload.AID_AOP_POLL_OPT.svid = svid;
  271. completeMsg(&buffer, payloadSize);
  272. return buffer;
  273. }
  274. struct UBXMsgBuffer getAID_AOP(UBXU1_t svid, UBXU1_t data[59])
  275. {
  276. int payloadSize = sizeof(struct UBXAID_AOP);
  277. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  278. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  279. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_AOP);
  280. msg->payload.AID_AOP.svid = svid;
  281. memcpy(msg->payload.AID_AOP.data, data, 59*sizeof(UBXU1_t));
  282. completeMsg(&buffer, payloadSize);
  283. return buffer;
  284. }
  285. struct UBXMsgBuffer getAID_AOP_OPT(UBXU1_t svid, UBXU1_t data[59], UBXU1_t optional0[48], UBXU1_t optional1[48], UBXU1_t optional2[48])
  286. {
  287. int payloadSize = sizeof(struct UBXAID_AOP_OPT);
  288. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  289. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  290. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_AOP);
  291. msg->payload.AID_AOP_OPT.svid = svid;
  292. memcpy(msg->payload.AID_AOP_OPT.data, data, 59*sizeof(UBXU1_t));
  293. memcpy(msg->payload.AID_AOP_OPT.optional0, optional0, 48*sizeof(UBXU1_t));
  294. memcpy(msg->payload.AID_AOP_OPT.optional1, optional1, 48*sizeof(UBXU1_t));
  295. memcpy(msg->payload.AID_AOP_OPT.optional2, optional2, 48*sizeof(UBXU1_t));
  296. completeMsg(&buffer, payloadSize);
  297. return buffer;
  298. }
  299. struct UBXMsgBuffer getAID_DATA_POLL()
  300. {
  301. int payloadSize = sizeof(struct UBXAID_DATA_POLL);
  302. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  303. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  304. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_DATA);
  305. completeMsg(&buffer, payloadSize);
  306. return buffer;
  307. }
  308. struct UBXMsgBuffer getAID_EPH_POLL()
  309. {
  310. int payloadSize = sizeof(struct UBXAID_EPH_POLL);
  311. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  312. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  313. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_EPH);
  314. completeMsg(&buffer, payloadSize);
  315. return buffer;
  316. }
  317. struct UBXMsgBuffer getAID_EPH_POLL_OPT(UBXU1_t svid)
  318. {
  319. int payloadSize = sizeof(struct UBXAID_EPH_POLL_OPT);
  320. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  321. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  322. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_EPH);
  323. msg->payload.AID_EPH_POLL_OPT.svid = svid;
  324. completeMsg(&buffer, payloadSize);
  325. return buffer;
  326. }
  327. struct UBXMsgBuffer getAID_EPH(UBXU4_t svid, UBXU4_t how)
  328. {
  329. int payloadSize = sizeof(struct UBXAID_EPH);
  330. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  331. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  332. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_EPH);
  333. msg->payload.AID_EPH.svid = svid;
  334. msg->payload.AID_EPH.how = how;
  335. completeMsg(&buffer, payloadSize);
  336. return buffer;
  337. }
  338. struct UBXMsgBuffer getAID_EPH_OPT(UBXU4_t svid, UBXU4_t how, UBXU4_t sf1d[8], UBXU4_t sf2d[8], UBXU4_t sf3d[8])
  339. {
  340. int payloadSize = sizeof(struct UBXAID_EPH_OPT);
  341. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  342. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  343. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_EPH);
  344. msg->payload.AID_EPH_OPT.svid = svid;
  345. msg->payload.AID_EPH_OPT.how = how;
  346. memcpy(msg->payload.AID_EPH_OPT.sf1d, sf1d, 8*sizeof(UBXU4_t));
  347. memcpy(msg->payload.AID_EPH_OPT.sf2d, sf2d, 8*sizeof(UBXU4_t));
  348. memcpy(msg->payload.AID_EPH_OPT.sf3d, sf3d, 8*sizeof(UBXU4_t));
  349. completeMsg(&buffer, payloadSize);
  350. return buffer;
  351. }
  352. struct UBXMsgBuffer getAID_HUI_POLL()
  353. {
  354. int payloadSize = sizeof(struct UBXAID_HUI_POLL);
  355. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  356. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  357. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_HUI);
  358. completeMsg(&buffer, payloadSize);
  359. return buffer;
  360. }
  361. struct UBXMsgBuffer getAID_HUI(UBXI4_t health,
  362. UBXR4_t utcA0,
  363. UBXR4_t utcA1,
  364. UBXI4_t utcTOW,
  365. UBXI2_t utcWNT,
  366. UBXI2_t utcLS,
  367. UBXI2_t utcWNF,
  368. UBXI2_t utcDN,
  369. UBXI2_t utcLSF,
  370. UBXI2_t utcSpare,
  371. UBXR4_t klobA0,
  372. UBXR4_t klobA1,
  373. UBXR4_t klobA2,
  374. UBXR4_t klobA3,
  375. UBXR4_t klobB0,
  376. UBXR4_t klobB1,
  377. UBXR4_t klobB2,
  378. UBXR4_t klobB3,
  379. UBXX2_t flags)
  380. {
  381. int payloadSize = sizeof(struct UBXAID_HUI);
  382. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  383. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  384. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_HUI);
  385. msg->payload.AID_HUI.health = health;
  386. msg->payload.AID_HUI.utcA0 = utcA0;
  387. msg->payload.AID_HUI.utcA1 = utcA1;
  388. msg->payload.AID_HUI.utcTOW = utcTOW;
  389. msg->payload.AID_HUI.utcWNT = utcWNT;
  390. msg->payload.AID_HUI.utcLS = utcLS;
  391. msg->payload.AID_HUI.utcWNF = utcWNF;
  392. msg->payload.AID_HUI.utcDN = utcDN;
  393. msg->payload.AID_HUI.utcLSF = utcLSF;
  394. msg->payload.AID_HUI.utcSpare = utcSpare;
  395. msg->payload.AID_HUI.klobA0 = klobA0;
  396. msg->payload.AID_HUI.klobA1 = klobA1;
  397. msg->payload.AID_HUI.klobA2 = klobA2;
  398. msg->payload.AID_HUI.klobA3 = klobA3;
  399. msg->payload.AID_HUI.klobA0 = klobB0;
  400. msg->payload.AID_HUI.klobA1 = klobB1;
  401. msg->payload.AID_HUI.klobA2 = klobB2;
  402. msg->payload.AID_HUI.klobA3 = klobB3;
  403. msg->payload.AID_HUI.flags = flags;
  404. completeMsg(&buffer, payloadSize);
  405. return buffer;
  406. }
  407. struct UBXMsgBuffer getAID_INI_POLL()
  408. {
  409. int payloadSize = sizeof(struct UBXAID_INI_POLL);
  410. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  411. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  412. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_INI);
  413. completeMsg(&buffer, payloadSize);
  414. return buffer;
  415. }
  416. struct UBXMsgBuffer getAID_INI(UBXI1_t ecefXOrLat,
  417. UBXI1_t ecefYOrLat,
  418. UBXI1_t ecefZOrLat,
  419. UBXU1_t posAcc,
  420. UBXI1_t tmCfg,
  421. UBXU2_t wnoOrDate,
  422. UBXU4_t towOrDate,
  423. UBXI4_t towNs,
  424. UBXU4_t tAccMS,
  425. UBXU4_t tAccNS,
  426. UBXI4_t clkDOrFreq,
  427. UBXU4_t clkDAccOrFreqAcc,
  428. UBXX4_t flags)
  429. {
  430. int payloadSize = sizeof(struct UBXAID_INI);
  431. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  432. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  433. initMsg(msg, payloadSize, UBXMsgClassAID, UBXMsgIdAID_INI);
  434. msg->payload.AID_INI.ecefXOrLat = ecefXOrLat;
  435. msg->payload.AID_INI.ecefYOrLat = ecefYOrLat;
  436. msg->payload.AID_INI.ecefZOrLat = ecefZOrLat;
  437. msg->payload.AID_INI.posAcc = posAcc;
  438. msg->payload.AID_INI.tmCfg = tmCfg;
  439. msg->payload.AID_INI.wnoOrDate = wnoOrDate;
  440. msg->payload.AID_INI.towOrDate = towOrDate;
  441. msg->payload.AID_INI.towNs = towNs;
  442. msg->payload.AID_INI.tAccMS = tAccMS;
  443. msg->payload.AID_INI.tAccNS = tAccNS;
  444. msg->payload.AID_INI.clkDOrFreq = clkDOrFreq;
  445. msg->payload.AID_INI.clkDAccOrFreqAcc = clkDAccOrFreqAcc;
  446. msg->payload.AID_INI.flags = flags;
  447. completeMsg(&buffer, payloadSize);
  448. return buffer;
  449. }
  450. struct UBXMsgBuffer getCFG_ANT(UBXX2_t flags, struct UBXANTPins pins)
  451. {
  452. int payloadSize = sizeof(struct UBXCFG_ANT);
  453. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  454. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  455. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_ANT);
  456. msg->payload.CFG_ANT.flags = flags;
  457. msg->payload.CFG_ANT.pins = pins;
  458. completeMsg(&buffer, payloadSize);
  459. return buffer;
  460. }
  461. struct UBXMsgBuffer getCFG_ANT_POLL()
  462. {
  463. int payloadSize = sizeof(struct UBXCFG_ANT_POLL);
  464. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  465. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  466. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_ANT);
  467. completeMsg(&buffer, payloadSize);
  468. return buffer;
  469. }
  470. struct UBXMsgBuffer getCFG_CFG(UBXX4_t clearMask, UBXX4_t saveMask, UBXX4_t loadMask)
  471. {
  472. int payloadSize = sizeof(struct UBXCFG_CFG);
  473. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  474. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  475. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_CFG);
  476. msg->payload.CFG_CFG.clearMask = clearMask;
  477. msg->payload.CFG_CFG.saveMask = saveMask;
  478. msg->payload.CFG_CFG.loadMask = loadMask;
  479. completeMsg(&buffer, payloadSize);
  480. return buffer;
  481. }
  482. struct UBXMsgBuffer getCFG_CFG_OPT(UBXX4_t clearMask, UBXX4_t saveMask, UBXX4_t loadMask, UBXX1_t deviceMask)
  483. {
  484. int payloadSize = sizeof(struct UBXCFG_CFG_OPT);
  485. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  486. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  487. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_CFG);
  488. msg->payload.CFG_CFG_OPT.clearMask = clearMask;
  489. msg->payload.CFG_CFG_OPT.saveMask = saveMask;
  490. msg->payload.CFG_CFG_OPT.loadMask = loadMask;
  491. msg->payload.CFG_CFG_OPT.deviceMask = deviceMask;
  492. completeMsg(&buffer, payloadSize);
  493. return buffer;
  494. }
  495. struct UBXMsgBuffer getCFG_DAT_IN(UBXR8_t majA, UBXR8_t flat, UBXR4_t dX, UBXR4_t dY, UBXR4_t dZ, UBXR4_t rotX, UBXR4_t rotY, UBXR4_t rotZ, UBXR4_t scale)
  496. {
  497. int payloadSize = sizeof(struct UBXCFG_DAT_IN);
  498. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  499. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  500. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_CFG);
  501. msg->payload.CFG_DAT_IN.majA = majA;
  502. msg->payload.CFG_DAT_IN.flat = flat;
  503. msg->payload.CFG_DAT_IN.dX = dX;
  504. msg->payload.CFG_DAT_IN.dY = dY;
  505. msg->payload.CFG_DAT_IN.dZ = dZ;
  506. msg->payload.CFG_DAT_IN.rotX = rotX;
  507. msg->payload.CFG_DAT_IN.rotY = rotY;
  508. msg->payload.CFG_DAT_IN.rotZ = rotZ;
  509. msg->payload.CFG_DAT_IN.scale = scale;
  510. completeMsg(&buffer, payloadSize);
  511. return buffer;
  512. }
  513. struct UBXMsgBuffer getCFG_DAT_POLL()
  514. {
  515. int payloadSize = sizeof(struct UBXCFG_DAT_POLL);
  516. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  517. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  518. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_DAT);
  519. completeMsg(&buffer, payloadSize);
  520. return buffer;
  521. }
  522. struct UBXMsgBuffer getCFG_GNSS_POLL()
  523. {
  524. int payloadSize = sizeof(struct UBXCFG_GNSS_POLL);
  525. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  526. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  527. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_GNSS);
  528. completeMsg(&buffer, payloadSize);
  529. return buffer;
  530. }
  531. struct UBXMsgBuffer getCFG_GNSS(UBXU1_t msgVer,
  532. UBXU1_t numTrkChHw,
  533. UBXU1_t numTrkChUse,
  534. UBXU1_t numConfigBlocks,
  535. struct UBXCFG_GNSS_PART* gnssPart,
  536. int gnssPartCount)
  537. {
  538. int payloadSize = sizeof(struct UBXCFG_GNSS) + gnssPartCount*sizeof(struct UBXCFG_GNSS_PART);
  539. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  540. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  541. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_GNSS);
  542. msg->payload.CFG_GNSS.msgVer = msgVer;
  543. msg->payload.CFG_GNSS.numTrkChHw = numTrkChHw;
  544. msg->payload.CFG_GNSS.numTrkChUse = numTrkChUse;
  545. msg->payload.CFG_GNSS.numConfigBlocks = numConfigBlocks;
  546. memcpy(&(msg->payload.CFG_GNSS) + sizeof(struct UBXCFG_GNSS), gnssPart, gnssPartCount*sizeof(struct UBXCFG_GNSS_PART));
  547. completeMsg(&buffer, payloadSize);
  548. return buffer;
  549. }
  550. struct UBXMsgBuffer getCFG_INF_POLL(UBXU1_t protocolId)
  551. {
  552. int payloadSize = sizeof(struct UBXCFG_INF_POLL);
  553. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  554. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  555. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_INF);
  556. msg->payload.CFG_INF_POLL.protocolId = protocolId;
  557. completeMsg(&buffer, payloadSize);
  558. return buffer;
  559. }
  560. struct UBXMsgBuffer getCFG_INF(struct UBXCFG_INF_PART* infPart, int infPartCount)
  561. {
  562. int payloadSize = sizeof(struct UBXCFG_INF) + sizeof(struct UBXCFG_INF_PART)*infPartCount;
  563. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  564. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  565. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_INF);
  566. memcpy(&(msg->payload.CFG_INF) + sizeof(struct UBXCFG_INF), infPart, infPartCount*sizeof(struct UBXCFG_INF_PART));
  567. completeMsg(&buffer, payloadSize);
  568. return buffer;
  569. }
  570. struct UBXMsgBuffer getCFG_ITFM_POLL()
  571. {
  572. int payloadSize = sizeof(struct UBXCFG_ITFM_POLL);
  573. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  574. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  575. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_ITFM);
  576. completeMsg(&buffer, payloadSize);
  577. return buffer;
  578. }
  579. struct UBXMsgBuffer getCFG_ITFM(struct UBXITFMConfig config,
  580. struct UBXITFMConfig2 config2)
  581. {
  582. int payloadSize = sizeof(struct UBXCFG_ITFM);
  583. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  584. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  585. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_ITFM);
  586. msg->payload.CFG_ITFM.config = config;
  587. msg->payload.CFG_ITFM.config2 = config2;
  588. completeMsg(&buffer, payloadSize);
  589. return buffer;
  590. }
  591. struct UBXMsgBuffer getCFG_LOGFILTER_POLL()
  592. {
  593. int payloadSize = sizeof(struct UBXCFG_LOGFILTER_POLL);
  594. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  595. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  596. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_LOGFILTER);
  597. completeMsg(&buffer, payloadSize);
  598. return buffer;
  599. }
  600. struct UBXMsgBuffer getCFG_LOGFILTER(UBXU1_t version,
  601. UBXX1_t flags,
  602. UBXU2_t minIterval,
  603. UBXU2_t timeThreshold,
  604. UBXU2_t speedThreshold,
  605. UBXU4_t positionThreshold)
  606. {
  607. int payloadSize = sizeof(struct UBXCFG_LOGFILTER);
  608. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  609. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  610. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_LOGFILTER);
  611. msg->payload.CFG_LOGFILTER.version = version;
  612. msg->payload.CFG_LOGFILTER.flags = flags;
  613. msg->payload.CFG_LOGFILTER.minIterval = minIterval;
  614. msg->payload.CFG_LOGFILTER.timeThreshold = timeThreshold;
  615. msg->payload.CFG_LOGFILTER.speedThreshold = speedThreshold;
  616. msg->payload.CFG_LOGFILTER.positionThreshold = positionThreshold;
  617. completeMsg(&buffer, payloadSize);
  618. return buffer;
  619. }
  620. struct UBXMsgBuffer getCFG_NAV5_POLL()
  621. {
  622. int payloadSize = sizeof(struct UBXCFG_NAV5_POLL);
  623. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  624. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  625. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NAV5);
  626. completeMsg(&buffer, payloadSize);
  627. return buffer;
  628. }
  629. struct UBXMsgBuffer getCFG_NAV5(UBXX2_t mask,
  630. enum UBXNAV5Model dynModel,
  631. enum UBXNAV5FixMode fixMode,
  632. UBXI4_t fixedAlt,
  633. UBXU4_t fixedAltVar,
  634. UBXI1_t minElev,
  635. UBXU1_t drLimit,
  636. UBXU2_t pDop,
  637. UBXU2_t tDop,
  638. UBXU2_t pAcc,
  639. UBXU2_t tAcc,
  640. UBXU1_t staticHoldThresh,
  641. UBXU1_t dgpsTimeOut,
  642. UBXU1_t cnoThreshNumSVs,
  643. UBXU1_t cnoThresh)
  644. {
  645. int payloadSize = sizeof(struct UBXCFG_NAV5);
  646. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  647. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  648. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NAV5);
  649. msg->payload.CFG_NAV5.mask = mask;
  650. msg->payload.CFG_NAV5.dynModel = dynModel;
  651. msg->payload.CFG_NAV5.fixMode = fixMode;
  652. msg->payload.CFG_NAV5.fixedAlt = fixedAlt;
  653. msg->payload.CFG_NAV5.fixedAltVar = fixedAltVar;
  654. msg->payload.CFG_NAV5.minElev = minElev;
  655. msg->payload.CFG_NAV5.drLimit = drLimit;
  656. msg->payload.CFG_NAV5.pDop = pDop;
  657. msg->payload.CFG_NAV5.tDop = tDop;
  658. msg->payload.CFG_NAV5.pAcc = pAcc;
  659. msg->payload.CFG_NAV5.tAcc = tAcc;
  660. msg->payload.CFG_NAV5.staticHoldThresh = staticHoldThresh;
  661. msg->payload.CFG_NAV5.dgpsTimeOut = dgpsTimeOut;
  662. msg->payload.CFG_NAV5.cnoThreshNumSVs = cnoThreshNumSVs;
  663. msg->payload.CFG_NAV5.cnoThresh = cnoThresh;
  664. msg->payload.CFG_NAV5.reserved2 = 0;
  665. msg->payload.CFG_NAV5.reserved3 = 0;
  666. msg->payload.CFG_NAV5.reserved4 = 0;
  667. completeMsg(&buffer, payloadSize);
  668. return buffer;
  669. }
  670. struct UBXMsgBuffer getCFG_NAVX5_POLL()
  671. {
  672. int payloadSize = sizeof(struct UBXCFG_NAVX5_POLL);
  673. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  674. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  675. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NAVX5);
  676. completeMsg(&buffer, payloadSize);
  677. return buffer;
  678. }
  679. struct UBXMsgBuffer getCFG_NAVX5(UBXU2_t version,
  680. UBXX2_t mask1,
  681. UBXU1_t minSVs,
  682. UBXU1_t maxSVs,
  683. UBXU1_t minCNO,
  684. UBXU1_t iniFix3D,
  685. UBXU2_t wknRollover,
  686. UBXU1_t usePPP,
  687. UBXU1_t aopCFG,
  688. UBXU1_t aopOrbMaxErr)
  689. {
  690. int payloadSize = sizeof(struct UBXCFG_NAVX5);
  691. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  692. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  693. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NAVX5);
  694. msg->payload.CFG_NAVX5.version = version;
  695. msg->payload.CFG_NAVX5.mask1 = mask1;
  696. msg->payload.CFG_NAVX5.reserved0 = 0;
  697. msg->payload.CFG_NAVX5.reserved1 = 0;
  698. msg->payload.CFG_NAVX5.reserved2 = 0;
  699. msg->payload.CFG_NAVX5.minSVs = minSVs;
  700. msg->payload.CFG_NAVX5.maxSVs = maxSVs;
  701. msg->payload.CFG_NAVX5.minCNO = minCNO;
  702. msg->payload.CFG_NAVX5.reserved5 = 0;
  703. msg->payload.CFG_NAVX5.iniFix3D = iniFix3D;
  704. msg->payload.CFG_NAVX5.reserved6 = 0;
  705. msg->payload.CFG_NAVX5.reserved7 = 0;
  706. msg->payload.CFG_NAVX5.reserved8 = 0;
  707. msg->payload.CFG_NAVX5.wknRollover = wknRollover;
  708. msg->payload.CFG_NAVX5.reserved9 = 0;
  709. msg->payload.CFG_NAVX5.reserved10 = 0;
  710. msg->payload.CFG_NAVX5.reserved11 = 0;
  711. msg->payload.CFG_NAVX5.usePPP = usePPP;
  712. msg->payload.CFG_NAVX5.aopCFG = aopCFG;
  713. msg->payload.CFG_NAVX5.reserved12 = 0;
  714. msg->payload.CFG_NAVX5.reserved13 = 0;
  715. msg->payload.CFG_NAVX5.aopOrbMaxErr = aopOrbMaxErr;
  716. msg->payload.CFG_NAVX5.reserved14 = 0;
  717. msg->payload.CFG_NAVX5.reserved15 = 0;
  718. msg->payload.CFG_NAVX5.reserved3 = 0;
  719. msg->payload.CFG_NAVX5.reserved4 = 0;
  720. completeMsg(&buffer, payloadSize);
  721. return buffer;
  722. }
  723. struct UBXMsgBuffer getCFG_NMEA_POLL()
  724. {
  725. int payloadSize = sizeof(struct UBXCFG_NMEA_POLL);
  726. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  727. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  728. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NMEA);
  729. completeMsg(&buffer, payloadSize);
  730. return buffer;
  731. }
  732. struct UBXMsgBuffer getCFG_NMEA(UBXX1_t filter,
  733. UBXU1_t nmeaVersion,
  734. UBXU1_t numSV,
  735. UBXX1_t flags,
  736. UBXX4_t gnssToFilter,
  737. enum UBXNMEASVNumbering svNumbering,
  738. enum UBXNMEATalkerIds mainTalkerId,
  739. enum UBXNMEAGSVTalkerIds gsvTalkerId)
  740. {
  741. int payloadSize = sizeof(struct UBXCFG_NMEA);
  742. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  743. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  744. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NMEA);
  745. msg->payload.CFG_NMEA.filter = filter;
  746. msg->payload.CFG_NMEA.nmeaVersion = nmeaVersion;
  747. msg->payload.CFG_NMEA.numSV = numSV;
  748. msg->payload.CFG_NMEA.flags = flags;
  749. msg->payload.CFG_NMEA.gnssToFilter = gnssToFilter;
  750. msg->payload.CFG_NMEA.svNumbering = svNumbering;
  751. msg->payload.CFG_NMEA.mainTalkerId = mainTalkerId;
  752. msg->payload.CFG_NMEA.gsvTalkerId = gsvTalkerId;
  753. msg->payload.CFG_NMEA.reserved = 0;
  754. completeMsg(&buffer, payloadSize);
  755. return buffer;
  756. }
  757. struct UBXMsgBuffer getCFG_NVS(UBXX4_t clearMask,
  758. UBXX4_t saveMask,
  759. UBXX4_t loadMask,
  760. UBXX1_t deviceMask)
  761. {
  762. int payloadSize = sizeof(struct UBXCFG_NVS);
  763. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  764. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  765. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_NVS);
  766. msg->payload.CFG_NVS.clearMask = clearMask;
  767. msg->payload.CFG_NVS.saveMask = saveMask;
  768. msg->payload.CFG_NVS.loadMask = loadMask;
  769. msg->payload.CFG_NVS.deviceMask = deviceMask;
  770. completeMsg(&buffer, payloadSize);
  771. return buffer;
  772. }
  773. struct UBXMsgBuffer getCFG_PM2_POLL()
  774. {
  775. int payloadSize = sizeof(struct UBXCFG_PM2_POLL);
  776. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  777. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  778. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_PM2);
  779. completeMsg(&buffer, payloadSize);
  780. return buffer;
  781. }
  782. struct UBXMsgBuffer getCFG_PM2(struct UBXCFG_PM2Flags flags, UBXU4_t updatePeriod, UBXU4_t searchPeriod, UBXU4_t gridOffset, UBXU2_t onTime, UBXU2_t minAcqTime)
  783. {
  784. int payloadSize = sizeof(struct UBXCFG_PM2);
  785. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  786. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  787. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_PM2);
  788. msg->payload.CFG_PM2.flags = flags;
  789. msg->payload.CFG_PM2.updatePeriod = updatePeriod;
  790. msg->payload.CFG_PM2.searchPeriod = searchPeriod;
  791. msg->payload.CFG_PM2.gridOffset = gridOffset;
  792. msg->payload.CFG_PM2.onTime = onTime;
  793. msg->payload.CFG_PM2.minAcqTime = minAcqTime;
  794. completeMsg(&buffer, payloadSize);
  795. return buffer;
  796. }
  797. struct UBXMsgBuffer getCFG_PRT_POLL()
  798. {
  799. int payloadSize = sizeof(struct UBXCFG_PRT_POLL);
  800. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  801. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  802. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_PRT);
  803. completeMsg(&buffer, payloadSize);
  804. return buffer;
  805. }
  806. struct UBXMsgBuffer getCFG_PRT_POLL_OPT(UBXU1_t portId)
  807. {
  808. int payloadSize = sizeof(struct UBXCFG_PRT_POLL_OPT);
  809. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  810. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  811. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_PRT);
  812. msg->payload.CFG_PRT_POLL_OPT.portId = portId;
  813. completeMsg(&buffer, payloadSize);
  814. return buffer;
  815. }
  816. struct UBXMsgBuffer getCFG_PRT_UART()
  817. {
  818. //TODO
  819. struct UBXMsgBuffer buffer = createBuffer(0);
  820. return buffer;
  821. }
  822. struct UBXMsgBuffer getCFG_PRT_USB()
  823. {
  824. //TODO
  825. struct UBXMsgBuffer buffer = createBuffer(0);
  826. return buffer;
  827. }
  828. struct UBXMsgBuffer getCFG_PRT_SPI()
  829. {
  830. //TODO
  831. struct UBXMsgBuffer buffer = createBuffer(0);
  832. return buffer;
  833. }
  834. struct UBXMsgBuffer getCFG_PRT_DDC()
  835. {
  836. //TODO
  837. struct UBXMsgBuffer buffer = createBuffer(0);
  838. return buffer;
  839. }
  840. struct UBXMsgBuffer getCFG_RATE_POLL()
  841. {
  842. int payloadSize = sizeof(struct UBXCFG_RATE_POLL);
  843. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  844. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  845. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RATE);
  846. completeMsg(&buffer, payloadSize);
  847. return buffer;
  848. }
  849. struct UBXMsgBuffer getCFG_RATE(UBXU2_t measRate, UBXU2_t navRate, UBXU2_t timeRef)
  850. {
  851. int payloadSize = sizeof(struct UBXCFG_RATE);
  852. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  853. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  854. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RATE);
  855. msg->payload.CFG_RATE.measRate = measRate;
  856. msg->payload.CFG_RATE.navRate = navRate;
  857. msg->payload.CFG_RATE.timeRef = timeRef;
  858. completeMsg(&buffer, payloadSize);
  859. return buffer;
  860. }
  861. struct UBXMsgBuffer getCFG_RINV(UBXX1_t flags, UBXU1_t* data, int dataSize)
  862. {
  863. int payloadSize = sizeof(struct UBXCFG_RINV) + dataSize*sizeof(UBXU1_t);
  864. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  865. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  866. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RINV);
  867. msg->payload.CFG_RINV.flags = flags;
  868. memcpy(&(msg->payload.CFG_RINV) + sizeof(struct UBXCFG_RINV), data, dataSize*sizeof(UBXU1_t));
  869. completeMsg(&buffer, payloadSize);
  870. return buffer;
  871. }
  872. struct UBXMsgBuffer getCFG_RINV_POLL()
  873. {
  874. int payloadSize = sizeof(struct UBXCFG_RINV_POLL);
  875. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  876. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  877. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RINV);
  878. completeMsg(&buffer, payloadSize);
  879. return buffer;
  880. }
  881. struct UBXMsgBuffer getCFG_RXM(UBXU1_t lpMode)
  882. {
  883. int payloadSize = sizeof(struct UBXCFG_RXM);
  884. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  885. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  886. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RXM);
  887. msg->payload.CFG_RXM.reserved1 = 8;
  888. msg->payload.CFG_RXM.lpMode = lpMode;
  889. completeMsg(&buffer, payloadSize);
  890. return buffer;
  891. }
  892. struct UBXMsgBuffer getCFG_RXM_POLL()
  893. {
  894. int payloadSize = sizeof(struct UBXCFG_RXM_POLL);
  895. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  896. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  897. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_RXM);
  898. completeMsg(&buffer, payloadSize);
  899. return buffer;
  900. }
  901. struct UBXMsgBuffer getCFG_SBAS(UBXX1_t mode, UBXX1_t usage, UBXU1_t maxSBAS, UBXX1_t scanmode2, UBXX4_t scanmode1)
  902. {
  903. int payloadSize = sizeof(struct UBXCFG_SBAS);
  904. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  905. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  906. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_SBAS);
  907. msg->payload.CFG_SBAS.mode = mode;
  908. msg->payload.CFG_SBAS.usage = usage;
  909. msg->payload.CFG_SBAS.maxSBAS = maxSBAS;
  910. msg->payload.CFG_SBAS.scanmode2 = scanmode2;
  911. msg->payload.CFG_SBAS.scanmode1 = scanmode1;
  912. completeMsg(&buffer, payloadSize);
  913. return buffer;
  914. }
  915. struct UBXMsgBuffer getCFG_SBAS_POLL()
  916. {
  917. int payloadSize = sizeof(struct UBXCFG_SBAS_POLL);
  918. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  919. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  920. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_SBAS);
  921. completeMsg(&buffer, payloadSize);
  922. return buffer;
  923. }
  924. struct UBXMsgBuffer getCFG_TP5_POLL()
  925. {
  926. int payloadSize = sizeof(struct UBXCFG_TP5_POLL);
  927. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  928. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  929. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_TP5);
  930. completeMsg(&buffer, payloadSize);
  931. return buffer;
  932. }
  933. struct UBXMsgBuffer getCFG_USB_POLL()
  934. {
  935. int payloadSize = sizeof(struct UBXCFG_USB_POLL);
  936. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  937. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  938. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_USB);
  939. completeMsg(&buffer, payloadSize);
  940. return buffer;
  941. }
  942. struct UBXMsgBuffer getCFG_USB(UBXU2_t vendorId,
  943. UBXU2_t productId,
  944. UBXU2_t powerConsumption,
  945. UBXX2_t flags,
  946. UBXCH_t* vendorString,
  947. UBXCH_t* productString,
  948. UBXCH_t* serialNumber)
  949. {
  950. int payloadSize = sizeof(struct UBXCFG_USB);
  951. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  952. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  953. initMsg(msg, payloadSize, UBXMsgClassCFG, UBXMsgIdCFG_USB);
  954. msg->payload.CFG_USB.vendorId = vendorId;
  955. msg->payload.CFG_USB.productId = productId;
  956. msg->payload.CFG_USB.reserved1 = 0;
  957. msg->payload.CFG_USB.reserved2 = 1;
  958. msg->payload.CFG_USB.powerConsumption = powerConsumption;
  959. msg->payload.CFG_USB.flags = flags;
  960. int vendorStringSize = strlen(vendorString)>32?32:strlen(vendorString);
  961. memcpy(msg->payload.CFG_USB.vendorString, vendorString, vendorStringSize);
  962. int productStringSize = strlen(productString)>32?32:strlen(productString);
  963. memcpy(msg->payload.CFG_USB.productString, productString, productStringSize);
  964. int serialNumberSize = strlen(serialNumber)>32?32:strlen(serialNumber);
  965. memcpy(msg->payload.CFG_USB.serialNumber, serialNumber, serialNumberSize);
  966. completeMsg(&buffer, payloadSize);
  967. return buffer;
  968. }
  969. struct UBXMsgBuffer getLOG_CREATE(UBXU1_t version, UBXX1_t logCfg, UBXU1_t logSize, UBXU4_t userDefinedSize)
  970. {
  971. int payloadSize = sizeof(struct UBXLOG_CREATE);
  972. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  973. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  974. initMsg(msg, payloadSize, UBXMsgClassLOG, UBXMsgIdLOG_CREATE);
  975. msg->payload.LOG_CREATE.version = version;
  976. msg->payload.LOG_CREATE.logCfg = logCfg;
  977. msg->payload.LOG_CREATE.reserved = 0;
  978. msg->payload.LOG_CREATE.logSize = logSize;
  979. msg->payload.LOG_CREATE.userDefinedSize = userDefinedSize;
  980. completeMsg(&buffer, payloadSize);
  981. return buffer;
  982. }
  983. struct UBXMsgBuffer getLOG_ERASE()
  984. {
  985. int payloadSize = sizeof(struct UBXLOG_ERASE);
  986. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  987. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  988. initMsg(msg, payloadSize, UBXMsgClassLOG, UBXMsgIdLOG_ERASE);
  989. completeMsg(&buffer, payloadSize);
  990. return buffer;
  991. }
  992. struct UBXMsgBuffer getLOG_FINDTIME_IN(UBXU2_t year, UBXU1_t month, UBXU1_t day, UBXU1_t hour, UBXU1_t minute, UBXU1_t second)
  993. {
  994. int payloadSize = sizeof(struct UBXLOG_FINDTIME_IN);
  995. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  996. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  997. initMsg(msg, payloadSize, UBXMsgClassLOG, UBXMsgIdLOG_FINDTIME);
  998. msg->payload.LOG_FINDTIME_IN.version = 0;
  999. msg->payload.LOG_FINDTIME_IN.type = 0;
  1000. msg->payload.LOG_FINDTIME_IN.year = year;
  1001. msg->payload.LOG_FINDTIME_IN.month = month;
  1002. msg->payload.LOG_FINDTIME_IN.day = day;
  1003. msg->payload.LOG_FINDTIME_IN.hour = hour;
  1004. msg->payload.LOG_FINDTIME_IN.minute = minute;
  1005. msg->payload.LOG_FINDTIME_IN.second = second;
  1006. completeMsg(&buffer, payloadSize);
  1007. return buffer;
  1008. }
  1009. struct UBXMsgBuffer getLOG_INFO_POLL()
  1010. {
  1011. int payloadSize = sizeof(struct UBXLOG_INFO_POLL);
  1012. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1013. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1014. initMsg(msg, payloadSize, UBXMsgClassLOG, UBXMsgIdLOG_INFO);
  1015. completeMsg(&buffer, payloadSize);
  1016. return buffer;
  1017. }
  1018. struct UBXMsgBuffer getLOG_RETRIEVE(UBXU4_t startNumber,
  1019. UBXU4_t entryCount,
  1020. UBXU1_t version)
  1021. {
  1022. int payloadSize = sizeof(struct UBXLOG_RETRIEVE);
  1023. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1024. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1025. initMsg(msg, payloadSize, UBXMsgClassLOG, UBXMsgIdLOG_RETRIEVE);
  1026. msg->payload.LOG_RETRIEVE.startNumber = startNumber;
  1027. msg->payload.LOG_RETRIEVE.entryCount = entryCount;
  1028. msg->payload.LOG_RETRIEVE.version = version;
  1029. completeMsg(&buffer, payloadSize);
  1030. return buffer;
  1031. }
  1032. struct UBXMsgBuffer getLOG_STRING()
  1033. {
  1034. int payloadSize = sizeof(struct UBXLOG_STRING);
  1035. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1036. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1037. initMsg(msg, payloadSize, UBXMsgClassLOG, UBXMsgIdLOG_STRING);
  1038. completeMsg(&buffer, payloadSize);
  1039. return buffer;
  1040. }
  1041. struct UBXMsgBuffer getMON_VER_POLL()
  1042. {
  1043. int payloadSize = sizeof(struct UBXMON_VER_POLL);
  1044. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1045. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1046. initMsg(msg, payloadSize, UBXMsgClassMON, UBXMsgIdMON_VER);
  1047. completeMsg(&buffer, payloadSize);
  1048. return buffer;
  1049. }
  1050. struct UBXMsgBuffer getRXM_ALM_POLL()
  1051. {
  1052. int payloadSize = sizeof(struct UBXRXM_ALM_POLL);
  1053. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1054. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1055. initMsg(msg, payloadSize, UBXMsgClassRXM, UBXMsgIdRXM_ALM);
  1056. completeMsg(&buffer, payloadSize);
  1057. return buffer;
  1058. }
  1059. struct UBXMsgBuffer getRXM_ALM_POLL_OPT(UBXU1_t svid)
  1060. {
  1061. int payloadSize = sizeof(struct UBXRXM_ALM_POLL_OPT);
  1062. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1063. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1064. initMsg(msg, payloadSize, UBXMsgClassRXM, UBXMsgIdRXM_ALM);
  1065. msg->payload.RXM_ALM_POLL_OPT.svid = svid;
  1066. completeMsg(&buffer, payloadSize);
  1067. return buffer;
  1068. }
  1069. struct UBXMsgBuffer getRXM_EPH_POLL()
  1070. {
  1071. int payloadSize = sizeof(struct UBXRXM_EPH_POLL);
  1072. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1073. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1074. initMsg(msg, payloadSize, UBXMsgClassRXM, UBXMsgIdRXM_EPH);
  1075. completeMsg(&buffer, payloadSize);
  1076. return buffer;
  1077. }
  1078. struct UBXMsgBuffer getRXM_EPH_POLL_OPT(UBXU1_t svid)
  1079. {
  1080. int payloadSize = sizeof(struct UBXRXM_EPH_POLL_OPT);
  1081. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1082. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1083. initMsg(msg, payloadSize, UBXMsgClassRXM, UBXMsgIdRXM_ALM);
  1084. msg->payload.RXM_ALM_POLL_OPT.svid = svid;
  1085. completeMsg(&buffer, payloadSize);
  1086. return buffer;
  1087. }
  1088. struct UBXMsgBuffer getRXM_PMREQ(UBXU4_t duration, UBXX4_t flags)
  1089. {
  1090. int payloadSize = sizeof(struct UBXRXM_PMREQ);
  1091. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1092. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1093. initMsg(msg, payloadSize, UBXMsgClassRXM, UBXMsgIdRXM_PMREQ);
  1094. msg->payload.RXM_PMREQ.duration = duration;
  1095. msg->payload.RXM_PMREQ.flags = flags;
  1096. completeMsg(&buffer, payloadSize);
  1097. return buffer;
  1098. }
  1099. struct UBXMsgBuffer getRXM_SVSI(UBXU4_t iTOW,
  1100. UBXI2_t week,
  1101. UBXU1_t numVis,
  1102. UBXU1_t numSV,
  1103. struct UBXRXM_SVSI_PART* svsiPart,
  1104. int svsiPartCount)
  1105. {
  1106. int payloadSize = sizeof(struct UBXRXM_SVSI) + svsiPartCount*sizeof(struct UBXRXM_SVSI_PART);
  1107. struct UBXMsgBuffer buffer = createBuffer(payloadSize);
  1108. struct UBXMsg* msg = (struct UBXMsg*)buffer.data;
  1109. initMsg(msg, payloadSize, UBXMsgClassRXM, UBXMsgIdRXM_SVSI);
  1110. msg->payload.RXM_SVSI.iTOW = iTOW;
  1111. msg->payload.RXM_SVSI.week = week;
  1112. msg->payload.RXM_SVSI.numVis = numVis;
  1113. msg->payload.RXM_SVSI.numSV = numSV;
  1114. memcpy(&(msg->payload.RXM_SVSI) + sizeof(struct UBXRXM_SVSI), svsiPart, svsiPartCount*sizeof(struct UBXRXM_SVSI_PART));
  1115. completeMsg(&buffer, payloadSize);
  1116. return buffer;
  1117. }