it3256.cpp 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. #include "napi/native_api.h"
  2. #include "napi/native_node_api.h"
  3. #include "uart.h"
  4. #include <bits/alltypes.h>
  5. #include <stdlib.h>
  6. #include "advio.h"
  7. #include "hilog/log.h"
  8. #undef LOG_DOMAIN
  9. #undef LOG_TAG
  10. #define LOG_DOMAIN 0x3200
  11. #define LOG_TAG "MY_TAG"
  12. typedef struct {
  13. UART_HANDLE handle;
  14. } UartHandleWrapper;
  15. enum UartErrorCode { INVALID_ARGUMENT = -1, INTERNAL_INTERFACE_ERROR = -2, CREATE_ERROR = -3 };
  16. static napi_value AdvioDevInit(napi_env env, napi_callback_info info) {
  17. napi_value ret;
  18. size_t argc = 0;
  19. napi_value argv[0];
  20. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  21. if (argc != 0) {
  22. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  23. return nullptr;
  24. }
  25. ErrorCode result = AdvioDevInit();
  26. if (result == Success) {
  27. napi_create_int32(env, result, &ret);
  28. } else {
  29. char errorMessage[64];
  30. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  31. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  32. return nullptr;
  33. }
  34. return ret;
  35. }
  36. static napi_value AdvioDevClose(napi_env env, napi_callback_info info) {
  37. napi_value ret;
  38. size_t argc = 0;
  39. napi_value argv[0];
  40. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  41. if (argc != 0) {
  42. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  43. return nullptr;
  44. }
  45. ErrorCode result = AdvioDevClose();
  46. if (result == Success) {
  47. napi_create_int32(env, result, &ret);
  48. } else {
  49. char errorMessage[64];
  50. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  51. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  52. return nullptr;
  53. }
  54. return ret;
  55. }
  56. static napi_value AdvioGetSPIDevHandle(napi_env env, napi_callback_info info) {
  57. napi_value ret;
  58. size_t argc = 0;
  59. napi_value argv[0];
  60. int handle = 0;
  61. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  62. if (argc != 0) {
  63. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  64. return nullptr;
  65. }
  66. ErrorCode result = AdvioGetSPIDevHandle(&handle);
  67. if (result == Success) {
  68. napi_create_int32(env, handle, &ret);
  69. } else {
  70. char errorMessage[64];
  71. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u",
  72. result);
  73. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  74. return nullptr;
  75. }
  76. return ret;
  77. }
  78. static napi_value AdvioDevGetAIIntergration(napi_env env, napi_callback_info info) {
  79. napi_value ret;
  80. uint8_t flag = 0;
  81. size_t argc = 0;
  82. napi_value argv[0];
  83. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  84. if (argc != 0) {
  85. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  86. return nullptr;
  87. }
  88. ErrorCode result = AdvioDevGetAIIntergration(&flag);
  89. if (result == Success) {
  90. napi_create_uint32(env, flag, &ret);
  91. } else {
  92. char errorMessage[64];
  93. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  94. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  95. return nullptr;
  96. }
  97. return ret;
  98. }
  99. static napi_value AdvioDevGetDrvVersion(napi_env env, napi_callback_info info) {
  100. napi_value ret;
  101. uint32_t version = 0;
  102. size_t argc = 0;
  103. napi_value argv[0];
  104. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  105. if (argc != 0) {
  106. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  107. return nullptr;
  108. }
  109. ErrorCode result = AdvioDevGetDrvVersion(&version);
  110. if (result == Success) {
  111. napi_create_uint32(env, version, &ret);
  112. } else {
  113. char errorMessage[64];
  114. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  115. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  116. return nullptr;
  117. }
  118. return ret;
  119. }
  120. static napi_value AdvioDevGetADDevInfo(napi_env env, napi_callback_info info) {
  121. napi_value ret;
  122. char pname[256] = "Default AD Module Name";
  123. char pinfo[256] = "1.0.0";
  124. ErrorCode result = AdvioDevGetADDevInfo(pname, pinfo);
  125. if (result == Success) {
  126. napi_value obj;
  127. napi_create_object(env, &obj);
  128. napi_value nameValue;
  129. napi_create_string_utf8(env, pname, NAPI_AUTO_LENGTH, &nameValue);
  130. napi_set_named_property(env, obj, "adDevName", nameValue);
  131. napi_value infoValue;
  132. napi_create_string_utf8(env, pinfo, NAPI_AUTO_LENGTH, &infoValue);
  133. napi_set_named_property(env, obj, "adDevInfo", infoValue);
  134. ret = obj;
  135. } else {
  136. char errorMessage[64];
  137. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  138. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  139. return nullptr;
  140. }
  141. return ret;
  142. }
  143. static napi_value AdvioDevAICalibrate(napi_env env, napi_callback_info info) {
  144. napi_value ret;
  145. size_t argc = 2;
  146. napi_value argv[2];
  147. uint8_t chan, calitype;
  148. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  149. if (argc < 2) {
  150. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  151. return nullptr;
  152. }
  153. uint32_t tmp;
  154. if (napi_get_value_uint32(env, argv[0], &tmp) != napi_ok || tmp > 0xFF) {
  155. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  156. return nullptr;
  157. }
  158. chan = (uint8_t)tmp;
  159. if (napi_get_value_uint32(env, argv[1], &tmp) != napi_ok || tmp > 0xFF) {
  160. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  161. return nullptr;
  162. }
  163. calitype = (uint8_t)tmp;
  164. ErrorCode result = AdvioDevAICalibrate(chan, calitype);
  165. if (result == Success) {
  166. napi_create_int32(env, result, &ret);
  167. } else {
  168. char errorMessage[64];
  169. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  170. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  171. return nullptr;
  172. }
  173. return ret;
  174. }
  175. static napi_value AdvioDevAICalibrateFlash(napi_env env, napi_callback_info info) {
  176. napi_value ret;
  177. size_t argc = 1;
  178. napi_value argv[1];
  179. uint8_t act_type;
  180. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  181. if (argc < 1) {
  182. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  183. return nullptr;
  184. }
  185. uint32_t tmp;
  186. if (napi_get_value_uint32(env, argv[0], &tmp) != napi_ok || tmp > 0xFF) {
  187. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  188. return nullptr;
  189. }
  190. act_type = (uint8_t)tmp;
  191. ErrorCode result = AdvioDevAICalibrateFlash(act_type);
  192. if (result == Success) {
  193. napi_create_int32(env, result, &ret);
  194. } else {
  195. char errorMessage[64];
  196. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  197. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  198. return nullptr;
  199. }
  200. return ret;
  201. }
  202. static napi_value AdvioDevSetAIIntergration(napi_env env, napi_callback_info info) {
  203. napi_value ret;
  204. size_t argc = 1;
  205. napi_value argv[1];
  206. uint32_t flag;
  207. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  208. if (argc < 1) {
  209. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  210. return nullptr;
  211. }
  212. uint32_t tmp;
  213. if (napi_get_value_uint32(env, argv[0], &tmp) != napi_ok || tmp > 0xFF) {
  214. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  215. return nullptr;
  216. }
  217. flag = (uint8_t)tmp;
  218. ErrorCode result = AdvioDevSetAIIntergration(static_cast<uint8_t>(flag));
  219. if (result == Success) {
  220. napi_create_int32(env, result, &ret);
  221. } else {
  222. char errorMessage[64];
  223. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  224. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  225. return nullptr;
  226. }
  227. return ret;
  228. }
  229. static napi_value AdvioDevSetDoInitValue(napi_env env, napi_callback_info info) {
  230. size_t argc = 4;
  231. napi_value args[4];
  232. napi_value ret;
  233. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  234. if (argc != 4) {
  235. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  236. return nullptr;
  237. }
  238. uint32_t chStart, chCount, type;
  239. if (napi_get_value_uint32(env, args[0], &chStart) != napi_ok ||
  240. napi_get_value_uint32(env, args[1], &chCount) != napi_ok ||
  241. napi_get_value_uint32(env, args[2], &type) != napi_ok) {
  242. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  243. return nullptr;
  244. }
  245. napi_typedarray_type array_type;
  246. size_t length;
  247. void *data;
  248. napi_value buffer;
  249. size_t byte_offset;
  250. if (napi_get_typedarray_info(env, args[3], &array_type, &length, &data, &buffer, &byte_offset) != napi_ok) {
  251. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  252. return nullptr;
  253. }
  254. if (array_type != napi_uint32_array) {
  255. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  256. return nullptr;
  257. }
  258. ErrorCode result = AdvioDevSetDoInitValue(chStart, chCount, type, data);
  259. if (result == Success) {
  260. napi_create_int32(env, result, &ret);
  261. } else {
  262. char errorMessage[64];
  263. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  264. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  265. return nullptr;
  266. }
  267. return ret;
  268. }
  269. static napi_value AdvioDevGetAIRangeCode(napi_env env, napi_callback_info info) {
  270. /* size_t argc = 3;
  271. napi_value args[3];
  272. napi_value ret;
  273. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  274. // 参数校验
  275. if (argc < 3) {
  276. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  277. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  278. return ret;
  279. }
  280. // 解析startch
  281. unsigned char startch; // 修改为 unsigned char
  282. if (napi_get_value_uint32(env, args[0], reinterpret_cast<uint32_t *>(&startch)) != napi_ok ) {
  283. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  284. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  285. return ret;
  286. }
  287. // 解析stopch
  288. unsigned char stopch; // 修改为 unsigned char
  289. if (napi_get_value_uint32(env, args[1], reinterpret_cast<uint32_t *>(&stopch)) != napi_ok ) {
  290. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  291. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  292. return ret;
  293. }
  294. // 解析输出缓冲区
  295. void *poutbuf;
  296. size_t buffer_length;
  297. if (napi_get_buffer_info(env, args[2], &poutbuf, &buffer_length) != napi_ok) {
  298. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  299. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  300. return ret;
  301. }
  302. // 检查缓冲区大小是否足够
  303. if (buffer_length < (stopch - startch + 1)) {
  304. //OH_LOG_ERROR(LOG_APP, "Buffer is small");
  305. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  306. return ret;
  307. }
  308. ErrorCode result = AdvioDevGetAIRangeCode(startch, stopch, static_cast<unsigned char *>(poutbuf));
  309. // 返回错误码
  310. napi_create_uint32(env, static_cast<uint32_t>(result), &ret);
  311. return ret;*/
  312. size_t argc = 2;
  313. napi_value args[2];
  314. napi_value ret;
  315. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  316. if (argc != 2) {
  317. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  318. return nullptr;
  319. }
  320. unsigned char startch, stopch;
  321. uint32_t tmp;
  322. if (napi_get_value_uint32(env, args[0], &tmp) != napi_ok || tmp > 0xFF) {
  323. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  324. return nullptr;
  325. }
  326. startch = static_cast<unsigned char>(tmp);
  327. if (napi_get_value_uint32(env, args[1], &tmp) != napi_ok || tmp > 0xFF || tmp < startch) {
  328. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  329. return nullptr;
  330. }
  331. stopch = static_cast<unsigned char>(tmp);
  332. const uint32_t channelCount = stopch - startch + 1;
  333. const size_t bufferSize = channelCount * 2;
  334. void *bufferData;
  335. napi_value arrayBuffer;
  336. if (napi_create_arraybuffer(env, bufferSize, &bufferData, &arrayBuffer) != napi_ok) {
  337. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  338. return nullptr;
  339. }
  340. napi_value typedArray;
  341. if (napi_create_typedarray(env, napi_uint8_array, bufferSize, arrayBuffer, 0, &typedArray) != napi_ok) {
  342. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  343. return nullptr;
  344. }
  345. ErrorCode result =
  346. AdvioDevGetAIRangeCode(startch, stopch, static_cast<unsigned char *>(bufferData));
  347. if (result == Success) {
  348. return typedArray;
  349. } else {
  350. char errorMessage[64];
  351. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  352. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  353. return nullptr;
  354. }
  355. }
  356. static napi_value AdvioDevGetDoInitValue(napi_env env, napi_callback_info info) {
  357. napi_status status;
  358. size_t argc = 3;
  359. napi_value args[3];
  360. napi_value ret;
  361. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  362. if (argc != 3) {
  363. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  364. return nullptr;
  365. }
  366. uint32_t chStart, chCount, type;
  367. if (napi_get_value_uint32(env, args[0], &chStart) != napi_ok ||
  368. napi_get_value_uint32(env, args[1], &chCount) != napi_ok ||
  369. napi_get_value_uint32(env, args[2], &type) != napi_ok) {
  370. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  371. return nullptr;
  372. }
  373. size_t bufferLength = chCount * sizeof(uint32_t);
  374. void *bufferData = nullptr;
  375. napi_value arrayBuffer;
  376. status = napi_create_arraybuffer(env, bufferLength, &bufferData, &arrayBuffer);
  377. if (status != napi_ok || !bufferData) {
  378. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  379. return nullptr;
  380. }
  381. napi_value typedArray;
  382. status = napi_create_typedarray(env, napi_uint32_array, chCount, arrayBuffer, 0, &typedArray);
  383. if (status != napi_ok) {
  384. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  385. return nullptr;
  386. }
  387. ErrorCode result = AdvioDevGetDoInitValue(chStart, chCount, type, bufferData);
  388. if (result == Success) {
  389. return typedArray;
  390. } else {
  391. char errorMessage[64];
  392. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  393. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  394. return nullptr;
  395. }
  396. }
  397. static napi_value AdvioSPIProtoIO(napi_env env, napi_callback_info info) {
  398. size_t argc = 4;
  399. napi_value args[4];
  400. napi_value ret;
  401. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  402. if (argc != 4) {
  403. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  404. return nullptr;
  405. }
  406. uint8_t inputLen, printFlag, outputLen = 6;
  407. uint32_t tmp, handle;
  408. if (napi_get_value_uint32(env, args[0], &handle) != napi_ok) {
  409. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  410. return nullptr;
  411. }
  412. if (napi_get_value_uint32(env, args[2], &tmp) != napi_ok || tmp > 0xFF) {
  413. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  414. return nullptr;
  415. }
  416. inputLen = static_cast<uint8_t>(tmp);
  417. if (napi_get_value_uint32(env, args[3], &tmp) != napi_ok || tmp > 0xFF) {
  418. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  419. return nullptr;
  420. }
  421. printFlag = static_cast<uint8_t>(tmp);
  422. napi_typedarray_type array_type;
  423. size_t length;
  424. void *data;
  425. napi_value buffer;
  426. size_t byte_offset;
  427. if (napi_get_typedarray_info(env, args[1], &array_type, &length, &data, &buffer, &byte_offset) != napi_ok) {
  428. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  429. return nullptr;
  430. }
  431. if (array_type != napi_uint8_array) {
  432. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  433. return nullptr;
  434. }
  435. size_t bufferLength = 64;
  436. void *bufferData = nullptr;
  437. napi_value arrayBuffer;
  438. if (napi_create_arraybuffer(env, bufferLength, &bufferData, &arrayBuffer) != napi_ok || !bufferData) {
  439. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  440. return nullptr;
  441. }
  442. napi_value outputArray;
  443. if (napi_create_typedarray(env, napi_uint8_array, 64, arrayBuffer, 0, &outputArray) != napi_ok) {
  444. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  445. return nullptr;
  446. }
  447. ErrorCode result = AdvioSPIProtoIO(handle, static_cast<unsigned char *>(data), inputLen,
  448. static_cast<unsigned char *>(bufferData), &outputLen, printFlag);
  449. if (result == Success) {
  450. napi_value obj;
  451. napi_create_object(env, &obj);
  452. napi_value lenValue;
  453. napi_create_uint32(env, outputLen, &lenValue);
  454. napi_set_named_property(env, obj, "outputLen", lenValue);
  455. napi_set_named_property(env, obj, "outData", outputArray);
  456. ret = obj;
  457. } else {
  458. char errorMessage[64];
  459. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  460. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  461. return nullptr;
  462. }
  463. return ret;
  464. }
  465. static napi_value AdvioDevConstructSPIPackage(napi_env env, napi_callback_info info) {
  466. size_t argc = 5;
  467. napi_value args[5];
  468. napi_value ret;
  469. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  470. if (argc != 5) {
  471. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  472. return nullptr;
  473. }
  474. unsigned char moduleId, direction, commandId, bufLen;
  475. uint32_t tmp;
  476. if (napi_get_value_uint32(env, args[0], &tmp) != napi_ok || tmp > 0xFF) {
  477. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  478. return nullptr;
  479. }
  480. moduleId = static_cast<unsigned char>(tmp);
  481. if (napi_get_value_uint32(env, args[1], &tmp) != napi_ok || tmp > 0xFF) {
  482. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  483. return nullptr;
  484. }
  485. direction = static_cast<unsigned char>(tmp);
  486. if (napi_get_value_uint32(env, args[2], &tmp) != napi_ok || tmp > 0xFF) {
  487. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  488. return nullptr;
  489. }
  490. commandId = static_cast<unsigned char>(tmp);
  491. if (napi_get_value_uint32(env, args[4], &tmp) != napi_ok || tmp > 0xFF) {
  492. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  493. return nullptr;
  494. }
  495. bufLen = static_cast<unsigned char>(tmp);
  496. napi_typedarray_type array_type;
  497. size_t length;
  498. void *data;
  499. napi_value buffer;
  500. size_t byte_offset;
  501. if (napi_get_typedarray_info(env, args[3], &array_type, &length, &data, &buffer, &byte_offset) != napi_ok) {
  502. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  503. return nullptr;
  504. }
  505. if (array_type != napi_uint8_array) {
  506. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  507. return nullptr;
  508. }
  509. size_t bufferLength = 64;
  510. void *bufferData = nullptr;
  511. napi_value arrayBuffer;
  512. if (napi_create_arraybuffer(env, bufferLength, &bufferData, &arrayBuffer) != napi_ok || !bufferData) {
  513. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  514. return nullptr;
  515. }
  516. napi_value typedArray;
  517. if (napi_create_typedarray(env, napi_uint8_array, 64, arrayBuffer, 0, &typedArray) != napi_ok) {
  518. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  519. return nullptr;
  520. }
  521. ErrorCode result = AdvioDevConstructSPIPackage(moduleId, direction, commandId, static_cast<unsigned char *>(data),
  522. bufLen, static_cast<unsigned char *>(bufferData));
  523. if (result == Success) {
  524. return typedArray;
  525. } else {
  526. char errorMessage[128];
  527. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  528. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  529. return nullptr;
  530. }
  531. }
  532. static napi_value AdvioDevSetAIRangeCode(napi_env env, napi_callback_info info) {
  533. size_t argc = 3;
  534. napi_value args[3];
  535. napi_value ret;
  536. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  537. if (argc != 3) {
  538. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  539. return nullptr;
  540. }
  541. unsigned char startch, stopch;
  542. uint32_t tmp;
  543. if (napi_get_value_uint32(env, args[0], &tmp) != napi_ok || tmp > 0xFF) {
  544. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  545. return nullptr;
  546. }
  547. startch = static_cast<unsigned char>(tmp);
  548. if (napi_get_value_uint32(env, args[1], &tmp) != napi_ok || tmp > 0xFF || tmp < startch) {
  549. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  550. return nullptr;
  551. }
  552. stopch = static_cast<unsigned char>(tmp);
  553. const uint32_t channelCount = stopch - startch + 1;
  554. const size_t bufferSize = channelCount * 2;
  555. napi_typedarray_type array_type;
  556. size_t length;
  557. void *data;
  558. napi_value buffer;
  559. size_t byte_offset;
  560. if (napi_get_typedarray_info(env, args[2], &array_type, &length, &data, &buffer, &byte_offset) != napi_ok) {
  561. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  562. return nullptr;
  563. }
  564. if (array_type != napi_uint8_array || bufferSize != length) {
  565. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  566. return nullptr;
  567. }
  568. ErrorCode result = AdvioDevSetAIRangeCode(startch, stopch, static_cast<unsigned char *>(data));
  569. if (result == Success) {
  570. napi_create_int32(env, result, &ret);
  571. } else {
  572. char errorMessage[64];
  573. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  574. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  575. return nullptr;
  576. }
  577. return ret;
  578. }
  579. static napi_value AdvioDevAIRead(napi_env env, napi_callback_info info) {
  580. size_t argc = 2;
  581. napi_value args[2];
  582. napi_value ret;
  583. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  584. if (argc != 2) {
  585. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  586. return nullptr;
  587. }
  588. unsigned char startch, stopch;
  589. uint32_t tmp;
  590. if (napi_get_value_uint32(env, args[0], &tmp) != napi_ok || tmp > 0xFF) {
  591. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  592. return nullptr;
  593. }
  594. startch = static_cast<unsigned char>(tmp);
  595. if (napi_get_value_uint32(env, args[1], &tmp) != napi_ok || tmp > 0xFF || tmp < startch) {
  596. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  597. return nullptr;
  598. }
  599. stopch = static_cast<unsigned char>(tmp);
  600. const uint32_t channelCount = stopch - startch + 1;
  601. const size_t bufferSize = channelCount * 2;
  602. void *bufferData;
  603. napi_value arrayBuffer;
  604. if (napi_create_arraybuffer(env, bufferSize, &bufferData, &arrayBuffer) != napi_ok) {
  605. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  606. return nullptr;
  607. }
  608. napi_value typedArray;
  609. if (napi_create_typedarray(env, napi_uint8_array, bufferSize, arrayBuffer, 0, &typedArray) != napi_ok) {
  610. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  611. return nullptr;
  612. }
  613. ErrorCode result = AdvioDevAIRead(startch, stopch, static_cast<unsigned char *>(bufferData));
  614. if (result == Success) {
  615. return typedArray;
  616. } else {
  617. char errorMessage[64];
  618. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  619. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  620. return nullptr;
  621. }
  622. }
  623. static napi_value AdvioDevDIRead(napi_env env, napi_callback_info info) {
  624. napi_value ret;
  625. unsigned int di_value = 0;
  626. ErrorCode result = AdvioDevDIRead(&di_value);
  627. if (result == Success) {
  628. napi_create_int32(env, di_value, &ret);
  629. } else {
  630. char errorMessage[64];
  631. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  632. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  633. return nullptr;
  634. }
  635. return ret;
  636. }
  637. static napi_value AdvioDevDORead(napi_env env, napi_callback_info info) {
  638. napi_value ret;
  639. unsigned int do_value = 0;
  640. ErrorCode result = AdvioDevDORead(&do_value);
  641. if (result == Success) {
  642. napi_create_int32(env, do_value, &ret);
  643. } else {
  644. char errorMessage[64];
  645. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  646. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  647. return nullptr;
  648. }
  649. return ret;
  650. }
  651. static napi_value AdvioDevDOWriteAll(napi_env env, napi_callback_info info) {
  652. napi_value ret;
  653. size_t argc = 1;
  654. napi_value args[1];
  655. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  656. unsigned int value;
  657. if (argc < 1 || napi_get_value_uint32(env, args[0], &value) != napi_ok) {
  658. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  659. return nullptr;
  660. }
  661. ErrorCode result = AdvioDevDOWriteAll(value);
  662. if (result == Success) {
  663. napi_create_int32(env, result, &ret);
  664. } else {
  665. char errorMessage[64];
  666. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  667. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  668. return nullptr;
  669. }
  670. return ret;
  671. }
  672. static napi_value AdvioDevDOWriteOneChannel(napi_env env, napi_callback_info info) {
  673. napi_value ret;
  674. size_t argc = 2;
  675. napi_value args[2];
  676. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  677. unsigned int index;
  678. unsigned int value;
  679. if (argc < 2 || napi_get_value_uint32(env, args[0], &index) != napi_ok ||
  680. napi_get_value_uint32(env, args[1], &value) != napi_ok) {
  681. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  682. return nullptr;
  683. }
  684. ErrorCode result = AdvioDevDOWriteOneChannel(index, value);
  685. if (result == Success) {
  686. napi_create_int32(env, result, &ret);
  687. } else {
  688. char errorMessage[64];
  689. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  690. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  691. return nullptr;
  692. }
  693. return ret;
  694. }
  695. static napi_value AdvioDevGetDevInfo(napi_env env, napi_callback_info info) {
  696. napi_status status;
  697. size_t argc = 0;
  698. SPISearchDev dev_info = {0};
  699. status = napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
  700. if (status != napi_ok || argc != 0) {
  701. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  702. return nullptr;
  703. }
  704. napi_value ret;
  705. napi_create_object(env, &ret);
  706. napi_value value;
  707. ErrorCode result = AdvioDevGetDevInfo(&dev_info);
  708. if (result != Success) {
  709. char errorMessage[64];
  710. snprintf(errorMessage, sizeof(errorMessage), "Operation failed with code: %u", result);
  711. napi_throw_error(env, "OPERATION_FAILED", errorMessage);
  712. return nullptr;
  713. }
  714. napi_create_uint32(env, dev_info.uModuleMode, &value);
  715. napi_set_named_property(env, ret, "moduleMode", value);
  716. napi_create_string_utf8(env, (const char *)dev_info.ucModuleName, NAPI_AUTO_LENGTH, &value);
  717. napi_set_named_property(env, ret, "moduleName", value);
  718. napi_create_uint32(env, dev_info.ulModuleVersion, &value);
  719. napi_set_named_property(env, ret, "version", value);
  720. napi_create_uint32(env, dev_info.ucAINum, &value);
  721. napi_set_named_property(env, ret, "aiChannels", value);
  722. napi_create_uint32(env, dev_info.ucAONum, &value);
  723. napi_set_named_property(env, ret, "aoChannels", value);
  724. napi_create_uint32(env, dev_info.ucDINum, &value);
  725. napi_set_named_property(env, ret, "diChannels", value);
  726. napi_create_uint32(env, dev_info.ucDONum, &value);
  727. napi_set_named_property(env, ret, "doChannels", value);
  728. napi_create_uint32(env, dev_info.ulresv, &value);
  729. napi_set_named_property(env, ret, "reserved", value);
  730. return ret;
  731. }
  732. static napi_value UartInit(napi_env env, napi_callback_info info) {
  733. size_t argc = 5;
  734. napi_value args[5];
  735. napi_value ret;
  736. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  737. if (argc < 5) {
  738. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  739. return nullptr;
  740. }
  741. napi_valuetype types[5];
  742. for (int i = 0; i < 5; ++i) {
  743. napi_typeof(env, args[i], &types[i]);
  744. }
  745. if (types[0] != napi_string || types[1] != napi_number || types[2] != napi_number || types[3] != napi_number ||
  746. types[4] != napi_number) {
  747. napi_throw_error(env, "INVALID_ARGUMENTS", "Invalid arguments passed to the function");
  748. return nullptr;
  749. }
  750. char dev[32];
  751. size_t str_len;
  752. int baudrate, byteSize, stopBits, parity;
  753. napi_get_value_string_utf8(env, args[0], dev, sizeof(dev), &str_len);
  754. napi_get_value_int32(env, args[1], &baudrate);
  755. napi_get_value_int32(env, args[2], &byteSize);
  756. napi_get_value_int32(env, args[3], &stopBits);
  757. napi_get_value_int32(env, args[4], &parity);
  758. UART_HANDLE handle = UartInit(dev, baudrate, byteSize, stopBits, parity);
  759. napi_create_int32(env, handle, &ret);
  760. return ret;
  761. }
  762. static napi_value UartSend(napi_env env, napi_callback_info info) {
  763. size_t argc = 2;
  764. napi_value args[2];
  765. napi_value ret;
  766. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  767. if (argc != 2) {
  768. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  769. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  770. return ret;
  771. }
  772. int32_t handle;
  773. if (napi_get_value_int32(env, args[0], &handle) != napi_ok) {
  774. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  775. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  776. return ret;
  777. }
  778. napi_typedarray_type array_type;
  779. size_t array_length;
  780. void *data;
  781. napi_value buffer;
  782. size_t byte_offset;
  783. if (napi_get_typedarray_info(env, args[1], &array_type, &array_length, &data, &buffer, &byte_offset) != napi_ok) {
  784. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  785. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  786. return ret;
  787. }
  788. if (array_type != napi_uint8_array) {
  789. //OH_LOG_ERROR(LOG_APP, "array_type is uint8_array");
  790. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  791. return ret;
  792. }
  793. uint8_t *byteArray = (uint8_t *)data;
  794. int result = UartSend(handle, byteArray, array_length);
  795. if (result != array_length ) {
  796. //OH_LOG_ERROR(LOG_APP, "Send failed");
  797. napi_create_int32(env, INTERNAL_INTERFACE_ERROR, &ret);
  798. return ret;
  799. }
  800. napi_create_int32(env, result, &ret);
  801. return ret;
  802. }
  803. static napi_value UartRecv(napi_env env, napi_callback_info info) {
  804. size_t argc = 2;
  805. napi_value args[2];
  806. napi_value ret;
  807. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  808. if (argc < 2) {
  809. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  810. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  811. return ret;
  812. }
  813. int32_t handle;
  814. if (napi_get_value_int32(env, args[0], &handle) != napi_ok) {
  815. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  816. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  817. return ret;
  818. }
  819. void *buffer_data;
  820. size_t buffer_length;
  821. if (napi_get_buffer_info(env, args[1], &buffer_data, &buffer_length) != napi_ok) {
  822. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  823. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  824. return ret;
  825. }
  826. int result = UartRecv(handle, buffer_data, buffer_length);
  827. if (result > 0) {
  828. napi_create_int32(env, result, &ret);
  829. } else {
  830. //OH_LOG_ERROR(LOG_APP, "Receive failed");
  831. napi_create_int32(env, INTERNAL_INTERFACE_ERROR, &ret);
  832. }
  833. return ret;
  834. }
  835. static napi_value UartUninit(napi_env env, napi_callback_info info) {
  836. size_t argc = 1;
  837. napi_value args[1];
  838. napi_value ret;
  839. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  840. if (argc < 1) {
  841. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  842. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  843. return ret;
  844. }
  845. int32_t handle;
  846. if (napi_get_value_int32(env, args[0], &handle) != napi_ok) {
  847. //OH_LOG_ERROR(LOG_APP, "Invalid arguments");
  848. napi_create_int32(env, INVALID_ARGUMENT, &ret);
  849. return ret;
  850. }
  851. int result = UartUninit(handle);
  852. napi_create_int32(env, result, &ret);
  853. return ret;
  854. }
  855. EXTERN_C_START
  856. static napi_value Init(napi_env env, napi_value exports) {
  857. napi_property_descriptor desc[] = {
  858. {"uartInit", nullptr, UartInit, nullptr, nullptr, nullptr, napi_default, nullptr},
  859. {"uartSend", nullptr, UartSend, nullptr, nullptr, nullptr, napi_default, nullptr},
  860. {"uartRecv", nullptr, UartRecv, nullptr, nullptr, nullptr, napi_default, nullptr},
  861. {"uartUninit", nullptr, UartUninit, nullptr, nullptr, nullptr, napi_default, nullptr},
  862. {"devInit", nullptr, AdvioDevInit, nullptr, nullptr, nullptr, napi_default, nullptr},
  863. {"devClose", nullptr, AdvioDevClose, nullptr, nullptr, nullptr, napi_default, nullptr},
  864. {"devGetAIRangeCode", nullptr, AdvioDevGetAIRangeCode, nullptr, nullptr, nullptr, napi_default, nullptr},
  865. {"devSetAIRangeCode", nullptr, AdvioDevSetAIRangeCode, nullptr, nullptr, nullptr, napi_default, nullptr},
  866. {"devAIRead", nullptr, AdvioDevAIRead, nullptr, nullptr, nullptr, napi_default, nullptr},
  867. {"devDIRead", nullptr, AdvioDevDIRead, nullptr, nullptr, nullptr, napi_default, nullptr},
  868. {"devDORead", nullptr, AdvioDevDORead, nullptr, nullptr, nullptr, napi_default, nullptr},
  869. {"devDOWriteAll", nullptr, AdvioDevDOWriteAll, nullptr, nullptr, nullptr, napi_default, nullptr},
  870. {"devDOWriteOneChannel", nullptr, AdvioDevDOWriteOneChannel, nullptr, nullptr, nullptr, napi_default,
  871. nullptr},
  872. {"devGetDevInfo", nullptr, AdvioDevGetDevInfo, nullptr, nullptr, nullptr, napi_default, nullptr},
  873. {"getSPIDevHandle", nullptr, AdvioGetSPIDevHandle, nullptr, nullptr, nullptr, napi_default, nullptr},
  874. {"devGetADDevInfo", nullptr, AdvioDevGetADDevInfo, nullptr, nullptr, nullptr, napi_default, nullptr},
  875. {"devAICalibrate", nullptr, AdvioDevAICalibrate, nullptr, nullptr, nullptr, napi_default, nullptr},
  876. {"devAICalibrateFlash", nullptr, AdvioDevAICalibrateFlash, nullptr, nullptr, nullptr, napi_default,
  877. nullptr},
  878. {"devSetAIIntergration", nullptr, AdvioDevSetAIIntergration, nullptr, nullptr, nullptr, napi_default,
  879. nullptr},
  880. {"devGetAIIntergration", nullptr, AdvioDevGetAIIntergration, nullptr, nullptr, nullptr, napi_default,
  881. nullptr},
  882. {"devGetDrvVersion", nullptr, AdvioDevGetDrvVersion, nullptr, nullptr, nullptr, napi_default, nullptr},
  883. {"devSetDoInitValue", nullptr, AdvioDevSetDoInitValue, nullptr, nullptr, nullptr, napi_default, nullptr},
  884. {"devGetDoInitValue", nullptr, AdvioDevGetDoInitValue, nullptr, nullptr, nullptr, napi_default, nullptr},
  885. {"devConstructSPIPackage", nullptr, AdvioDevConstructSPIPackage, nullptr, nullptr, nullptr, napi_default,
  886. nullptr},
  887. {"spiProtoIO", nullptr, AdvioSPIProtoIO, nullptr, nullptr, nullptr, napi_default, nullptr},
  888. };
  889. napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
  890. return exports;
  891. }
  892. EXTERN_C_END
  893. // 模块定义
  894. static napi_module demoModule = {
  895. .nm_version = 1,
  896. .nm_flags = 0,
  897. .nm_filename = nullptr,
  898. .nm_register_func = Init,
  899. .nm_modname = "it3256",
  900. .nm_priv = ((void *)0),
  901. .reserved = {0},
  902. };
  903. extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }