main.cpp 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489
  1. #include <iostream>
  2. #include <memory>
  3. #include <windows.h>
  4. #include <tuple>
  5. #include "picofunctions.h"
  6. #include "pugiconfig.hpp"
  7. #include "pugixml.hpp"
  8. #include "simplelogger.hpp"
  9. #include "parser.hpp"
  10. #include "src/PassiveSocket.h"
  11. #define MAX_PACKET 4096
  12. using namespace std;
  13. extern ostream out(cout.rdbuf());
  14. extern SimpleLogger logger(out, "pico", "picologs");
  15. class PicoLocalService
  16. {
  17. private:
  18. CActiveSocket* SocketActive;
  19. const static uint8_t magic_number = 0xAA;
  20. int16_t handle = 0;
  21. uint8_t last_command = 0x00;
  22. uint32_t error_code = 0x00000000;
  23. int32_t points_value = 0;
  24. uint32_t sample_rate = 0;
  25. std::vector<uint32_t> times;
  26. uint32_t num_triggers = 0;
  27. uint32_t number_channels = 0;
  28. std::vector<PS4000A_CHANNEL> channels;
  29. std::vector<uint32_t> points_vector;
  30. uint32_t points_simple = 0;
  31. uint32_t premeasurement_percentage = 0;
  32. PS4000A_CONDITION* conditions;
  33. PS4000A_CHANNEL trig_channel = PS4000A_CHANNEL_A;
  34. PS4000A_THRESHOLD_DIRECTION th_direction = PS4000A_ABOVE;
  35. int16_t threshold = 0;
  36. int16_t trig_delay = 0;
  37. int16_t trig_autoTrigger_ms = 0;
  38. uint32_t nbytes_sent = 0;
  39. std::vector<std::vector<int16_t*>> data_buffer_vec;
  40. std::vector<int16_t*> simple_data_buffer;
  41. uint8_t rcbuf[MAX_PACKET]{0};
  42. uint8_t sndbuf[MAX_PACKET]{0};
  43. public:
  44. PicoLocalService(CActiveSocket* socket) : SocketActive(socket) {}
  45. ~PicoLocalService() {}
  46. int get_request() {
  47. // Check if buffer has at least 2 bytes for magic number and command
  48. // Receive data from socket
  49. int bytes_recieved = SocketActive->Receive(MAX_PACKET, rcbuf);
  50. if(bytes_recieved == 0)
  51. {
  52. logger << LogPref::Flag(ERROR) << "Client disconnected" << endl;
  53. pico_stop();
  54. pico_close();
  55. return 0;
  56. }
  57. if(bytes_recieved < 2)
  58. {
  59. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  60. sndbuf[0] = magic_number;
  61. sndbuf[1] = 0xFF; // Error flag
  62. sndbuf[2] = 0x01; // Error type
  63. this->error_code = 0x00000000; // No pico error
  64. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  65. if(SocketActive->Send(sndbuf, 7) == -1) {
  66. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  67. }
  68. return -1;
  69. }
  70. // Extract magic number from buffer
  71. uint8_t magic;
  72. memcpy(&magic, rcbuf, sizeof(uint8_t));
  73. // Check if magic number is correct
  74. if (magic != this->magic_number) {
  75. logger << LogPref::Flag(ERROR) << "Invalid magic number: " << std::hex << magic << endl;
  76. sndbuf[0] = magic_number;
  77. sndbuf[1] = 0xFF;
  78. sndbuf[2] = 0x03;
  79. this->error_code = 0x00000000;
  80. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  81. if(SocketActive->Send(sndbuf, 7) == -1) {
  82. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  83. }
  84. return -1;
  85. }
  86. // Extract command from buffer
  87. uint8_t cmd;
  88. memcpy(&cmd, rcbuf + 1, sizeof(uint8_t));
  89. // Check if command is correct
  90. switch(cmd)
  91. {
  92. case 0x01:
  93. {
  94. this->last_command = 0x01;
  95. logger << LogPref::Flag(INFO) << "Command 0x01 received" << endl;
  96. pico_open();
  97. logger << LogPref::Flag(INFO) << "Pico device opened" << endl;
  98. break;
  99. }
  100. case 0x02:
  101. {
  102. this->last_command = 0x02;
  103. logger << LogPref::Flag(INFO) << "Command 0x02 received" << endl;
  104. if(bytes_recieved < 7) {
  105. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  106. sndbuf[0] = magic_number;
  107. sndbuf[1] = 0xFF;
  108. sndbuf[2] = 0x01;
  109. this->error_code = 0x00000000;
  110. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  111. if(SocketActive->Send(sndbuf, 7) == -1) {
  112. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  113. }
  114. return -1;
  115. }
  116. uint32_t size;
  117. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  118. if(size < 1) {
  119. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  120. sndbuf[0] = magic_number;
  121. sndbuf[1] = 0xFF;
  122. sndbuf[2] = 0x02;
  123. this->error_code = 0x00000000;
  124. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  125. if(SocketActive->Send(sndbuf, 7) == -1) {
  126. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  127. }
  128. return -1;
  129. }
  130. char* file_name = new char[size + 1];
  131. memcpy(file_name, rcbuf + 6, size * sizeof(char));
  132. file_name[size] = '\0'; // Null-terminate the string
  133. std::string file_name_str(file_name);
  134. logger << LogPref::Flag(INFO) << "File name: " << file_name_str << endl;
  135. pico_xml_config(file_name_str);
  136. logger << LogPref::Flag(INFO) << "Pico device configured" << endl;
  137. delete[] file_name;
  138. break;
  139. }
  140. case 0x0C:
  141. {
  142. this->last_command = 0x0C;
  143. logger << LogPref::Flag(INFO) << "Command 0x0C received" << endl;
  144. if(bytes_recieved < 22) {
  145. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  146. return -1;
  147. sndbuf[0] = magic_number;
  148. sndbuf[1] = 0xFF;
  149. sndbuf[2] = 0x01;
  150. this->error_code = 0x00000000;
  151. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  152. if(SocketActive->Send(sndbuf, 7) == -1) {
  153. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  154. }
  155. return -1;
  156. }
  157. uint32_t size;
  158. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  159. if(size < 1) {
  160. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  161. sndbuf[0] = magic_number;
  162. sndbuf[1] = 0xFF;
  163. sndbuf[2] = 0x02;
  164. this->error_code = 0x00000000;
  165. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  166. if(SocketActive->Send(sndbuf, 7) == -1) {
  167. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  168. }
  169. return -1;
  170. }
  171. uint32_t* apoints = new uint32_t[size];
  172. memcpy(apoints, rcbuf + 6, size * sizeof(uint32_t));
  173. uint32_t* atimes = new uint32_t[size];
  174. memcpy(atimes, rcbuf + 6 + size * sizeof(uint32_t), size * sizeof(uint32_t));
  175. uint32_t sample_rate = 0;
  176. memcpy(&sample_rate, rcbuf + 6 + 2 * size * sizeof(uint32_t), sizeof(uint32_t));
  177. uint32_t number_channels = 0;
  178. memcpy(&number_channels, rcbuf + 10 + 2 * size * sizeof(uint32_t), sizeof(uint32_t));
  179. pico_set_params(apoints, atimes, sample_rate, number_channels, size);
  180. logger << LogPref::Flag(INFO) << "Pico device parameters set" << endl;
  181. delete[] apoints;
  182. delete[] atimes;
  183. break;
  184. }
  185. case 0x03:
  186. {
  187. this->last_command = 0x03;
  188. logger << LogPref::Flag(INFO) << "Command 0x03 received" << endl;
  189. pico_close();
  190. logger << LogPref::Flag(INFO) << "Pico device closed" << endl;
  191. break;
  192. }
  193. case 0x04:
  194. {
  195. // Check if buffer has enough data for version numbers
  196. this->last_command = 0x04;
  197. logger << LogPref::Flag(INFO) << "Command 0x04 received" << endl;
  198. pico_get_current_params();
  199. logger << LogPref::Flag(INFO) << "Pico device parameters retrieved" << endl;
  200. break;
  201. }
  202. case 0x05:
  203. {
  204. this->last_command = 0x05;
  205. logger << LogPref::Flag(INFO) << "Command 0x05 received" << endl;
  206. pico_probe();
  207. logger << LogPref::Flag(INFO) << "Pico device probed" << endl;
  208. break;
  209. }
  210. case 0x06:
  211. {
  212. this->last_command = 0x06;
  213. logger << LogPref::Flag(INFO) << "Command 0x06 received" << endl;
  214. if(bytes_recieved < 10) {
  215. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  216. sndbuf[0] = magic_number;
  217. sndbuf[1] = 0xFF;
  218. sndbuf[2] = 0x01;
  219. this->error_code = 0x00000000;
  220. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  221. if(SocketActive->Send(sndbuf, 7) == -1) {
  222. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  223. }
  224. return -1;
  225. }
  226. uint32_t size;
  227. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  228. if(size < 1) {
  229. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  230. sndbuf[0] = magic_number;
  231. sndbuf[1] = 0xFF;
  232. sndbuf[2] = 0x02;
  233. this->error_code = 0x00000000;
  234. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  235. if(SocketActive->Send(sndbuf, 7) == -1) {
  236. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  237. }
  238. return -1;
  239. }
  240. uint32_t* apoints = new uint32_t[size];
  241. memcpy(apoints, rcbuf + 6, size * sizeof(uint32_t));
  242. pico_set_points(apoints, size);
  243. logger << LogPref::Flag(INFO) << "Pico device points set" << endl;
  244. delete[] apoints;
  245. break;
  246. }
  247. case 0x07:
  248. {
  249. this->last_command = 0x07;
  250. logger << LogPref::Flag(INFO) << "Command 0x07 received" << endl;
  251. if(bytes_recieved < 6) {
  252. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  253. sndbuf[0] = magic_number;
  254. sndbuf[1] = 0xFF;
  255. sndbuf[2] = 0x01;
  256. this->error_code = 0x00000000;
  257. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  258. if(SocketActive->Send(sndbuf, 7) == -1) {
  259. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  260. }
  261. return -1;
  262. }
  263. uint32_t sample_rate = 0;
  264. memcpy(&sample_rate, rcbuf + 2, sizeof(uint32_t));
  265. pico_set_sample_rate(sample_rate);
  266. logger << LogPref::Flag(INFO) << "Pico device sample rate set" << endl;
  267. break;
  268. }
  269. case 0x08:
  270. {
  271. this->last_command = 0x08;
  272. logger << LogPref::Flag(INFO) << "Command 0x08 received" << endl;
  273. if(bytes_recieved < 10) {
  274. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  275. sndbuf[0] = magic_number;
  276. sndbuf[1] = 0xFF;
  277. sndbuf[2] = 0x01;
  278. this->error_code = 0x00000000;
  279. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  280. if(SocketActive->Send(sndbuf, 7) == -1) {
  281. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  282. }
  283. return -1;
  284. }
  285. uint32_t size;
  286. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  287. if(size < 1) {
  288. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  289. sndbuf[0] = magic_number;
  290. sndbuf[1] = 0xFF;
  291. sndbuf[2] = 0x02;
  292. this->error_code = 0x00000000;
  293. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  294. if(SocketActive->Send(sndbuf, 7) == -1) {
  295. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  296. }
  297. return -1;
  298. }
  299. uint32_t* atimes = new uint32_t[size];
  300. memcpy(atimes, rcbuf + 6, size * sizeof(uint32_t));
  301. pico_set_times(atimes, size);
  302. logger << LogPref::Flag(INFO) << "Pico device times set" << endl;
  303. delete[] atimes;
  304. break;
  305. }
  306. case 0x09:
  307. {
  308. this->last_command = 0x09;
  309. logger << LogPref::Flag(INFO) << "Command 0x09 received" << endl;
  310. if(bytes_recieved < 16) {
  311. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  312. sndbuf[0] = magic_number;
  313. sndbuf[1] = 0xFF;
  314. sndbuf[2] = 0x01;
  315. this->error_code = 0x00000000;
  316. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  317. if(SocketActive->Send(sndbuf, 7) == -1) {
  318. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  319. }
  320. return -1;
  321. }
  322. uint32_t channels = 0;
  323. memcpy(&channels, rcbuf + 2, sizeof(uint32_t));
  324. if(channels < 1 || channels > 16) {
  325. logger << LogPref::Flag(ERROR) << "Invalid number of channels" << endl;
  326. sndbuf[0] = magic_number;
  327. sndbuf[1] = 0xFF;
  328. sndbuf[2] = 0x02;
  329. this->error_code = 0x00000000;
  330. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  331. if(SocketActive->Send(sndbuf, 7) == -1) {
  332. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  333. }
  334. return -1;
  335. }
  336. enPicoConnectProbeRange* channels_range = new enPicoConnectProbeRange[channels];
  337. memset(channels_range, PICO_X1_PROBE_5V, sizeof(uint8_t) * channels);
  338. memcpy(channels_range, rcbuf + 6, sizeof(uint8_t) * channels);
  339. uint8_t trigger_channel = 0;
  340. memcpy(&trigger_channel, rcbuf + 6 + channels, sizeof(uint8_t));
  341. int32_t direction = 0;
  342. memcpy(&direction, rcbuf + 7 + channels, sizeof(int32_t));
  343. uint16_t threshold = 0;
  344. memcpy(&threshold, rcbuf + 11 + channels, sizeof(uint16_t));
  345. int16_t autoTrigger_ms = 0;
  346. memcpy(&autoTrigger_ms, rcbuf + 13, sizeof(int16_t));
  347. pico_configure_channels(channels, channels_range, trigger_channel, direction, threshold, autoTrigger_ms);
  348. logger << LogPref::Flag(INFO) << "Pico device channels configured" << endl;
  349. break;
  350. }
  351. case 0x0A:
  352. {
  353. this->last_command = 0x0A;
  354. logger << LogPref::Flag(INFO) << "Command 0x0A received" << endl;
  355. pico_begin_measurement_times();
  356. logger << LogPref::Flag(INFO) << "Pico device measurement started" << endl;
  357. break;
  358. }
  359. case 0x0D:
  360. {
  361. this->last_command = 0x0D;
  362. logger << LogPref::Flag(INFO) << "Command 0x0B received" << endl;
  363. int ret = pico_exit();
  364. if(ret == 0) {
  365. logger << LogPref::Flag(INFO) << "Pico device exited successfully" << endl;
  366. return 0;
  367. } else {
  368. logger << LogPref::Flag(ERROR) << "Failed to exit Pico device" << endl;
  369. }
  370. break;
  371. }
  372. case 0x0E:
  373. {
  374. this->last_command = 0x0E;
  375. logger << LogPref::Flag(INFO) << "Command 0x0E received" << endl;
  376. pico_stop();
  377. logger << LogPref::Flag(INFO) << "Pico device stopped" << endl;
  378. break;
  379. }
  380. case 0x20:
  381. {
  382. this->last_command = 0x20;
  383. logger << LogPref::Flag(INFO) << "Command 0x0F received" << endl;
  384. if(bytes_recieved < 12) {
  385. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  386. sndbuf[0] = magic_number;
  387. sndbuf[1] = 0xFF;
  388. sndbuf[2] = 0x01;
  389. this->error_code = 0x00000000;
  390. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  391. if(SocketActive->Send(sndbuf, 7) == -1) {
  392. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  393. }
  394. return -1;
  395. }
  396. uint32_t trigger_channel = 0;
  397. memcpy(&trigger_channel, rcbuf + 2, sizeof(uint32_t));
  398. int32_t direction = 0;
  399. memcpy(&direction, rcbuf + 6, sizeof(int32_t));
  400. uint16_t threshold = 0;
  401. memcpy(&threshold, rcbuf + 10, sizeof(uint16_t));
  402. int16_t autoTrigger_ms = 0;
  403. memcpy(&autoTrigger_ms, rcbuf + 12, sizeof(int16_t));
  404. pico_configure_trigger(trigger_channel, direction, threshold, autoTrigger_ms);
  405. break;
  406. }
  407. case 0x28:
  408. {
  409. this->last_command = 0x28;
  410. logger << LogPref::Flag(INFO) << "Command 0x28 received" << endl;
  411. if(bytes_recieved < 6) {
  412. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  413. sndbuf[0] = magic_number;
  414. sndbuf[1] = 0xFF;
  415. sndbuf[2] = 0x01;
  416. this->error_code = 0x00000000;
  417. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  418. if(SocketActive->Send(sndbuf, 7) == -1) {
  419. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  420. }
  421. return -1;
  422. }
  423. uint32_t percentage = 0;
  424. memcpy(&percentage, rcbuf + 2, sizeof(uint32_t));
  425. if(percentage < 0 || percentage > 100) {
  426. logger << LogPref::Flag(ERROR) << "Invalid premeasurement percentage" << endl;
  427. sndbuf[0] = magic_number;
  428. sndbuf[1] = 0xFF;
  429. sndbuf[2] = 0x02;
  430. this->error_code = 0x00000000;
  431. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  432. if(SocketActive->Send(sndbuf, 7) == -1) {
  433. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  434. }
  435. return -1;
  436. }
  437. pico_set_premeasurement(percentage);
  438. break;
  439. }
  440. case 0x2B:
  441. {
  442. this->last_command = 0x2B;
  443. logger << LogPref::Flag(INFO) << "Command 0x2B received" << endl;
  444. pico_simple_measure();
  445. break;
  446. }
  447. case 0x17:
  448. {
  449. this->last_command = 0x17;
  450. logger << LogPref::Flag(INFO) << "Command 0x17 received" << endl;
  451. if(bytes_recieved < 6) {
  452. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  453. sndbuf[0] = magic_number;
  454. sndbuf[1] = 0xFF;
  455. sndbuf[2] = 0x01;
  456. this->error_code = 0x00000000;
  457. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  458. if(SocketActive->Send(sndbuf, 7) == -1) {
  459. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  460. }
  461. return -1;
  462. }
  463. uint32_t points = 0;
  464. memcpy(&points, rcbuf + 2, sizeof(uint32_t));
  465. pico_set_simple_points(points);
  466. break;
  467. }
  468. case 0x19:
  469. {
  470. this->last_command = 0x19;
  471. logger << LogPref::Flag(INFO) << "Command 0x19 received" << endl;
  472. if(bytes_recieved < 6) {
  473. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  474. sndbuf[0] = magic_number;
  475. sndbuf[1] = 0xFF;
  476. sndbuf[2] = 0x01;
  477. this->error_code = 0x00000000;
  478. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  479. if(SocketActive->Send(sndbuf, 7) == -1) {
  480. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  481. }
  482. return -1;
  483. }
  484. uint32_t num_trigger = 0;
  485. memcpy(&num_trigger, rcbuf + 2, sizeof(uint32_t));
  486. pico_set_num_trigger(num_trigger);
  487. break;
  488. }
  489. case 0x1B:
  490. {
  491. this->last_command = 0x1B;
  492. logger << LogPref::Flag(INFO) << "Command 0x1B received" << endl;
  493. pico_multitrigger_measure();
  494. break;
  495. }
  496. default:
  497. {
  498. this->last_command = 0xFF;
  499. logger << LogPref::Flag(ERROR) << "Invalid command: " << std::hex << cmd << endl;
  500. sndbuf[0] = magic_number;
  501. sndbuf[1] = 0xFF;
  502. sndbuf[2] = 0x00;
  503. this->error_code = 0x00000000;
  504. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  505. if(SocketActive->Send(sndbuf, 7) == -1) {
  506. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  507. }
  508. return -1;
  509. }
  510. }
  511. return 1;
  512. }
  513. int pico_open() {
  514. // Open socket and initialize Pico device
  515. auto retval = ps4000aOpenUnit(&handle, NULL);
  516. logger << LogPref::Flag(INFO) << "Pico device opened with handle: " << handle << endl;
  517. if (retval != 0) {
  518. logger << LogPref::Flag(ERROR) << "Failed to open Pico device. Code: " << retval << endl;
  519. sndbuf[0] = magic_number;
  520. sndbuf[1] = 0xFF;
  521. sndbuf[2] = 0x03;
  522. this->error_code = retval;
  523. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  524. if(SocketActive->Send(sndbuf, 7) == -1) {
  525. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  526. }
  527. return -1;
  528. }
  529. int16_t start{10};
  530. retval = ps4000aFlashLed(handle, start);
  531. logger << LogPref::Flag(INFO) << "Pico device LED flashed." << endl;
  532. if (retval != 0) {
  533. logger << LogPref::Flag(ERROR) << "Failed to flash Pico device LED. Code: " << retval << endl;
  534. sndbuf[0] = magic_number;
  535. sndbuf[1] = 0xFF;
  536. sndbuf[2] = 0x04;
  537. this->error_code = retval;
  538. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  539. if(SocketActive->Send(sndbuf, 7) == -1) {
  540. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  541. }
  542. return -1;
  543. }
  544. logger << LogPref::Flag(INFO) << "Pico device LED flashed." << endl;
  545. sndbuf[0] = magic_number;
  546. sndbuf[1] = 0xC1;
  547. if(SocketActive->Send(sndbuf, 2) == -1) {
  548. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  549. return -1;
  550. }
  551. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  552. return 0;
  553. }
  554. int pico_stop()
  555. {
  556. // Stop measurement and close Pico device
  557. auto retval = ps4000aStop(handle);
  558. if (retval != 0) {
  559. logger << LogPref::Flag(ERROR) << "Failed to stop Pico device. Code: " << retval << endl;
  560. sndbuf[0] = magic_number;
  561. sndbuf[1] = 0xFF;
  562. sndbuf[2] = 0x06;
  563. this->error_code = retval;
  564. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  565. if(SocketActive->Send(sndbuf, 7) == -1) {
  566. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  567. }
  568. return -1;
  569. }
  570. logger << LogPref::Flag(INFO) << "Pico device stopped" << endl;
  571. sndbuf[0] = magic_number;
  572. sndbuf[1] = 0xCE;
  573. if(SocketActive->Send(sndbuf, 2) == -1) {
  574. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  575. return -1;
  576. }
  577. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  578. return 0;
  579. }
  580. // To be deprecated in future versions
  581. int pico_xml_config(const string& file_name) {
  582. // Load configuration from XML file
  583. auto data_set = parse_xml_function(file_name.c_str());
  584. points_vector = string_to_vector(std::get<0>(data_set));
  585. times = string_to_vector(std::get<2>(data_set));
  586. points_value = *(std::max_element(points_vector.begin(), points_vector.end()));
  587. number_channels = std::get<1>(data_set);
  588. sample_rate = std::get<3>(data_set);
  589. sndbuf[0] = magic_number;
  590. sndbuf[1] = 0xC2;
  591. if(SocketActive->Send(sndbuf, 2) == -1) {
  592. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  593. return -1;
  594. }
  595. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  596. return 0;
  597. }
  598. // Deprecated function, use other functions instead
  599. int pico_set_params(const uint32_t* points, const uint32_t* times, const uint32_t sample_rate, const uint32_t number_channels, const uint32_t size) {
  600. // Set parameters for measurement
  601. this->points_vector.assign(points, points + size);
  602. this->times.assign(times, times + size);
  603. this->sample_rate = sample_rate;
  604. this->number_channels = number_channels;
  605. points_value = *(std::max_element(points_vector.begin(), points_vector.end()));
  606. logger << LogPref::Flag(INFO) << "Parameters set" << endl;
  607. sndbuf[0] = magic_number;
  608. sndbuf[1] = 0xCC;
  609. if(SocketActive->Send(sndbuf, 2) == -1) {
  610. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  611. return -1;
  612. }
  613. return 0;
  614. }
  615. int pico_close() {
  616. // Close Pico device and socket
  617. auto retval = ps4000aCloseUnit(handle);
  618. if (retval != 0) {
  619. logger << LogPref::Flag(ERROR) << "Failed to close Pico device. Code: " << retval << endl;
  620. sndbuf[0] = magic_number;
  621. sndbuf[1] = 0xFF;
  622. sndbuf[2] = 0x05;
  623. this->error_code = retval;
  624. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  625. if(SocketActive->Send(sndbuf, 7) == -1) {
  626. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  627. }
  628. return -1;
  629. }
  630. logger << LogPref::Flag(INFO) << "Pico device closed" << endl;
  631. sndbuf[0] = magic_number;
  632. sndbuf[1] = 0xC3;
  633. if(SocketActive->Send(sndbuf, 2) == -1) {
  634. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  635. return -1;
  636. }
  637. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  638. return 0;
  639. }
  640. int pico_get_current_params() {
  641. // Get current parameters from Pico device
  642. logger << LogPref::Flag(INFO) << "Current parameters:" << endl;
  643. logger << "Points: " << points_value << endl;
  644. logger << "Times size: " << times.size() << endl;
  645. logger << "Sample rate: " << sample_rate << endl;
  646. logger << "Number of channels: " << number_channels << endl;
  647. logger << "Trigger channel: " << trig_channel << endl;
  648. logger << "Trigger direction: " << th_direction << endl;
  649. sndbuf[0] = magic_number;
  650. sndbuf[1] = 0xC4;
  651. memcpy(sndbuf + 2, points_vector.data(), sizeof(points_vector.data()));
  652. memcpy(sndbuf + 2 + sizeof(points_vector.data()), times.data(), sizeof(times.data()));
  653. memcpy(sndbuf + 2 + sizeof(points_vector.data()) + sizeof(times.data()), &sample_rate, sizeof(sample_rate));
  654. memcpy(sndbuf + 6 + sizeof(points_vector.data()) + sizeof(times.data()), &number_channels, sizeof(number_channels));
  655. if(SocketActive->Send(sndbuf, 10 + sizeof(points_vector.data()) + sizeof(times.data())) == -1) {
  656. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  657. return -1;
  658. }
  659. return 0;
  660. }
  661. int pico_probe() {
  662. // Probe signal from Pico device
  663. sndbuf[0] = magic_number;
  664. sndbuf[1] = 0xC5;
  665. if(SocketActive->Send(sndbuf, 2) == -1) {
  666. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  667. return -1;
  668. }
  669. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  670. return 0;
  671. }
  672. int pico_set_points(const uint32_t* points, const uint32_t size) {
  673. // Set points for measurement
  674. this->points_vector.assign(points, points + size);
  675. points_value = *(std::max_element(points_vector.begin(), points_vector.end()));
  676. logger << LogPref::Flag(INFO) << "Points set" << endl;
  677. sndbuf[0] = magic_number;
  678. sndbuf[1] = 0xC6;
  679. if(SocketActive->Send(sndbuf, 2) == -1) {
  680. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  681. return -1;
  682. }
  683. return 0;
  684. }
  685. int pico_set_simple_points(const uint32_t points) {
  686. // Set simple points for measurement
  687. this->points_simple = points;
  688. logger << LogPref::Flag(INFO) << "Simple points set to: " << points << endl;
  689. sndbuf[0] = magic_number;
  690. sndbuf[1] = 0xD7;
  691. if(SocketActive->Send(sndbuf, 2) == -1) {
  692. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  693. return -1;
  694. }
  695. return 0;
  696. }
  697. int pico_set_sample_rate(const uint32_t sample_rate) {
  698. // Set sample rate for measurement
  699. this->sample_rate = sample_rate;
  700. logger << LogPref::Flag(INFO) << "Sample rate set to: " << sample_rate << endl;
  701. sndbuf[0] = magic_number;
  702. sndbuf[1] = 0xC7;
  703. if(SocketActive->Send(sndbuf, 2) == -1) {
  704. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  705. return -1;
  706. }
  707. return 0;
  708. }
  709. int pico_set_times(const uint32_t* times, const uint32_t size) {
  710. // Set times for measurement
  711. this->times.assign(times, times + size);
  712. logger << LogPref::Flag(INFO) << "Times set" << endl;
  713. sndbuf[0] = magic_number;
  714. sndbuf[1] = 0xC8;
  715. if(SocketActive->Send(sndbuf, 2) == -1) {
  716. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  717. return -1;
  718. }
  719. return 0;
  720. }
  721. int pico_set_num_trigger(const uint32_t num_trigger) {
  722. // Set number of channels for trigger
  723. this->num_triggers = num_trigger;
  724. logger << LogPref::Flag(INFO) << "Number of triggers set to: " << num_trigger << endl;
  725. sndbuf[0] = magic_number;
  726. sndbuf[1] = 0xD9;
  727. memcpy(sndbuf + 2, &num_triggers, sizeof(uint32_t));
  728. if(SocketActive->Send(sndbuf, 6) == -1) {
  729. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  730. return -1;
  731. }
  732. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  733. return 0;
  734. }
  735. int pico_configure_channels(const uint32_t number_channels, enPicoConnectProbeRange* channel_ranges, uint8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
  736. // Set number of channels for measurement
  737. this->number_channels = number_channels;
  738. logger << LogPref::Flag(INFO) << "Number of channels set to: " << number_channels << endl;
  739. this->channels = create_channel(number_channels);
  740. conditions = new PS4000A_CONDITION[number_channels];
  741. for (uint32_t i = 0; i < number_channels; ++i) {
  742. conditions[i].source = channels[i];
  743. conditions[i].condition = PS4000A_CONDITION_FALSE;
  744. }
  745. if(auto retval = ps4000aSetChannel(handle, channels[trigger_channel], true, PS4000A_DC, channel_ranges[trigger_channel], 0) != 0) {
  746. logger << LogPref::Flag(ERROR) << "Failed to set trigger channel. Code: " << retval << endl;
  747. sndbuf[0] = magic_number;
  748. sndbuf[1] = 0xFF;
  749. sndbuf[2] = 0x06;
  750. this->error_code = retval;
  751. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  752. if(SocketActive->Send(sndbuf, 7) == -1) {
  753. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  754. }
  755. return -1;
  756. }
  757. logger << LogPref::Flag(INFO) << "Trigger channel set" << endl;
  758. this->trig_channel = channels[trigger_channel];
  759. this->th_direction = static_cast<PS4000A_THRESHOLD_DIRECTION>(direction);
  760. this->threshold = threshold;
  761. this->trig_delay = 10;
  762. this->trig_autoTrigger_ms = autoTrigger_ms;
  763. for(uint8_t i = 0; i < number_channels; ++i) {
  764. if(i == trigger_channel) continue;
  765. else {
  766. auto retval = ps4000aSetChannel(handle, channels[i], true, PS4000A_AC, channel_ranges[i], 0);
  767. if (retval != 0) {
  768. logger << LogPref::Flag(ERROR) << "Failed to set channel " << i << ". Code: " << retval << endl;
  769. sndbuf[0] = magic_number;
  770. sndbuf[1] = 0xFF;
  771. sndbuf[2] = 0x07 + i;
  772. this->error_code = retval;
  773. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  774. if(SocketActive->Send(sndbuf, 7) == -1) {
  775. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  776. }
  777. return -1;
  778. }
  779. logger << LogPref::Flag(INFO) << "Channel " << i << " set" << endl;
  780. }
  781. }
  782. auto retval = ps4000aSetSimpleTrigger
  783. (
  784. handle,
  785. true,
  786. conditions[trigger_channel].source,
  787. threshold,
  788. th_direction,
  789. trig_delay,
  790. trig_autoTrigger_ms
  791. );
  792. if (retval != 0) {
  793. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << retval << endl;
  794. sndbuf[0] = magic_number;
  795. sndbuf[1] = 0xFF;
  796. sndbuf[2] = 0x12;
  797. this->error_code = retval;
  798. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  799. if(SocketActive->Send(sndbuf, 7) == -1) {
  800. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  801. }
  802. return -1;
  803. }
  804. sndbuf[0] = magic_number;
  805. sndbuf[1] = 0xC9;
  806. if(SocketActive->Send(sndbuf, 2) == -1) {
  807. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  808. return -1;
  809. }
  810. return 0;
  811. }
  812. // To be deprecated in future versions
  813. int pico_begin_measurement_times() {
  814. // Begin measurement on Pico device
  815. data_buffer_vec.assign(times.size(), std::vector<int16_t*>(number_channels, nullptr));
  816. for(size_t i = 0; i < times.size(); ++i) {
  817. logger << LogPref::Flag(INFO) << "Set data buffer:" << endl;
  818. for(size_t j = 0; j < number_channels; ++j) {
  819. data_buffer_vec[i][j] = new int16_t[points_vector[i]];
  820. }
  821. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;
  822. uint32_t timebase = timebase_choice(sample_rate);
  823. logger << "Timebase = " << timebase << endl;
  824. int32_t timeIntervalNanoseconds = 0;
  825. int32_t maxSamples = 0;
  826. int32_t segmentIndex = 0;
  827. int32_t retval = ps4000aGetTimebase(handle, timebase, points_vector[i], &timeIntervalNanoseconds,
  828. &maxSamples, segmentIndex);
  829. logger << "retval: " << retval << endl;
  830. if(retval != 0) {
  831. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  832. sndbuf[0] = magic_number;
  833. sndbuf[1] = 0xFF;
  834. sndbuf[2] = 0x13;
  835. this->error_code = retval;
  836. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  837. if(SocketActive->Send(sndbuf, 7) == -1) {
  838. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  839. }
  840. return -1;
  841. }
  842. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  843. int32_t noOfPreTriggerSamples = 0;
  844. int32_t noOfPostTriggerSamples = points_value;
  845. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  846. nullptr, segmentIndex, nullptr, nullptr);
  847. logger << "retval: " << retval << endl;
  848. if(retval != 0) {
  849. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  850. sndbuf[0] = magic_number;
  851. sndbuf[1] = 0xFF;
  852. sndbuf[2] = 0x14;
  853. this->error_code = retval;
  854. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  855. if(SocketActive->Send(sndbuf, 7) == -1) {
  856. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  857. }
  858. return -1;
  859. }
  860. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  861. int16_t ready = 0;
  862. while (ready == 0) {
  863. retval = ps4000aIsReady(handle, &ready);
  864. }
  865. for(uint8_t j = 0; j < number_channels; ++j) {
  866. logger << LogPref::Flag(INFO) << "Set data buffer for channel " << j << endl;
  867. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  868. retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_vector[i],
  869. segmentIndex, mode);
  870. logger << "retval: " << retval << endl;
  871. if(retval != 0) {
  872. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  873. sndbuf[0] = magic_number;
  874. sndbuf[1] = 0xFF;
  875. sndbuf[2] = 0x15 + j;
  876. this->error_code = retval;
  877. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  878. if(SocketActive->Send(sndbuf, 7) == -1) {
  879. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  880. }
  881. return -1;
  882. }
  883. }
  884. logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
  885. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  886. uint32_t StartIndex = 0;
  887. uint32_t noOfSamples = static_cast<uint32_t>(points_vector[i]);
  888. int16_t overflow = 0;
  889. uint32_t DownSampleRatio = 1;
  890. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  891. segmentIndex, &overflow);
  892. logger << "retval: " << retval << endl;
  893. if(retval != 0) {
  894. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  895. sndbuf[0] = magic_number;
  896. sndbuf[1] = 0xFF;
  897. sndbuf[2] = 0x21;
  898. this->error_code = retval;
  899. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  900. if(SocketActive->Send(sndbuf, 7) == -1) {
  901. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  902. }
  903. return -1;
  904. }
  905. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  906. logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
  907. sndbuf[0] = magic_number;
  908. sndbuf[1] = 0xCA;
  909. if(SocketActive->Send(sndbuf, 2) == -1) {
  910. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  911. return -1;
  912. }
  913. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  914. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  915. logger << LogPref::Flag(INFO) << "Sleeping for " << times[i+1] - times[i] << " ms" << endl;
  916. if(i < times.size() - 1) {
  917. std::chrono::duration<int64, std::milli> duration(times[i+1] - times[i]);
  918. std::this_thread::sleep_for(duration);
  919. }
  920. }
  921. for(int i = 0; i < data_buffer_vec.size(); ++i) {
  922. logger << LogPref::Flag(INFO) << "Writing data " << i << " to file" << endl;
  923. std::string filename = "data" + std::to_string(i) + ".csv";
  924. writing_data_fixed_name(filename, data_buffer_vec[i], points_vector[i], number_channels);
  925. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  926. }
  927. logger << LogPref::Flag(INFO) << "Free buffers" << endl;
  928. for(uint8_t j = 0; j < times.size(); ++j)
  929. {
  930. free_buffers(data_buffer_vec[j]);
  931. }
  932. logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
  933. logger << LogPref::Flag(INFO) << "Measurement done" << endl;
  934. sndbuf[0] = magic_number;
  935. sndbuf[1] = 0xCB;
  936. if (SocketActive->Send(sndbuf, 2) == -1) {
  937. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  938. return -1;
  939. }
  940. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  941. return 0;
  942. }
  943. int pico_exit() {
  944. // Exit Pico device and free resources
  945. if (handle != NULL) {
  946. auto ret = ps4000aCloseUnit(handle);
  947. if (ret != 0) {
  948. logger << LogPref::Flag(ERROR) << "Failed to close Pico device. Code: " << ret << endl;
  949. sndbuf[0] = magic_number;
  950. sndbuf[1] = 0xFF;
  951. sndbuf[2] = 0x23;
  952. this->error_code = ret;
  953. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  954. if(SocketActive->Send(sndbuf, 7) == -1) {
  955. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  956. }
  957. return -1;
  958. }
  959. sndbuf[0] = magic_number;
  960. sndbuf[1] = 0xCD;
  961. if(SocketActive->Send(sndbuf, 2) == -1) {
  962. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  963. return -1;
  964. }
  965. logger << LogPref::Flag(INFO) << "Pico device closed" << endl;
  966. handle = NULL;
  967. }
  968. return 0;
  969. }
  970. int pico_configure_trigger(int8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
  971. // Configure trigger for Pico device
  972. this->trig_channel = channels[trigger_channel];
  973. this->th_direction = static_cast<PS4000A_THRESHOLD_DIRECTION>(direction);
  974. this->trig_delay = 10;
  975. this->threshold = threshold;
  976. this->trig_autoTrigger_ms = autoTrigger_ms;
  977. logger << LogPref::Flag(INFO) << "Trigger configured" << endl;
  978. sndbuf[0] = magic_number;
  979. sndbuf[1] = 0xC9;
  980. if(SocketActive->Send(sndbuf, 2) == -1) {
  981. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  982. return -1;
  983. }
  984. auto retval = ps4000aSetSimpleTrigger
  985. (
  986. handle,
  987. true,
  988. channels[trigger_channel],
  989. this->threshold,
  990. this->th_direction,
  991. this->trig_delay,
  992. this->trig_autoTrigger_ms
  993. );
  994. if (retval != 0) {
  995. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << retval << endl;
  996. sndbuf[0] = magic_number;
  997. sndbuf[1] = 0xFF;
  998. sndbuf[2] = 0x16;
  999. this->error_code = retval;
  1000. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1001. if(SocketActive->Send(sndbuf, 7) == -1) {
  1002. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1003. }
  1004. return -1;
  1005. }
  1006. logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;\
  1007. sndbuf[0] = magic_number;
  1008. sndbuf[1] = 0xE0;
  1009. if(SocketActive->Send(sndbuf, 2) == -1) {
  1010. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1011. return -1;
  1012. }
  1013. return 0;
  1014. }
  1015. int pico_simple_measure()
  1016. {
  1017. simple_data_buffer = std::vector<int16_t*>(number_channels, nullptr);
  1018. logger << LogPref::Flag(INFO) << "Set simple data buffer:" << endl;
  1019. for(size_t j = 0; j < number_channels; ++j) {
  1020. simple_data_buffer[j] = new int16_t[points_simple];
  1021. }
  1022. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;\
  1023. uint32_t timebase = timebase_choice(sample_rate);
  1024. logger << "Timebase = " << timebase << endl;
  1025. int32_t timeIntervalNanoseconds = 0;
  1026. int32_t maxSamples = 0;
  1027. int32_t segmentIndex = 0;
  1028. int32_t retval = ps4000aGetTimebase(handle, timebase, points_simple, &timeIntervalNanoseconds,
  1029. &maxSamples, segmentIndex);
  1030. logger << "retval: " << retval << endl;
  1031. if(retval != 0) {
  1032. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  1033. sndbuf[0] = magic_number;
  1034. sndbuf[1] = 0xFF;
  1035. sndbuf[2] = 0x17;
  1036. this->error_code = retval;
  1037. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1038. if(SocketActive->Send(sndbuf, 7) == -1) {
  1039. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1040. }
  1041. return -1;
  1042. }
  1043. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  1044. int32_t noOfPreTriggerSamples = (int32_t) (points_simple * premeasurement_percentage / 100.0f);
  1045. int32_t noOfPostTriggerSamples = points_simple;
  1046. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  1047. nullptr, segmentIndex, nullptr, nullptr);
  1048. logger << "retval: " << retval << endl;
  1049. if(retval != 0) {
  1050. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  1051. sndbuf[0] = magic_number;
  1052. sndbuf[1] = 0xFF;
  1053. sndbuf[2] = 0x18;
  1054. this->error_code = retval;
  1055. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1056. if(SocketActive->Send(sndbuf, 7) == -1) {
  1057. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1058. }
  1059. return -1;
  1060. }
  1061. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  1062. int16_t ready = 0;
  1063. while (ready == 0) {
  1064. retval = ps4000aIsReady(handle, &ready);
  1065. }
  1066. for(uint8_t j = 0; j < number_channels; ++j) {
  1067. logger << LogPref::Flag(INFO) << "Set simple data buffer for channel " << j << endl;
  1068. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  1069. retval = ps4000aSetDataBuffer(handle, channels[j], simple_data_buffer[j], points_simple,
  1070. segmentIndex, mode);
  1071. logger << "retval: " << retval << endl;
  1072. if(retval != 0) {
  1073. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1074. sndbuf[0] = magic_number;
  1075. sndbuf[1] = 0xFF;
  1076. sndbuf[2] = 0x19 + j;
  1077. this->error_code = retval;
  1078. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1079. if(SocketActive->Send(sndbuf, 7) == -1) {
  1080. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1081. }
  1082. return -1;
  1083. }
  1084. }
  1085. logger << LogPref::Flag(INFO) << "Set simple data buffer done" << endl;
  1086. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1087. uint32_t StartIndex = 0;
  1088. uint32_t noOfSamples = static_cast<uint32_t>(points_simple);
  1089. int16_t overflow = 0;
  1090. uint32_t DownSampleRatio = 1;
  1091. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  1092. segmentIndex, &overflow);
  1093. logger << "retval: " << retval << endl;
  1094. if(retval != 0) {
  1095. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1096. sndbuf[0] = magic_number;
  1097. sndbuf[1] = 0xFF;
  1098. sndbuf[2] = 0x20;
  1099. this->error_code = retval;
  1100. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1101. if(SocketActive->Send(sndbuf, 7) == -1) {
  1102. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1103. }
  1104. return -1;
  1105. }
  1106. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1107. std::string filename = "simple_data_channel.csv";
  1108. writing_data_fixed_name(filename, simple_data_buffer, points_simple, 1);
  1109. logger << LogPref::Flag(INFO) << "Free simple data buffers" << endl;
  1110. for(uint8_t j = 0; j < number_channels; ++j)
  1111. {
  1112. delete[] simple_data_buffer[j];
  1113. simple_data_buffer[j] = nullptr;
  1114. }
  1115. logger << LogPref::Flag(INFO) << "Simple data buffers freed" << endl;
  1116. logger << LogPref::Flag(INFO) << "Simple measurement done" << endl;
  1117. sndbuf[0] = magic_number;
  1118. sndbuf[1] = 0xEB;
  1119. if(SocketActive->Send(sndbuf, 2) == -1) {
  1120. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1121. return -1;
  1122. }
  1123. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1124. return 0;
  1125. }
  1126. int pico_set_premeasurement(uint32_t percentage)
  1127. {
  1128. // Set pre-measurement percentage
  1129. this->premeasurement_percentage = percentage;
  1130. logger << LogPref::Flag(INFO) << "Pre-measurement percentage set to: " << percentage << "%" << endl;
  1131. sndbuf[0] = magic_number;
  1132. sndbuf[1] = 0xE8;
  1133. if(SocketActive->Send(sndbuf, 2) == -1) {
  1134. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1135. return -1;
  1136. }
  1137. return 0;
  1138. }
  1139. int pico_multitrigger_measure()
  1140. {
  1141. // Multi-trigger measurement
  1142. logger << LogPref::Flag(INFO) << "Multi-trigger measurement started" << endl;
  1143. data_buffer_vec = std::vector<std::vector<int16_t*>>(num_triggers, std::vector<int16_t*>(number_channels, nullptr));
  1144. for(size_t i = 0; i < num_triggers; ++i) {
  1145. data_buffer_vec[i].assign(number_channels, nullptr);
  1146. for(size_t j = 0; j < number_channels; ++j) {
  1147. data_buffer_vec[i][j] = new int16_t[points_value];
  1148. }
  1149. }
  1150. for(size_t i = 0; i < num_triggers; ++i) {
  1151. logger << LogPref::Flag(INFO) << "Set data buffer for trigger " << i << ":" << endl;
  1152. for(size_t j = 0; j < number_channels; ++j) {
  1153. data_buffer_vec[i][j] = new int16_t[points_value];
  1154. }
  1155. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;
  1156. uint32_t timebase = timebase_choice(sample_rate);
  1157. logger << "Timebase = " << timebase << endl;
  1158. int32_t timeIntervalNanoseconds = 0;
  1159. int32_t maxSamples = 0;
  1160. int32_t segmentIndex = 0;
  1161. int32_t retval = ps4000aGetTimebase(handle, timebase, points_value, &timeIntervalNanoseconds,
  1162. &maxSamples, segmentIndex);
  1163. logger << "retval: " << retval << endl;
  1164. if(retval != 0) {
  1165. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  1166. sndbuf[0] = magic_number;
  1167. sndbuf[1] = 0xFF;
  1168. sndbuf[2] = 0x22;
  1169. this->error_code = retval;
  1170. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1171. if(SocketActive->Send(sndbuf, 7) == -1) {
  1172. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1173. }
  1174. return -1;
  1175. }
  1176. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  1177. int32_t noOfPreTriggerSamples = 0;
  1178. int32_t noOfPostTriggerSamples = points_value;
  1179. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  1180. nullptr, segmentIndex, nullptr, nullptr);
  1181. logger << "retval: " << retval << endl;
  1182. if(retval != 0) {
  1183. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  1184. sndbuf[0] = magic_number;
  1185. sndbuf[1] = 0xFF;
  1186. sndbuf[2] = 0x23;
  1187. this->error_code = retval;
  1188. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1189. if(SocketActive->Send(sndbuf, 7) == -1) {
  1190. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1191. }
  1192. return -1;
  1193. }
  1194. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  1195. int16_t ready = 0;
  1196. while (ready == 0) {
  1197. retval = ps4000aIsReady(handle, &ready);
  1198. }
  1199. logger << LogPref::Flag(INFO) << "Set data buffer for channels:" << endl;
  1200. for(uint8_t j = 0; j < number_channels; ++j) {
  1201. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  1202. retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_value,
  1203. segmentIndex, mode);
  1204. logger << "retval: " << retval << endl;
  1205. if(retval != 0) {
  1206. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1207. sndbuf[0] = magic_number;
  1208. sndbuf[1] = 0xFF;
  1209. sndbuf[2] = 0x24 + j;
  1210. this->error_code = retval;
  1211. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1212. if(SocketActive->Send(sndbuf, 7) == -1) {
  1213. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1214. }
  1215. return -1;
  1216. }
  1217. }
  1218. logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
  1219. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1220. uint32_t StartIndex = 0;
  1221. uint32_t noOfSamples = static_cast<uint32_t>(points_value);
  1222. int16_t overflow = 0;
  1223. uint32_t DownSampleRatio = 1;
  1224. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  1225. segmentIndex, &overflow);
  1226. logger << "retval: " << retval << endl;
  1227. if(retval != 0) {
  1228. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1229. sndbuf[0] = magic_number;
  1230. sndbuf[1] = 0xFF;
  1231. sndbuf[2] = 0x25;
  1232. this->error_code = retval;
  1233. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1234. if(SocketActive->Send(sndbuf, 7) == -1) {
  1235. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1236. }
  1237. return -1;
  1238. }
  1239. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1240. logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
  1241. sndbuf[0] = magic_number;
  1242. sndbuf[1] = 0xDA;
  1243. if(SocketActive->Send(sndbuf, 2) == -1) {
  1244. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1245. return -1;
  1246. }
  1247. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1248. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1249. auto trig_retval = ps4000aSetSimpleTrigger
  1250. (
  1251. handle,
  1252. true,
  1253. channels[this->trig_channel],
  1254. threshold,
  1255. th_direction,
  1256. trig_delay,
  1257. trig_autoTrigger_ms
  1258. );
  1259. if (trig_retval != 0) {
  1260. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << trig_retval << endl;
  1261. sndbuf[0] = magic_number;
  1262. sndbuf[1] = 0xFF;
  1263. sndbuf[2] = 0x26;
  1264. this->error_code = trig_retval;
  1265. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1266. if(SocketActive->Send(sndbuf, 7) == -1) {
  1267. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1268. }
  1269. return -1;
  1270. }
  1271. logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;
  1272. }
  1273. logger << LogPref::Flag(INFO) << "Writing data to files" << endl;
  1274. for(int i = 0; i < data_buffer_vec.size(); ++i) {
  1275. logger << LogPref::Flag(INFO) << "Writing data " << i << " to file" << endl;
  1276. std::string filename = "data_trigger_" + std::to_string(i) + ".csv";
  1277. writing_data_fixed_name(filename, data_buffer_vec[i], points_value, number_channels);
  1278. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1279. }
  1280. logger << LogPref::Flag(INFO) << "Free buffers" << endl;
  1281. for(uint8_t j = 0; j < num_triggers; ++j)
  1282. {
  1283. free_buffers(data_buffer_vec[j]);
  1284. }
  1285. logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
  1286. logger << LogPref::Flag(INFO) << "Multi-trigger measurement done" << endl;
  1287. sndbuf[0] = magic_number;
  1288. sndbuf[1] = 0xDB;
  1289. if(SocketActive->Send(sndbuf, 2) == -1) {
  1290. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1291. return -1;
  1292. }
  1293. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1294. return 0;
  1295. }
  1296. };
  1297. int main()
  1298. {
  1299. logger << "Open socket" << endl;
  1300. CPassiveSocket SocketPassive(CSimpleSocket::CSocketType::SocketTypeTcp);
  1301. if (!SocketPassive.Initialize())
  1302. {
  1303. logger << LogPref::Flag(ERROR) << "Socket initialization failed" << endl;
  1304. return -1;
  1305. }
  1306. if(!SocketPassive.Listen("localhost", 5002))
  1307. {
  1308. logger << LogPref::Flag(ERROR) << "Socket listening failed" << endl;
  1309. return -1;
  1310. }
  1311. CActiveSocket* ClientSocket;
  1312. PicoLocalService* pico_service;
  1313. while(true)
  1314. {
  1315. if ((ClientSocket = SocketPassive.Accept()) != nullptr)
  1316. {
  1317. logger << LogPref::Flag(ERROR) << "Socket accept failed" << endl;
  1318. return -1;
  1319. }
  1320. logger << LogPref::Flag(INFO) << "Client connected" << endl;
  1321. pico_service = new PicoLocalService(ClientSocket);
  1322. while(pico_service->get_request() != 0)
  1323. {
  1324. logger << LogPref::Flag(INFO) << "Request received" << endl;
  1325. }
  1326. logger << LogPref::Flag(INFO) << "Request processing finished" << endl;
  1327. delete pico_service;
  1328. pico_service = nullptr;
  1329. delete ClientSocket;
  1330. ClientSocket = nullptr;
  1331. }
  1332. return 0;
  1333. }