main.cpp 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067
  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. void createDirectoryRecursively(const std::string &directory) {
  16. static const std::string separators("\\/");
  17. // If the specified directory name doesn't exist, do our thing
  18. DWORD fileAttributes = ::GetFileAttributesA(directory.c_str());
  19. if(fileAttributes == INVALID_FILE_ATTRIBUTES) {
  20. // Recursively do it all again for the parent directory, if any
  21. std::size_t slashIndex = directory.find_last_of(separators);
  22. if(slashIndex != std::wstring::npos) {
  23. createDirectoryRecursively(directory.substr(0, slashIndex));
  24. }
  25. // Create the last directory on the path (the recursive calls will have taken
  26. // care of the parent directories by now)
  27. BOOL result = ::CreateDirectoryA(directory.c_str(), nullptr);
  28. if(result == FALSE) {
  29. throw std::runtime_error("Could not create directory");
  30. }
  31. } else { // Specified directory name already exists as a file or directory
  32. bool isDirectoryOrJunction =
  33. ((fileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) ||
  34. ((fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0);
  35. if(!isDirectoryOrJunction) {
  36. throw std::runtime_error(
  37. "Could not create directory because a file with the same name exists"
  38. );
  39. }
  40. }
  41. }
  42. class PicoLocalService
  43. {
  44. private:
  45. CActiveSocket* SocketActive;
  46. const static uint8_t magic_number = 0xAA;
  47. int16_t handle = 0;
  48. uint8_t last_command = 0x00;
  49. uint32_t error_code = 0x00000000;
  50. int32_t points_value = 0;
  51. uint32_t sample_rate = 0;
  52. std::vector<uint32_t> times;
  53. uint32_t num_triggers = 0;
  54. uint32_t number_channels = 0;
  55. std::vector<PS4000A_CHANNEL> channels;
  56. std::vector<uint32_t> points_vector;
  57. uint32_t points_simple = 0;
  58. uint32_t premeasurement_percentage = 0;
  59. PS4000A_CONDITION* conditions;
  60. PS4000A_CHANNEL trig_channel = PS4000A_CHANNEL_A;
  61. PS4000A_THRESHOLD_DIRECTION th_direction = PS4000A_ABOVE;
  62. int16_t threshold = 0;
  63. int16_t trig_delay = 0;
  64. int16_t trig_autoTrigger_ms = 0;
  65. uint32_t nbytes_sent = 0;
  66. std::vector<std::vector<int16_t*>> data_buffer_vec;
  67. std::vector<int16_t*> simple_data_buffer;
  68. uint8_t rcbuf[MAX_PACKET]{0};
  69. uint8_t sndbuf[MAX_PACKET]{0};
  70. public:
  71. PicoLocalService(CActiveSocket* socket) : SocketActive(socket) {}
  72. ~PicoLocalService() {}
  73. int get_request() {
  74. // Check if buffer has at least 2 bytes for magic number and command
  75. // Receive data from socket
  76. int bytes_recieved = SocketActive->Receive(MAX_PACKET, rcbuf);
  77. if(bytes_recieved == 0)
  78. {
  79. logger << LogPref::Flag(ERROR) << "Client disconnected" << endl;
  80. pico_stop();
  81. pico_close();
  82. return 0;
  83. }
  84. if(bytes_recieved < 2)
  85. {
  86. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  87. sndbuf[0] = magic_number;
  88. sndbuf[1] = 0xFF; // Error flag
  89. sndbuf[2] = 0x01; // Error type
  90. this->error_code = 0x00000000; // No pico error
  91. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  92. if(SocketActive->Send(sndbuf, 7) == -1) {
  93. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  94. }
  95. return -1;
  96. }
  97. // Extract magic number from buffer
  98. uint8_t magic;
  99. memcpy(&magic, rcbuf, sizeof(uint8_t));
  100. // Check if magic number is correct
  101. if (magic != this->magic_number) {
  102. logger << LogPref::Flag(ERROR) << "Invalid magic number: " << std::hex << magic << endl;
  103. sndbuf[0] = magic_number;
  104. sndbuf[1] = 0xFF;
  105. sndbuf[2] = 0x03;
  106. this->error_code = 0x00000000;
  107. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  108. if(SocketActive->Send(sndbuf, 7) == -1) {
  109. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  110. }
  111. return -1;
  112. }
  113. // Extract command from buffer
  114. uint8_t cmd;
  115. memcpy(&cmd, rcbuf + 1, sizeof(uint8_t));
  116. // Check if command is correct
  117. switch(cmd)
  118. {
  119. case 0x01:
  120. {
  121. this->last_command = 0x01;
  122. logger << LogPref::Flag(INFO) << "Command 0x01 received" << endl;
  123. pico_open();
  124. logger << LogPref::Flag(INFO) << "Pico device opened" << endl;
  125. break;
  126. }
  127. case 0x02:
  128. {
  129. this->last_command = 0x02;
  130. logger << LogPref::Flag(INFO) << "Command 0x02 received" << endl;
  131. if(bytes_recieved < 7) {
  132. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  133. sndbuf[0] = magic_number;
  134. sndbuf[1] = 0xFF;
  135. sndbuf[2] = 0x01;
  136. this->error_code = 0x00000000;
  137. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  138. if(SocketActive->Send(sndbuf, 7) == -1) {
  139. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  140. }
  141. return -1;
  142. }
  143. uint32_t size;
  144. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  145. if(size < 1) {
  146. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  147. sndbuf[0] = magic_number;
  148. sndbuf[1] = 0xFF;
  149. sndbuf[2] = 0x02;
  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. char* file_name = new char[size + 1];
  158. memcpy(file_name, rcbuf + 6, size * sizeof(char));
  159. file_name[size] = '\0'; // Null-terminate the string
  160. std::string file_name_str(file_name);
  161. logger << LogPref::Flag(INFO) << "File name: " << file_name_str << endl;
  162. pico_xml_config(file_name_str);
  163. logger << LogPref::Flag(INFO) << "Pico device configured" << endl;
  164. delete[] file_name;
  165. break;
  166. }
  167. case 0x0C:
  168. {
  169. this->last_command = 0x0C;
  170. logger << LogPref::Flag(INFO) << "Command 0x0C received" << endl;
  171. if(bytes_recieved < 22) {
  172. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  173. return -1;
  174. sndbuf[0] = magic_number;
  175. sndbuf[1] = 0xFF;
  176. sndbuf[2] = 0x01;
  177. this->error_code = 0x00000000;
  178. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  179. if(SocketActive->Send(sndbuf, 7) == -1) {
  180. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  181. }
  182. return -1;
  183. }
  184. uint32_t size;
  185. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  186. if(size < 1) {
  187. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  188. sndbuf[0] = magic_number;
  189. sndbuf[1] = 0xFF;
  190. sndbuf[2] = 0x02;
  191. this->error_code = 0x00000000;
  192. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  193. if(SocketActive->Send(sndbuf, 7) == -1) {
  194. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  195. }
  196. return -1;
  197. }
  198. uint32_t* apoints = new uint32_t[size];
  199. memcpy(apoints, rcbuf + 6, size * sizeof(uint32_t));
  200. uint32_t* atimes = new uint32_t[size];
  201. memcpy(atimes, rcbuf + 6 + size * sizeof(uint32_t), size * sizeof(uint32_t));
  202. uint32_t sample_rate = 0;
  203. memcpy(&sample_rate, rcbuf + 6 + 2 * size * sizeof(uint32_t), sizeof(uint32_t));
  204. uint32_t number_channels = 0;
  205. memcpy(&number_channels, rcbuf + 10 + 2 * size * sizeof(uint32_t), sizeof(uint32_t));
  206. pico_set_params(apoints, atimes, sample_rate, number_channels, size);
  207. logger << LogPref::Flag(INFO) << "Pico device parameters set" << endl;
  208. delete[] apoints;
  209. delete[] atimes;
  210. break;
  211. }
  212. case 0x03:
  213. {
  214. this->last_command = 0x03;
  215. logger << LogPref::Flag(INFO) << "Command 0x03 received" << endl;
  216. pico_close();
  217. logger << LogPref::Flag(INFO) << "Pico device closed" << endl;
  218. break;
  219. }
  220. case 0x04:
  221. {
  222. // Check if buffer has enough data for version numbers
  223. this->last_command = 0x04;
  224. logger << LogPref::Flag(INFO) << "Command 0x04 received" << endl;
  225. pico_get_current_params();
  226. logger << LogPref::Flag(INFO) << "Pico device parameters retrieved" << endl;
  227. break;
  228. }
  229. case 0x05:
  230. {
  231. this->last_command = 0x05;
  232. logger << LogPref::Flag(INFO) << "Command 0x05 received" << endl;
  233. pico_probe();
  234. logger << LogPref::Flag(INFO) << "Pico device probed" << endl;
  235. break;
  236. }
  237. case 0x06:
  238. {
  239. this->last_command = 0x06;
  240. logger << LogPref::Flag(INFO) << "Command 0x06 received" << endl;
  241. if(bytes_recieved < 10) {
  242. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  243. sndbuf[0] = magic_number;
  244. sndbuf[1] = 0xFF;
  245. sndbuf[2] = 0x01;
  246. this->error_code = 0x00000000;
  247. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  248. if(SocketActive->Send(sndbuf, 7) == -1) {
  249. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  250. }
  251. return -1;
  252. }
  253. uint32_t size;
  254. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  255. if(size < 1) {
  256. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  257. sndbuf[0] = magic_number;
  258. sndbuf[1] = 0xFF;
  259. sndbuf[2] = 0x02;
  260. this->error_code = 0x00000000;
  261. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  262. if(SocketActive->Send(sndbuf, 7) == -1) {
  263. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  264. }
  265. return -1;
  266. }
  267. uint32_t* apoints = new uint32_t[size];
  268. memcpy(apoints, rcbuf + 6, size * sizeof(uint32_t));
  269. pico_set_points(apoints, size);
  270. logger << LogPref::Flag(INFO) << "Pico device points set" << endl;
  271. delete[] apoints;
  272. break;
  273. }
  274. case 0x07:
  275. {
  276. this->last_command = 0x07;
  277. logger << LogPref::Flag(INFO) << "Command 0x07 received" << endl;
  278. if(bytes_recieved < 6) {
  279. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  280. sndbuf[0] = magic_number;
  281. sndbuf[1] = 0xFF;
  282. sndbuf[2] = 0x01;
  283. this->error_code = 0x00000000;
  284. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  285. if(SocketActive->Send(sndbuf, 7) == -1) {
  286. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  287. }
  288. return -1;
  289. }
  290. uint32_t sample_rate = 0;
  291. memcpy(&sample_rate, rcbuf + 2, sizeof(uint32_t));
  292. pico_set_sample_rate(sample_rate);
  293. logger << LogPref::Flag(INFO) << "Pico device sample rate set" << endl;
  294. break;
  295. }
  296. case 0x08:
  297. {
  298. this->last_command = 0x08;
  299. logger << LogPref::Flag(INFO) << "Command 0x08 received" << endl;
  300. if(bytes_recieved < 10) {
  301. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  302. sndbuf[0] = magic_number;
  303. sndbuf[1] = 0xFF;
  304. sndbuf[2] = 0x01;
  305. this->error_code = 0x00000000;
  306. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  307. if(SocketActive->Send(sndbuf, 7) == -1) {
  308. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  309. }
  310. return -1;
  311. }
  312. uint32_t size;
  313. memcpy(&size, rcbuf + 2, sizeof(uint32_t));
  314. if(size < 1) {
  315. logger << LogPref::Flag(ERROR) << "Invalid data size" << endl;
  316. sndbuf[0] = magic_number;
  317. sndbuf[1] = 0xFF;
  318. sndbuf[2] = 0x02;
  319. this->error_code = 0x00000000;
  320. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  321. if(SocketActive->Send(sndbuf, 7) == -1) {
  322. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  323. }
  324. return -1;
  325. }
  326. uint32_t* atimes = new uint32_t[size];
  327. memcpy(atimes, rcbuf + 6, size * sizeof(uint32_t));
  328. pico_set_times(atimes, size);
  329. logger << LogPref::Flag(INFO) << "Pico device times set" << endl;
  330. delete[] atimes;
  331. break;
  332. }
  333. case 0x09:
  334. {
  335. this->last_command = 0x09;
  336. logger << LogPref::Flag(INFO) << "Command 0x09 received" << endl;
  337. if(bytes_recieved < 16) {
  338. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  339. sndbuf[0] = magic_number;
  340. sndbuf[1] = 0xFF;
  341. sndbuf[2] = 0x01;
  342. this->error_code = 0x00000000;
  343. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  344. if(SocketActive->Send(sndbuf, 7) == -1) {
  345. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  346. }
  347. return -1;
  348. }
  349. uint32_t channels = 0;
  350. memcpy(&channels, rcbuf + 2, sizeof(uint32_t));
  351. logger << "CHANNELS: " << channels << endl;
  352. if(channels < 1 || channels > 16) {
  353. logger << LogPref::Flag(ERROR) << "Invalid number of channels" << endl;
  354. sndbuf[0] = magic_number;
  355. sndbuf[1] = 0xFF;
  356. sndbuf[2] = 0x02;
  357. this->error_code = 0x00000000;
  358. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  359. if(SocketActive->Send(sndbuf, 7) == -1) {
  360. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  361. }
  362. return -1;
  363. }
  364. enPicoConnectProbeRange* channels_range = new enPicoConnectProbeRange[channels];
  365. int8_t* raw_ranges = new int8_t[channels];
  366. memset(raw_ranges, PICO_X1_PROBE_5V, sizeof(int8_t) * channels);
  367. memcpy(raw_ranges, rcbuf + 6, sizeof(int8_t) * channels);
  368. logger << "RAW" << (int) raw_ranges[0] << endl;
  369. for(int i = 0; i < channels; ++i)
  370. {
  371. channels_range[i] = static_cast<enPicoConnectProbeRange>(raw_ranges[i]);
  372. }
  373. uint8_t trigger_channel = 0;
  374. memcpy(&trigger_channel, rcbuf + 6 + channels, sizeof(uint8_t));
  375. int32_t direction = 0;
  376. memcpy(&direction, rcbuf + 7 + channels, sizeof(int32_t));
  377. uint16_t threshold = 0;
  378. memcpy(&threshold, rcbuf + 11 + channels, sizeof(uint16_t));
  379. int16_t autoTrigger_ms = 0;
  380. memcpy(&autoTrigger_ms, rcbuf + 13 + channels, sizeof(int16_t));
  381. pico_configure_channels_t(channels, channels_range, trigger_channel, direction, threshold, autoTrigger_ms);
  382. logger << LogPref::Flag(INFO) << "Pico device channels configured" << endl;
  383. break;
  384. }
  385. case 0x29:
  386. {
  387. }
  388. case 0x0A:
  389. {
  390. this->last_command = 0x0A;
  391. logger << LogPref::Flag(INFO) << "Command 0x0A received" << endl;
  392. pico_begin_measurement_times();
  393. logger << LogPref::Flag(INFO) << "Pico device measurement started" << endl;
  394. break;
  395. }
  396. case 0x0D:
  397. {
  398. this->last_command = 0x0D;
  399. logger << LogPref::Flag(INFO) << "Command 0x0B received" << endl;
  400. int ret = pico_exit();
  401. if(ret == 0) {
  402. logger << LogPref::Flag(INFO) << "Pico device exited successfully" << endl;
  403. return 0;
  404. } else {
  405. logger << LogPref::Flag(ERROR) << "Failed to exit Pico device" << endl;
  406. }
  407. break;
  408. }
  409. case 0x0E:
  410. {
  411. this->last_command = 0x0E;
  412. logger << LogPref::Flag(INFO) << "Command 0x0E received" << endl;
  413. pico_stop();
  414. logger << LogPref::Flag(INFO) << "Pico device stopped" << endl;
  415. break;
  416. }
  417. case 0x20:
  418. {
  419. this->last_command = 0x20;
  420. logger << LogPref::Flag(INFO) << "Command 0x0F received" << endl;
  421. if(bytes_recieved < 12) {
  422. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  423. sndbuf[0] = magic_number;
  424. sndbuf[1] = 0xFF;
  425. sndbuf[2] = 0x01;
  426. this->error_code = 0x00000000;
  427. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  428. if(SocketActive->Send(sndbuf, 7) == -1) {
  429. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  430. }
  431. return -1;
  432. }
  433. uint32_t trigger_channel = 0;
  434. memcpy(&trigger_channel, rcbuf + 2, sizeof(uint32_t));
  435. int32_t direction = 0;
  436. memcpy(&direction, rcbuf + 6, sizeof(int32_t));
  437. uint16_t threshold = 0;
  438. memcpy(&threshold, rcbuf + 10, sizeof(uint16_t));
  439. int16_t autoTrigger_ms = 0;
  440. memcpy(&autoTrigger_ms, rcbuf + 12, sizeof(int16_t));
  441. pico_configure_trigger(trigger_channel, direction, threshold, autoTrigger_ms);
  442. break;
  443. }
  444. case 0x28:
  445. {
  446. this->last_command = 0x28;
  447. logger << LogPref::Flag(INFO) << "Command 0x28 received" << endl;
  448. if(bytes_recieved < 6) {
  449. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  450. sndbuf[0] = magic_number;
  451. sndbuf[1] = 0xFF;
  452. sndbuf[2] = 0x01;
  453. this->error_code = 0x00000000;
  454. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  455. if(SocketActive->Send(sndbuf, 7) == -1) {
  456. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  457. }
  458. return -1;
  459. }
  460. uint32_t percentage = 0;
  461. memcpy(&percentage, rcbuf + 2, sizeof(uint32_t));
  462. if(percentage < 0 || percentage > 100) {
  463. logger << LogPref::Flag(ERROR) << "Invalid premeasurement percentage" << endl;
  464. sndbuf[0] = magic_number;
  465. sndbuf[1] = 0xFF;
  466. sndbuf[2] = 0x02;
  467. this->error_code = 0x00000000;
  468. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  469. if(SocketActive->Send(sndbuf, 7) == -1) {
  470. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  471. }
  472. return -1;
  473. }
  474. pico_set_premeasurement(percentage);
  475. break;
  476. }
  477. case 0x2B:
  478. {
  479. this->last_command = 0x2B;
  480. logger << LogPref::Flag(INFO) << "Command 0x2B received" << endl;
  481. pico_simple_measure();
  482. break;
  483. }
  484. case 0x17:
  485. {
  486. this->last_command = 0x17;
  487. logger << LogPref::Flag(INFO) << "Command 0x17 received" << endl;
  488. if(bytes_recieved < 6) {
  489. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  490. sndbuf[0] = magic_number;
  491. sndbuf[1] = 0xFF;
  492. sndbuf[2] = 0x01;
  493. this->error_code = 0x00000000;
  494. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  495. if(SocketActive->Send(sndbuf, 7) == -1) {
  496. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  497. }
  498. return -1;
  499. }
  500. uint32_t points = 0;
  501. memcpy(&points, rcbuf + 2, sizeof(uint32_t));
  502. pico_set_simple_points(points);
  503. break;
  504. }
  505. case 0x19:
  506. {
  507. this->last_command = 0x19;
  508. logger << LogPref::Flag(INFO) << "Command 0x19 received" << endl;
  509. if(bytes_recieved < 6) {
  510. logger << LogPref::Flag(ERROR) << "Invalid buffer size" << endl;
  511. sndbuf[0] = magic_number;
  512. sndbuf[1] = 0xFF;
  513. sndbuf[2] = 0x01;
  514. this->error_code = 0x00000000;
  515. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  516. if(SocketActive->Send(sndbuf, 7) == -1) {
  517. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  518. }
  519. return -1;
  520. }
  521. uint32_t num_trigger = 0;
  522. memcpy(&num_trigger, rcbuf + 2, sizeof(uint32_t));
  523. pico_set_num_trigger(num_trigger);
  524. break;
  525. }
  526. case 0x1B:
  527. {
  528. this->last_command = 0x1B;
  529. logger << LogPref::Flag(INFO) << "Command 0x1B received" << endl;
  530. pico_multitrigger_measure();
  531. break;
  532. }
  533. case 0x3B:
  534. {
  535. this->last_command;
  536. logger << LogPref::Flag(INFO) << "Command 0x3B received" << endl;
  537. pico_tcp_measurement_s();
  538. break;
  539. }
  540. default:
  541. {
  542. this->last_command = 0xFF;
  543. logger << LogPref::Flag(ERROR) << "Invalid command: " << std::hex << cmd << endl;
  544. sndbuf[0] = magic_number;
  545. sndbuf[1] = 0xFF;
  546. sndbuf[2] = 0x00;
  547. this->error_code = 0x00000000;
  548. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  549. if(SocketActive->Send(sndbuf, 7) == -1) {
  550. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  551. }
  552. return -1;
  553. }
  554. }
  555. return 1;
  556. }
  557. int pico_open() {
  558. // Open socket and initialize Pico device
  559. auto retval = ps4000aOpenUnit(&handle, NULL);
  560. logger << LogPref::Flag(INFO) << "Pico device opened with handle: " << handle << endl;
  561. if (retval != 0) {
  562. logger << LogPref::Flag(ERROR) << "Failed to open Pico device. Code: " << retval << endl;
  563. sndbuf[0] = magic_number;
  564. sndbuf[1] = 0xFF;
  565. sndbuf[2] = 0x03;
  566. this->error_code = retval;
  567. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  568. if(SocketActive->Send(sndbuf, 7) == -1) {
  569. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  570. }
  571. return -1;
  572. }
  573. int16_t start{10};
  574. retval = ps4000aFlashLed(handle, start);
  575. logger << LogPref::Flag(INFO) << "Pico device LED flashed." << endl;
  576. if (retval != 0) {
  577. logger << LogPref::Flag(ERROR) << "Failed to flash Pico device LED. Code: " << retval << endl;
  578. sndbuf[0] = magic_number;
  579. sndbuf[1] = 0xFF;
  580. sndbuf[2] = 0x04;
  581. this->error_code = retval;
  582. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  583. if(SocketActive->Send(sndbuf, 7) == -1) {
  584. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  585. }
  586. return -1;
  587. }
  588. logger << LogPref::Flag(INFO) << "Pico device LED flashed." << endl;
  589. sndbuf[0] = magic_number;
  590. sndbuf[1] = 0xC1;
  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. int pico_stop()
  599. {
  600. // Stop measurement and close Pico device
  601. auto retval = ps4000aStop(handle);
  602. if (retval != 0) {
  603. logger << LogPref::Flag(ERROR) << "Failed to stop Pico device. Code: " << retval << endl;
  604. sndbuf[0] = magic_number;
  605. sndbuf[1] = 0xFF;
  606. sndbuf[2] = 0x06;
  607. this->error_code = retval;
  608. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  609. if(SocketActive->Send(sndbuf, 7) == -1) {
  610. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  611. }
  612. return -1;
  613. }
  614. logger << LogPref::Flag(INFO) << "Pico device stopped" << endl;
  615. sndbuf[0] = magic_number;
  616. sndbuf[1] = 0xCE;
  617. if(SocketActive->Send(sndbuf, 2) == -1) {
  618. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  619. return -1;
  620. }
  621. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  622. return 0;
  623. }
  624. // To be deprecated in future versions
  625. int pico_xml_config(const string& file_name) {
  626. // Load configuration from XML file
  627. auto data_set = parse_xml_function(file_name.c_str());
  628. points_vector = string_to_vector(std::get<0>(data_set));
  629. times = string_to_vector(std::get<2>(data_set));
  630. points_value = *(std::max_element(points_vector.begin(), points_vector.end()));
  631. number_channels = std::get<1>(data_set);
  632. sample_rate = std::get<3>(data_set);
  633. sndbuf[0] = magic_number;
  634. sndbuf[1] = 0xC2;
  635. if(SocketActive->Send(sndbuf, 2) == -1) {
  636. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  637. return -1;
  638. }
  639. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  640. return 0;
  641. }
  642. // Deprecated function, use other functions instead
  643. 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) {
  644. // Set parameters for measurement
  645. this->points_vector.assign(points, points + size);
  646. this->times.assign(times, times + size);
  647. this->sample_rate = sample_rate;
  648. this->number_channels = number_channels;
  649. points_value = *(std::max_element(points_vector.begin(), points_vector.end()));
  650. logger << LogPref::Flag(INFO) << "Parameters set" << endl;
  651. sndbuf[0] = magic_number;
  652. sndbuf[1] = 0xCC;
  653. if(SocketActive->Send(sndbuf, 2) == -1) {
  654. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  655. return -1;
  656. }
  657. return 0;
  658. }
  659. int pico_close() {
  660. // Close Pico device and socket
  661. auto retval = ps4000aCloseUnit(handle);
  662. if (retval != 0) {
  663. logger << LogPref::Flag(ERROR) << "Failed to close Pico device. Code: " << retval << endl;
  664. sndbuf[0] = magic_number;
  665. sndbuf[1] = 0xFF;
  666. sndbuf[2] = 0x05;
  667. this->error_code = retval;
  668. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  669. if(SocketActive->Send(sndbuf, 7) == -1) {
  670. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  671. }
  672. return -1;
  673. }
  674. logger << LogPref::Flag(INFO) << "Pico device closed" << endl;
  675. sndbuf[0] = magic_number;
  676. sndbuf[1] = 0xC3;
  677. if(SocketActive->Send(sndbuf, 2) == -1) {
  678. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  679. return -1;
  680. }
  681. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  682. return 0;
  683. }
  684. int pico_get_current_params() {
  685. // Get current parameters from Pico device
  686. logger << LogPref::Flag(INFO) << "Current parameters:" << endl;
  687. logger << "Points: " << points_value << endl;
  688. logger << "Times size: " << times.size() << endl;
  689. logger << "Sample rate: " << sample_rate << endl;
  690. logger << "Number of channels: " << number_channels << endl;
  691. logger << "Trigger channel: " << trig_channel << endl;
  692. logger << "Trigger direction: " << th_direction << endl;
  693. sndbuf[0] = magic_number;
  694. sndbuf[1] = 0xC4;
  695. uint32_t bsize = points_vector.size() * sizeof(uint32_t);
  696. uint32_t test = 0;
  697. memcpy(sndbuf + 2, &bsize, sizeof(uint32_t));
  698. memcpy(sndbuf + 6, points_vector.data(), bsize);
  699. memcpy(&test, points_vector.data(), bsize);
  700. logger << LogPref::Flag(INFO) << test << endl;
  701. memcpy(sndbuf + 6 + bsize, times.data(), bsize);
  702. logger << LogPref::Flag(INFO) << times.data()[0] << endl;
  703. memcpy(sndbuf + 6 + 2 * bsize, &sample_rate, sizeof(sample_rate));
  704. memcpy(sndbuf + 10 + 2 * bsize, &number_channels, sizeof(number_channels));
  705. if(SocketActive->Send(sndbuf, 10 + sizeof(points_vector.data()) + sizeof(times.data())) == -1) {
  706. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  707. return -1;
  708. }
  709. return 0;
  710. }
  711. int pico_probe() {
  712. // Probe signal from Pico device
  713. sndbuf[0] = magic_number;
  714. sndbuf[1] = 0xC5;
  715. if(SocketActive->Send(sndbuf, 2) == -1) {
  716. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  717. return -1;
  718. }
  719. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  720. return 0;
  721. }
  722. int pico_set_points(const uint32_t* points, const uint32_t size) {
  723. // Set points for measurement
  724. this->points_vector.assign(points, points + size);
  725. points_value = *(std::max_element(points_vector.begin(), points_vector.end()));
  726. logger << LogPref::Flag(INFO) << "Points set" << endl;
  727. sndbuf[0] = magic_number;
  728. sndbuf[1] = 0xC6;
  729. if(SocketActive->Send(sndbuf, 2) == -1) {
  730. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  731. return -1;
  732. }
  733. return 0;
  734. }
  735. int pico_set_simple_points(const uint32_t points) {
  736. // Set simple points for measurement
  737. this->points_simple = points;
  738. logger << LogPref::Flag(INFO) << "Simple points set to: " << points << endl;
  739. sndbuf[0] = magic_number;
  740. sndbuf[1] = 0xD7;
  741. if(SocketActive->Send(sndbuf, 2) == -1) {
  742. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  743. return -1;
  744. }
  745. return 0;
  746. }
  747. int pico_set_sample_rate(const uint32_t sample_rate) {
  748. // Set sample rate for measurement
  749. this->sample_rate = sample_rate;
  750. logger << LogPref::Flag(INFO) << "Sample rate set to: " << sample_rate << endl;
  751. sndbuf[0] = magic_number;
  752. sndbuf[1] = 0xC7;
  753. if(SocketActive->Send(sndbuf, 2) == -1) {
  754. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  755. return -1;
  756. }
  757. return 0;
  758. }
  759. int pico_set_times(const uint32_t* times, const uint32_t size) {
  760. // Set times for measurement
  761. this->times.assign(times, times + size);
  762. logger << LogPref::Flag(INFO) << "Times set" << endl;
  763. sndbuf[0] = magic_number;
  764. sndbuf[1] = 0xC8;
  765. if(SocketActive->Send(sndbuf, 2) == -1) {
  766. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  767. return -1;
  768. }
  769. return 0;
  770. }
  771. int pico_set_num_trigger(const uint32_t num_trigger) {
  772. // Set number of channels for trigger
  773. this->num_triggers = num_trigger;
  774. logger << LogPref::Flag(INFO) << "Number of triggers set to: " << num_trigger << endl;
  775. sndbuf[0] = magic_number;
  776. sndbuf[1] = 0xD9;
  777. memcpy(sndbuf + 2, &num_triggers, sizeof(uint32_t));
  778. if(SocketActive->Send(sndbuf, 6) == -1) {
  779. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  780. return -1;
  781. }
  782. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  783. return 0;
  784. }
  785. int pico_configure_channels_s(const uint32_t number_channels, enPicoConnectProbeRange* channel_ranges, uint8_t trigger_channel)
  786. {
  787. this->number_channels = number_channels;
  788. logger << LogPref::Flag(INFO) << "Number of channels set to: " << number_channels << endl;
  789. this->channels = create_channel(number_channels);
  790. conditions = new PS4000A_CONDITION[number_channels];
  791. for (uint32_t i = 0; i < number_channels; ++i) {
  792. conditions[i].source = channels[i];
  793. conditions[i].condition = PS4000A_CONDITION_FALSE;
  794. }
  795. logger << LogPref::Flag(INFO) << "DEBUG RANGE" << trigger_channel << " " << channel_ranges[trigger_channel] << endl;
  796. auto retval = ps4000aSetChannel(handle, channels[trigger_channel], true, PS4000A_DC, channel_ranges[trigger_channel], 0);
  797. if(retval != 0) {
  798. logger << LogPref::Flag(ERROR) << "Failed to set trigger channel. Code: " << retval << endl;
  799. sndbuf[0] = magic_number;
  800. sndbuf[1] = 0xFF;
  801. sndbuf[2] = 0x06;
  802. this->error_code = retval;
  803. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  804. if(SocketActive->Send(sndbuf, 7) == -1) {
  805. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  806. }
  807. return -1;
  808. }
  809. logger << LogPref::Flag(INFO) << "Trigger channel set" << endl;
  810. for(uint8_t i = 0; i < number_channels; ++i) {
  811. if(i == trigger_channel) continue;
  812. else {
  813. logger << LogPref::Flag(INFO) << "DEBUG RANGE" << i << " " << channel_ranges[i] << endl;
  814. auto retval = ps4000aSetChannel(handle, channels[i], true, PS4000A_AC, channel_ranges[i], 0);
  815. if (retval != 0) {
  816. logger << LogPref::Flag(ERROR) << "Failed to set channel " << i << ". Code: " << retval << endl;
  817. sndbuf[0] = magic_number;
  818. sndbuf[1] = 0xFF;
  819. sndbuf[2] = 0x07 + i;
  820. this->error_code = retval;
  821. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  822. if(SocketActive->Send(sndbuf, 7) == -1) {
  823. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  824. }
  825. return -1;
  826. }
  827. logger << LogPref::Flag(INFO) << "Channel " << i << " set" << endl;
  828. }
  829. }
  830. if (retval != 0) {
  831. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << retval << endl;
  832. sndbuf[0] = magic_number;
  833. sndbuf[1] = 0xFF;
  834. sndbuf[2] = 0x12;
  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. sndbuf[0] = magic_number;
  843. sndbuf[1] = 0xE9;
  844. if(SocketActive->Send(sndbuf, 2) == -1) {
  845. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  846. return -1;
  847. }
  848. }
  849. int pico_configure_channels_t(const uint32_t number_channels, enPicoConnectProbeRange* channel_ranges, uint8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
  850. // Set number of channels for measurement
  851. this->number_channels = number_channels;
  852. logger << LogPref::Flag(INFO) << "Number of channels set to: " << number_channels << endl;
  853. logger << LogPref::Flag(INFO) << "trigger_channel set to: " << (int) trigger_channel << endl;
  854. logger << LogPref::Flag(INFO) << "direction set to: " << direction << endl;
  855. logger << LogPref::Flag(INFO) << "threshold set to: " << threshold << endl;
  856. logger << LogPref::Flag(INFO) << "autoTrigger_ms set to: " << autoTrigger_ms << endl;
  857. this->channels = create_channel(number_channels);
  858. conditions = new PS4000A_CONDITION[number_channels];
  859. for (uint32_t i = 0; i < number_channels; ++i) {
  860. conditions[i].source = channels[i];
  861. conditions[i].condition = PS4000A_CONDITION_FALSE;
  862. }
  863. logger << LogPref::Flag(INFO) << "DEBUG RANGE" << trigger_channel << " " << channel_ranges[trigger_channel] << endl;
  864. if(auto retval = ps4000aSetChannel(handle, channels[trigger_channel], true, PS4000A_DC, channel_ranges[trigger_channel], 0) != 0) {
  865. logger << LogPref::Flag(ERROR) << "Failed to set trigger channel. Code: " << retval << endl;
  866. sndbuf[0] = magic_number;
  867. sndbuf[1] = 0xFF;
  868. sndbuf[2] = 0x06;
  869. this->error_code = retval;
  870. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  871. if(SocketActive->Send(sndbuf, 7) == -1) {
  872. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  873. }
  874. return -1;
  875. }
  876. logger << LogPref::Flag(INFO) << "Trigger channel set" << endl;
  877. this->trig_channel = channels[trigger_channel];
  878. this->th_direction = static_cast<PS4000A_THRESHOLD_DIRECTION>(direction);
  879. this->threshold = threshold;
  880. this->trig_delay = 10;
  881. this->trig_autoTrigger_ms = autoTrigger_ms;
  882. for(uint8_t i = 0; i < number_channels; ++i) {
  883. if(i == trigger_channel) continue;
  884. else {
  885. logger << LogPref::Flag(INFO) << "DEBUG RANGE" << i << " " << channel_ranges[i] << endl;
  886. auto retval = ps4000aSetChannel(handle, channels[i], true, PS4000A_AC, channel_ranges[i], 0);
  887. if (retval != 0) {
  888. logger << LogPref::Flag(ERROR) << "Failed to set channel " << i << ". Code: " << retval << endl;
  889. sndbuf[0] = magic_number;
  890. sndbuf[1] = 0xFF;
  891. sndbuf[2] = 0x07 + i;
  892. this->error_code = retval;
  893. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  894. if(SocketActive->Send(sndbuf, 7) == -1) {
  895. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  896. }
  897. return -1;
  898. }
  899. logger << LogPref::Flag(INFO) << "Channel " << i << " set" << endl;
  900. }
  901. }
  902. logger << LogPref::Flag(INFO) << "DEBUG TRIGGER" << endl;
  903. logger << LogPref::Flag(INFO) << this->handle << endl;
  904. logger << LogPref::Flag(INFO) << this->trig_channel << endl;
  905. logger << LogPref::Flag(INFO) << this->threshold << endl;
  906. logger << LogPref::Flag(INFO) << this->th_direction << endl;
  907. logger << LogPref::Flag(INFO) << this->trig_delay << endl;
  908. logger << LogPref::Flag(INFO) << this->trig_autoTrigger_ms << endl;
  909. auto retval = ps4000aSetSimpleTrigger
  910. (
  911. handle,
  912. true,
  913. conditions[trigger_channel].source,
  914. threshold,
  915. th_direction,
  916. trig_delay,
  917. trig_autoTrigger_ms
  918. );
  919. if (retval != 0) {
  920. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << retval << endl;
  921. sndbuf[0] = magic_number;
  922. sndbuf[1] = 0xFF;
  923. sndbuf[2] = 0x12;
  924. this->error_code = retval;
  925. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  926. if(SocketActive->Send(sndbuf, 7) == -1) {
  927. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  928. }
  929. return -1;
  930. }
  931. sndbuf[0] = magic_number;
  932. sndbuf[1] = 0xC9;
  933. if(SocketActive->Send(sndbuf, 2) == -1) {
  934. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  935. return -1;
  936. }
  937. return 0;
  938. }
  939. // To be deprecated in future versions
  940. int pico_begin_measurement_times() {
  941. // Begin measurement on Pico device
  942. data_buffer_vec.assign(times.size(), std::vector<int16_t*>(number_channels, nullptr));
  943. for(size_t i = 0; i < times.size(); ++i) {
  944. logger << LogPref::Flag(INFO) << "Set data buffer:" << endl;
  945. for(size_t j = 0; j < number_channels; ++j) {
  946. data_buffer_vec[i][j] = new int16_t[points_vector[i]];
  947. }
  948. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;
  949. uint32_t timebase = timebase_choice(sample_rate);
  950. logger << "Timebase = " << timebase << endl;
  951. int32_t timeIntervalNanoseconds = 0;
  952. int32_t maxSamples = 0;
  953. int32_t segmentIndex = 0;
  954. int32_t retval = ps4000aGetTimebase(handle, timebase, points_vector[i], &timeIntervalNanoseconds,
  955. &maxSamples, segmentIndex);
  956. logger << "retval: " << retval << endl;
  957. if(retval != 0) {
  958. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  959. sndbuf[0] = magic_number;
  960. sndbuf[1] = 0xFF;
  961. sndbuf[2] = 0x13;
  962. this->error_code = retval;
  963. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  964. if(SocketActive->Send(sndbuf, 7) == -1) {
  965. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  966. }
  967. return -1;
  968. }
  969. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  970. int32_t noOfPreTriggerSamples = 0;
  971. int32_t noOfPostTriggerSamples = points_value;
  972. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  973. nullptr, segmentIndex, nullptr, nullptr);
  974. logger << "retval: " << retval << endl;
  975. if(retval != 0) {
  976. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  977. sndbuf[0] = magic_number;
  978. sndbuf[1] = 0xFF;
  979. sndbuf[2] = 0x14;
  980. this->error_code = retval;
  981. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  982. if(SocketActive->Send(sndbuf, 7) == -1) {
  983. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  984. }
  985. return -1;
  986. }
  987. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  988. int16_t ready = 0;
  989. while (ready == 0) {
  990. retval = ps4000aIsReady(handle, &ready);
  991. }
  992. for(uint8_t j = 0; j < number_channels; ++j) {
  993. logger << LogPref::Flag(INFO) << "Set data buffer for channel " << j << endl;
  994. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  995. retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_vector[i],
  996. segmentIndex, mode);
  997. logger << "retval: " << retval << endl;
  998. if(retval != 0) {
  999. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1000. sndbuf[0] = magic_number;
  1001. sndbuf[1] = 0xFF;
  1002. sndbuf[2] = 0x15 + j;
  1003. this->error_code = retval;
  1004. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1005. if(SocketActive->Send(sndbuf, 7) == -1) {
  1006. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1007. }
  1008. return -1;
  1009. }
  1010. }
  1011. logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
  1012. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1013. uint32_t StartIndex = 0;
  1014. uint32_t noOfSamples = static_cast<uint32_t>(points_vector[i]);
  1015. int16_t overflow = 0;
  1016. uint32_t DownSampleRatio = 1;
  1017. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  1018. segmentIndex, &overflow);
  1019. logger << "retval: " << retval << endl;
  1020. if(retval != 0) {
  1021. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1022. sndbuf[0] = magic_number;
  1023. sndbuf[1] = 0xFF;
  1024. sndbuf[2] = 0x21;
  1025. this->error_code = retval;
  1026. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1027. if(SocketActive->Send(sndbuf, 7) == -1) {
  1028. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1029. }
  1030. return -1;
  1031. }
  1032. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1033. logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
  1034. sndbuf[0] = magic_number;
  1035. sndbuf[1] = 0xCA;
  1036. if(SocketActive->Send(sndbuf, 2) == -1) {
  1037. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1038. return -1;
  1039. }
  1040. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1041. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1042. logger << LogPref::Flag(INFO) << "Sleeping for " << times[i+1] - times[i] << " ms" << endl;
  1043. if(i < times.size() - 1) {
  1044. std::chrono::duration<int64, std::milli> duration(times[i+1] - times[i]);
  1045. std::this_thread::sleep_for(duration);
  1046. }
  1047. }
  1048. for(int i = 0; i < data_buffer_vec.size(); ++i) {
  1049. logger << LogPref::Flag(INFO) << "Writing data " << i << " to file" << endl;
  1050. std::string filename = "data" + std::to_string(i);
  1051. writing_data_fixed_name(filename, data_buffer_vec[i], points_vector[i], number_channels);
  1052. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1053. }
  1054. logger << LogPref::Flag(INFO) << "Free buffers" << endl;
  1055. for(uint8_t j = 0; j < times.size(); ++j)
  1056. {
  1057. free_buffers(data_buffer_vec[j]);
  1058. }
  1059. logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
  1060. logger << LogPref::Flag(INFO) << "Measurement done" << endl;
  1061. sndbuf[0] = magic_number;
  1062. sndbuf[1] = 0xCB;
  1063. if (SocketActive->Send(sndbuf, 2) == -1) {
  1064. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1065. return -1;
  1066. }
  1067. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1068. return 0;
  1069. }
  1070. int pico_exit() {
  1071. // Exit Pico device and free resources
  1072. if (handle != NULL) {
  1073. auto ret = ps4000aCloseUnit(handle);
  1074. if (ret != 0) {
  1075. logger << LogPref::Flag(ERROR) << "Failed to close Pico device. Code: " << ret << endl;
  1076. sndbuf[0] = magic_number;
  1077. sndbuf[1] = 0xFF;
  1078. sndbuf[2] = 0x23;
  1079. this->error_code = ret;
  1080. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1081. if(SocketActive->Send(sndbuf, 7) == -1) {
  1082. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1083. }
  1084. return -1;
  1085. }
  1086. sndbuf[0] = magic_number;
  1087. sndbuf[1] = 0xCD;
  1088. if(SocketActive->Send(sndbuf, 2) == -1) {
  1089. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1090. return -1;
  1091. }
  1092. logger << LogPref::Flag(INFO) << "Pico device closed" << endl;
  1093. handle = NULL;
  1094. }
  1095. return 0;
  1096. }
  1097. int pico_configure_trigger(int8_t trigger_channel, int32_t direction, uint16_t threshold, int16_t autoTrigger_ms) {
  1098. // Configure trigger for Pico device
  1099. this->trig_channel = channels[trigger_channel];
  1100. this->th_direction = static_cast<PS4000A_THRESHOLD_DIRECTION>(direction);
  1101. this->trig_delay = 10;
  1102. this->threshold = threshold;
  1103. this->trig_autoTrigger_ms = autoTrigger_ms;
  1104. logger << LogPref::Flag(INFO) << "Trigger configured" << endl;
  1105. sndbuf[0] = magic_number;
  1106. sndbuf[1] = 0xC9;
  1107. if(SocketActive->Send(sndbuf, 2) == -1) {
  1108. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1109. return -1;
  1110. }
  1111. auto retval = ps4000aSetSimpleTrigger
  1112. (
  1113. handle,
  1114. true,
  1115. channels[trigger_channel],
  1116. this->threshold,
  1117. this->th_direction,
  1118. this->trig_delay,
  1119. this->trig_autoTrigger_ms
  1120. );
  1121. if (retval != 0) {
  1122. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << retval << endl;
  1123. sndbuf[0] = magic_number;
  1124. sndbuf[1] = 0xFF;
  1125. sndbuf[2] = 0x16;
  1126. this->error_code = retval;
  1127. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1128. if(SocketActive->Send(sndbuf, 7) == -1) {
  1129. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1130. }
  1131. return -1;
  1132. }
  1133. logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;\
  1134. sndbuf[0] = magic_number;
  1135. sndbuf[1] = 0xE0;
  1136. if(SocketActive->Send(sndbuf, 2) == -1) {
  1137. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1138. return -1;
  1139. }
  1140. return 0;
  1141. }
  1142. int pico_simple_measure()
  1143. {
  1144. simple_data_buffer = std::vector<int16_t*>(number_channels, nullptr);
  1145. logger << LogPref::Flag(INFO) << "Set simple data buffer:" << endl;
  1146. for(size_t j = 0; j < number_channels; ++j) {
  1147. simple_data_buffer[j] = new int16_t[points_simple];
  1148. }
  1149. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;\
  1150. uint32_t timebase = timebase_choice(sample_rate);
  1151. logger << "Timebase = " << timebase << endl;
  1152. int32_t timeIntervalNanoseconds = 0;
  1153. int32_t maxSamples = 0;
  1154. int32_t segmentIndex = 0;
  1155. int32_t retval = ps4000aGetTimebase(handle, timebase, points_simple, &timeIntervalNanoseconds,
  1156. &maxSamples, segmentIndex);
  1157. logger << "retval: " << retval << endl;
  1158. if(retval != 0) {
  1159. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  1160. sndbuf[0] = magic_number;
  1161. sndbuf[1] = 0xFF;
  1162. sndbuf[2] = 0x17;
  1163. this->error_code = retval;
  1164. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1165. if(SocketActive->Send(sndbuf, 7) == -1) {
  1166. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1167. }
  1168. return -1;
  1169. }
  1170. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  1171. int32_t noOfPreTriggerSamples = (int32_t) (points_simple * premeasurement_percentage / 100.0f);
  1172. int32_t noOfPostTriggerSamples = points_simple;
  1173. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  1174. nullptr, segmentIndex, nullptr, nullptr);
  1175. logger << "retval: " << retval << endl;
  1176. if(retval != 0) {
  1177. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  1178. sndbuf[0] = magic_number;
  1179. sndbuf[1] = 0xFF;
  1180. sndbuf[2] = 0x18;
  1181. this->error_code = retval;
  1182. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1183. if(SocketActive->Send(sndbuf, 7) == -1) {
  1184. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1185. }
  1186. return -1;
  1187. }
  1188. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  1189. int16_t ready = 0;
  1190. while (ready == 0) {
  1191. retval = ps4000aIsReady(handle, &ready);
  1192. }
  1193. for(uint8_t j = 0; j < number_channels; ++j) {
  1194. logger << LogPref::Flag(INFO) << "Set simple data buffer for channel " << j << endl;
  1195. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  1196. retval = ps4000aSetDataBuffer(handle, channels[j], simple_data_buffer[j], points_simple,
  1197. segmentIndex, mode);
  1198. logger << "retval: " << retval << endl;
  1199. if(retval != 0) {
  1200. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1201. sndbuf[0] = magic_number;
  1202. sndbuf[1] = 0xFF;
  1203. sndbuf[2] = 0x19 + j;
  1204. this->error_code = retval;
  1205. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1206. if(SocketActive->Send(sndbuf, 7) == -1) {
  1207. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1208. }
  1209. return -1;
  1210. }
  1211. }
  1212. logger << LogPref::Flag(INFO) << "Set simple data buffer done" << endl;
  1213. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1214. uint32_t StartIndex = 0;
  1215. uint32_t noOfSamples = static_cast<uint32_t>(points_simple);
  1216. int16_t overflow = 0;
  1217. uint32_t DownSampleRatio = 1;
  1218. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  1219. segmentIndex, &overflow);
  1220. logger << "retval: " << retval << endl;
  1221. if(retval != 0) {
  1222. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1223. sndbuf[0] = magic_number;
  1224. sndbuf[1] = 0xFF;
  1225. sndbuf[2] = 0x20;
  1226. this->error_code = retval;
  1227. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1228. if(SocketActive->Send(sndbuf, 7) == -1) {
  1229. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1230. }
  1231. return -1;
  1232. }
  1233. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1234. std::string filename = "simple_data_channel.csv";
  1235. writing_data_fixed_name(filename, simple_data_buffer, points_simple, 1);
  1236. logger << LogPref::Flag(INFO) << "Free simple data buffers" << endl;
  1237. for(uint8_t j = 0; j < number_channels; ++j)
  1238. {
  1239. delete[] simple_data_buffer[j];
  1240. simple_data_buffer[j] = nullptr;
  1241. }
  1242. logger << LogPref::Flag(INFO) << "Simple data buffers freed" << endl;
  1243. logger << LogPref::Flag(INFO) << "Simple measurement done" << endl;
  1244. sndbuf[0] = magic_number;
  1245. sndbuf[1] = 0xEB;
  1246. if(SocketActive->Send(sndbuf, 2) == -1) {
  1247. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1248. return -1;
  1249. }
  1250. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1251. return 0;
  1252. }
  1253. int pico_set_premeasurement(uint32_t percentage)
  1254. {
  1255. // Set pre-measurement percentage
  1256. this->premeasurement_percentage = percentage;
  1257. logger << LogPref::Flag(INFO) << "Pre-measurement percentage set to: " << percentage << "%" << endl;
  1258. sndbuf[0] = magic_number;
  1259. sndbuf[1] = 0xE8;
  1260. if(SocketActive->Send(sndbuf, 2) == -1) {
  1261. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1262. return -1;
  1263. }
  1264. return 0;
  1265. }
  1266. int pico_multitrigger_measure()
  1267. {
  1268. // Multi-trigger measurement
  1269. logger << LogPref::Flag(INFO) << "Multi-trigger measurement started" << endl;
  1270. data_buffer_vec = std::vector<std::vector<int16_t*>>(num_triggers, std::vector<int16_t*>(number_channels, nullptr));
  1271. for(size_t i = 0; i < num_triggers; ++i) {
  1272. data_buffer_vec[i].assign(number_channels, nullptr);
  1273. for(size_t j = 0; j < number_channels; ++j) {
  1274. data_buffer_vec[i][j] = new int16_t[points_simple];
  1275. }
  1276. }
  1277. for(size_t i = 0; i < num_triggers; ++i) {
  1278. logger << LogPref::Flag(INFO) << "Set data buffer for trigger " << i << ":" << endl;
  1279. for(size_t j = 0; j < number_channels; ++j) {
  1280. data_buffer_vec[i][j] = new int16_t[points_simple];
  1281. }
  1282. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;
  1283. uint32_t timebase = timebase_choice(sample_rate);
  1284. logger << "Timebase = " << timebase << endl;
  1285. int32_t timeIntervalNanoseconds = 0;
  1286. int32_t maxSamples = 0;
  1287. int32_t segmentIndex = 0;
  1288. int32_t retval = ps4000aGetTimebase(handle, timebase, points_simple, &timeIntervalNanoseconds,
  1289. &maxSamples, segmentIndex);
  1290. logger << "retval: " << retval << endl;
  1291. if(retval != 0) {
  1292. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  1293. sndbuf[0] = magic_number;
  1294. sndbuf[1] = 0xFF;
  1295. sndbuf[2] = 0x22;
  1296. this->error_code = retval;
  1297. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1298. if(SocketActive->Send(sndbuf, 7) == -1) {
  1299. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1300. }
  1301. return -1;
  1302. }
  1303. logger << LogPref::Flag(INFO) << points_simple << endl;
  1304. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  1305. int32_t noOfPreTriggerSamples = (int32_t) (points_simple * premeasurement_percentage / 100.0f);
  1306. int32_t noOfPostTriggerSamples = points_simple;
  1307. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  1308. nullptr, segmentIndex, nullptr, nullptr);
  1309. logger << "retval: " << retval << endl;
  1310. if(retval != 0) {
  1311. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  1312. sndbuf[0] = magic_number;
  1313. sndbuf[1] = 0xFF;
  1314. sndbuf[2] = 0x23;
  1315. this->error_code = retval;
  1316. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1317. if(SocketActive->Send(sndbuf, 7) == -1) {
  1318. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1319. }
  1320. return -1;
  1321. }
  1322. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  1323. int16_t ready = 0;
  1324. while (ready == 0) {
  1325. retval = ps4000aIsReady(handle, &ready);
  1326. }
  1327. logger << LogPref::Flag(INFO) << "Set data buffer for channels:" << endl;
  1328. for(uint8_t j = 0; j < number_channels; ++j) {
  1329. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  1330. retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_simple,
  1331. segmentIndex, mode);
  1332. logger << "retval: " << retval << endl;
  1333. if(retval != 0) {
  1334. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1335. sndbuf[0] = magic_number;
  1336. sndbuf[1] = 0xFF;
  1337. sndbuf[2] = 0x24 + j;
  1338. this->error_code = retval;
  1339. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1340. if(SocketActive->Send(sndbuf, 7) == -1) {
  1341. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1342. }
  1343. return -1;
  1344. }
  1345. }
  1346. logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
  1347. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1348. uint32_t StartIndex = 0;
  1349. uint32_t noOfSamples = static_cast<uint32_t>(points_simple);
  1350. int16_t overflow = 0;
  1351. uint32_t DownSampleRatio = 1;
  1352. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  1353. segmentIndex, &overflow);
  1354. logger << "retval: " << retval << endl;
  1355. if(retval != 0) {
  1356. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1357. sndbuf[0] = magic_number;
  1358. sndbuf[1] = 0xFF;
  1359. sndbuf[2] = 0x25;
  1360. this->error_code = retval;
  1361. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1362. if(SocketActive->Send(sndbuf, 7) == -1) {
  1363. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1364. }
  1365. return -1;
  1366. }
  1367. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1368. logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
  1369. sndbuf[0] = magic_number;
  1370. sndbuf[1] = 0xDA;
  1371. if(SocketActive->Send(sndbuf, 2) == -1) {
  1372. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1373. return -1;
  1374. }
  1375. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1376. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1377. logger << LogPref::Flag(INFO) << this->handle << endl;
  1378. logger << LogPref::Flag(INFO) << this->trig_channel << endl;
  1379. logger << LogPref::Flag(INFO) << this->threshold << endl;
  1380. logger << LogPref::Flag(INFO) << this->th_direction << endl;
  1381. logger << LogPref::Flag(INFO) << this->trig_delay << endl;
  1382. logger << LogPref::Flag(INFO) << this->trig_autoTrigger_ms << endl;
  1383. auto trig_retval = ps4000aSetSimpleTrigger
  1384. (
  1385. this->handle,
  1386. true,
  1387. this->trig_channel,
  1388. this->threshold,
  1389. this->th_direction,
  1390. this->trig_delay,
  1391. this->trig_autoTrigger_ms
  1392. );
  1393. if (trig_retval != 0) {
  1394. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << trig_retval << endl;
  1395. sndbuf[0] = magic_number;
  1396. sndbuf[1] = 0xFF;
  1397. sndbuf[2] = 0x26;
  1398. this->error_code = trig_retval;
  1399. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1400. if(SocketActive->Send(sndbuf, 7) == -1) {
  1401. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1402. }
  1403. return -1;
  1404. }
  1405. logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;
  1406. }
  1407. logger << LogPref::Flag(INFO) << "Writing data to files" << endl;
  1408. std::chrono::time_point<std::chrono::system_clock> time_now = std::chrono::system_clock::now();
  1409. std::time_t t_n = std::chrono::system_clock::to_time_t(time_now);
  1410. char time_dir_nm[100];
  1411. std::strftime(time_dir_nm, sizeof(time_dir_nm), "%Y%m%d-%H%M%S", std::localtime(&t_n));
  1412. #ifdef _WIN32
  1413. std::string dir = std::string("output\\") + std::string(time_dir_nm);
  1414. createDirectoryRecursively(dir);
  1415. #endif // _WIN32
  1416. for(int i = 0; i < data_buffer_vec.size(); ++i) {
  1417. logger << LogPref::Flag(INFO) << "Writing data " << i << " to file" << endl;
  1418. std::string filename = std::string(time_dir_nm) + "\\data_trigger_" + std::to_string(i);
  1419. writing_data_fixed_name(filename, data_buffer_vec[i], points_simple, number_channels);
  1420. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1421. }
  1422. logger << LogPref::Flag(INFO) << "Free buffers" << endl;
  1423. for(uint8_t j = 0; j < num_triggers; ++j)
  1424. {
  1425. free_buffers(data_buffer_vec[j]);
  1426. }
  1427. logger << LogPref::Flag(INFO) << "Buffers freed" << endl;
  1428. logger << LogPref::Flag(INFO) << "Multi-trigger measurement done" << endl;
  1429. sndbuf[0] = magic_number;
  1430. sndbuf[1] = 0xDB;
  1431. if(SocketActive->Send(sndbuf, 2) == -1) {
  1432. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1433. return -1;
  1434. }
  1435. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1436. return 0;
  1437. }
  1438. int pico_tcp_measurement_s()
  1439. {
  1440. logger << LogPref::Flag(INFO) << "Multi-trigger measurement started" << endl;
  1441. data_buffer_vec.assign(num_triggers, std::vector<int16_t*>(number_channels, nullptr));
  1442. int16_t* data_buffer_arr[num_triggers][number_channels];
  1443. logger << LogPref::Flag(INFO) << "Get timebase:" << endl;
  1444. uint32_t timebase = timebase_choice(sample_rate);
  1445. logger << "Timebase = " << timebase << endl;
  1446. #define FAST_BLOCK
  1447. #ifdef SLOW_BLOCK
  1448. for(size_t i = 0; i < num_triggers; ++i) {
  1449. logger << LogPref::Flag(INFO) << "Set data buffer:" << endl;
  1450. for(size_t j = 0; j < number_channels; ++j) {
  1451. data_buffer_vec[i][j] = new int16_t[points_vector[i]];
  1452. memset(data_buffer_vec[i][j], 0, points_vector[i]);
  1453. }
  1454. int32_t timeIntervalNanoseconds = 0;
  1455. int32_t maxSamples = 0;
  1456. int32_t segmentIndex = 0;
  1457. int32_t retval = ps4000aGetTimebase(handle, timebase, points_vector[i], &timeIntervalNanoseconds,
  1458. &maxSamples, segmentIndex);
  1459. logger << "retval: " << retval << endl;
  1460. if(retval != 0) {
  1461. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  1462. sndbuf[0] = magic_number;
  1463. sndbuf[1] = 0xFF;
  1464. sndbuf[2] = 0x13;
  1465. this->error_code = retval;
  1466. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1467. if(SocketActive->Send(sndbuf, 7) == -1) {
  1468. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1469. }
  1470. return -1;
  1471. }
  1472. logger << LogPref::Flag(INFO) << "Run block:" << endl;
  1473. int32_t noOfPreTriggerSamples = 0;
  1474. int32_t noOfPostTriggerSamples = points_value;
  1475. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  1476. nullptr, segmentIndex, nullptr, nullptr);
  1477. logger << "retval: " << retval << endl;
  1478. if(retval != 0) {
  1479. logger << LogPref::Flag(ERROR) << "Failed to run block. Code: " << retval << endl;
  1480. sndbuf[0] = magic_number;
  1481. sndbuf[1] = 0xFF;
  1482. sndbuf[2] = 0x14;
  1483. this->error_code = retval;
  1484. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1485. if(SocketActive->Send(sndbuf, 7) == -1) {
  1486. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1487. }
  1488. return -1;
  1489. }
  1490. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  1491. int16_t ready = 0;
  1492. while (ready == 0) {
  1493. retval = ps4000aIsReady(handle, &ready);
  1494. }
  1495. for(size_t j = 0; j < number_channels; ++j) {
  1496. logger << LogPref::Flag(INFO) << "Set data buffer for channel " << j << endl;
  1497. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  1498. retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_vector[i],
  1499. segmentIndex, mode);
  1500. logger << "retval: " << retval << endl;
  1501. if(retval != 0) {
  1502. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1503. sndbuf[0] = magic_number;
  1504. sndbuf[1] = 0xFF;
  1505. sndbuf[2] = 0x15 + j;
  1506. this->error_code = retval;
  1507. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1508. if(SocketActive->Send(sndbuf, 7) == -1) {
  1509. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1510. }
  1511. return -1;
  1512. }
  1513. }
  1514. logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
  1515. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1516. uint32_t StartIndex = 0;
  1517. uint32_t noOfSamples = static_cast<uint32_t>(points_vector[i]);
  1518. int16_t overflow = 0;
  1519. uint32_t DownSampleRatio = 1;
  1520. retval = ps4000aGetValues(handle, StartIndex, &noOfSamples, DownSampleRatio, PS4000A_RATIO_MODE_NONE,
  1521. segmentIndex, &overflow);
  1522. logger << "retval: " << retval << endl;
  1523. if(retval != 0) {
  1524. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1525. sndbuf[0] = magic_number;
  1526. sndbuf[1] = 0xFF;
  1527. sndbuf[2] = 0x21;
  1528. this->error_code = retval;
  1529. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1530. if(SocketActive->Send(sndbuf, 7) == -1) {
  1531. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1532. }
  1533. return -1;
  1534. }
  1535. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1536. logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
  1537. sndbuf[0] = magic_number;
  1538. sndbuf[1] = 0xFA;
  1539. if(SocketActive->Send(sndbuf, 2) == -1) {
  1540. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1541. return -1;
  1542. }
  1543. int bytes_recieved = SocketActive->Receive(MAX_PACKET, rcbuf);
  1544. if(rcbuf[1] == 0x3A)
  1545. {
  1546. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1547. }
  1548. else{
  1549. return -1;
  1550. }
  1551. logger << LogPref::Flag(INFO) << "Data sent to socket" << endl;
  1552. /*
  1553. auto trig_retval = ps4000aSetSimpleTrigger
  1554. (
  1555. this->handle,
  1556. true,
  1557. this->trig_channel,
  1558. this->threshold,
  1559. this->th_direction,
  1560. this->trig_delay,
  1561. this->trig_autoTrigger_ms
  1562. );
  1563. if (trig_retval != 0) {
  1564. logger << LogPref::Flag(ERROR) << "Failed to set trigger. Code: " << trig_retval << endl;
  1565. sndbuf[0] = magic_number;
  1566. sndbuf[1] = 0xFF;
  1567. sndbuf[2] = 0x26;
  1568. this->error_code = trig_retval;
  1569. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1570. if(SocketActive->Send(sndbuf, 7) == -1) {
  1571. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1572. }
  1573. return -1;
  1574. }
  1575. */
  1576. logger << LogPref::Flag(INFO) << "Trigger set successfully" << endl;
  1577. logger << LogPref::Flag(INFO) << "Wait for trig" << endl;
  1578. }
  1579. #endif
  1580. #ifdef FAST_BLOCK
  1581. logger << LogPref::Flag(INFO) << "Set data buffer:" << endl;
  1582. for(size_t i = 0; i < num_triggers; ++i) {
  1583. for(size_t j = 0; j < number_channels; ++j) {
  1584. data_buffer_vec[i][j] = new int16_t[points_vector[i]];
  1585. memset(data_buffer_vec[i][j], 0, points_vector[i]);
  1586. }
  1587. }
  1588. int32_t* nSamples = new int32_t[num_triggers];
  1589. int32_t retval = ps4000aMemorySegments(handle, num_triggers, nSamples);
  1590. if(retval != 0) {
  1591. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1592. sndbuf[0] = magic_number;
  1593. sndbuf[1] = 0xFF;
  1594. sndbuf[2] = 0x21;
  1595. this->error_code = retval;
  1596. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1597. if(SocketActive->Send(sndbuf, 7) == -1) {
  1598. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1599. }
  1600. return -1;
  1601. }
  1602. retval = ps4000aSetNoOfCaptures(handle, num_triggers);
  1603. if(retval != 0) {
  1604. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1605. sndbuf[0] = magic_number;
  1606. sndbuf[1] = 0xFF;
  1607. sndbuf[2] = 0x21;
  1608. this->error_code = retval;
  1609. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1610. if(SocketActive->Send(sndbuf, 7) == -1) {
  1611. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1612. }
  1613. return -1;
  1614. }
  1615. int32_t timeIntervalNanoseconds = 0;
  1616. int32_t maxSamples = 0;
  1617. int32_t segmentIndex = 0;
  1618. retval = ps4000aGetTimebase(handle, timebase, points_value, &timeIntervalNanoseconds,
  1619. &maxSamples, segmentIndex);
  1620. logger << "retval: " << retval << endl;
  1621. if(retval != 0) {
  1622. logger << LogPref::Flag(ERROR) << "Failed to get timebase. Code: " << retval << endl;
  1623. sndbuf[0] = magic_number;
  1624. sndbuf[1] = 0xFF;
  1625. sndbuf[2] = 0x13;
  1626. this->error_code = retval;
  1627. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1628. if(SocketActive->Send(sndbuf, 7) == -1) {
  1629. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1630. }
  1631. return -1;
  1632. }
  1633. int32_t noOfPreTriggerSamples = 0;
  1634. int32_t noOfPostTriggerSamples = points_value;
  1635. logger << LogPref::Flag(INFO) << "Run block" << endl;
  1636. retval = ps4000aRunBlock(handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase,
  1637. nullptr, segmentIndex, nullptr, nullptr);
  1638. if(retval != 0) {
  1639. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1640. sndbuf[0] = magic_number;
  1641. sndbuf[1] = 0xFF;
  1642. sndbuf[2] = 0x21;
  1643. this->error_code = retval;
  1644. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1645. if(SocketActive->Send(sndbuf, 7) == -1) {
  1646. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1647. }
  1648. return -1;
  1649. }
  1650. logger << LogPref::Flag(INFO) << "Run block done" << endl;
  1651. int16_t ready = 0;
  1652. while (ready == 0) {
  1653. retval = ps4000aIsReady(handle, &ready);
  1654. }
  1655. logger << LogPref::Flag(INFO) << "Data ready" << endl;
  1656. for(size_t i = 0; i < num_triggers; ++i) {
  1657. for(size_t j = 0; j < number_channels; ++j) {
  1658. logger << LogPref::Flag(INFO) << "Set data buffer for channel " << j << endl;
  1659. PS4000A_RATIO_MODE mode = PS4000A_RATIO_MODE_NONE;
  1660. retval = ps4000aSetDataBuffer(handle, channels[j], data_buffer_vec[i][j], points_vector[i],
  1661. i, mode);
  1662. logger << "retval: " << retval << endl;
  1663. if(retval != 0) {
  1664. logger << LogPref::Flag(ERROR) << "Failed to set data buffer for channel " << j << ". Code: " << retval << endl;
  1665. sndbuf[0] = magic_number;
  1666. sndbuf[1] = 0xFF;
  1667. sndbuf[2] = 0x15 + j;
  1668. this->error_code = retval;
  1669. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1670. if(SocketActive->Send(sndbuf, 7) == -1) {
  1671. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1672. }
  1673. return -1;
  1674. }
  1675. }
  1676. }
  1677. logger << LogPref::Flag(INFO) << "Set data buffer done" << endl;
  1678. logger << LogPref::Flag(INFO) << "Data collection start" << endl;
  1679. uint32_t StartIndex = 0;
  1680. uint32_t noOfSamples = static_cast<uint32_t>(points_value);
  1681. int16_t overflow = 0;
  1682. uint32_t DownSampleRatio = 1;
  1683. retval = ps4000aGetValuesBulk(handle, &noOfSamples, 0, num_triggers-1, DownSampleRatio, PS4000A_RATIO_MODE_NONE, &overflow);
  1684. logger << "retval: " << retval << endl;
  1685. if(retval != 0) {
  1686. logger << LogPref::Flag(ERROR) << "Failed to get values. Code: " << retval << endl;
  1687. sndbuf[0] = magic_number;
  1688. sndbuf[1] = 0xFF;
  1689. sndbuf[2] = 0x21;
  1690. this->error_code = retval;
  1691. memcpy(sndbuf + 3, &this->error_code, sizeof(uint32_t));
  1692. if(SocketActive->Send(sndbuf, 7) == -1) {
  1693. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1694. }
  1695. return -1;
  1696. }
  1697. logger << LogPref::Flag(INFO) << "Data collection done" << endl;
  1698. logger << LogPref::Flag(INFO) << "Confirm data to socket" << endl;
  1699. #endif // FAST_BLOCK
  1700. logger << LogPref::Flag(INFO) << "Sending confirmation code" << endl;
  1701. sndbuf[0] = magic_number;
  1702. sndbuf[1] = 0xFB;
  1703. if(SocketActive->Send(sndbuf, 2) == -1) {
  1704. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1705. return -1;
  1706. }
  1707. logger << LogPref::Flag(INFO) << "Confirmation code sended" << endl;
  1708. int bytes_recieved = SocketActive->Receive(MAX_PACKET, rcbuf);
  1709. if(rcbuf[1] == 0x3B)
  1710. {
  1711. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1712. }
  1713. else{
  1714. return -1;
  1715. }
  1716. logger << LogPref::Flag(INFO) << "Sending data" << endl;
  1717. std::chrono::time_point<std::chrono::system_clock> time_now = std::chrono::system_clock::now();
  1718. std::time_t t_n = std::chrono::system_clock::to_time_t(time_now);
  1719. for(uint32_t i = 0; i < num_triggers; ++i)
  1720. {
  1721. for(uint32_t j = 0; j < number_channels; ++j)
  1722. {
  1723. uint32_t data_seek = 0;
  1724. uint32_t packet = 0;
  1725. uint32_t total_data = sizeof(int16_t) * points_vector[i];
  1726. uint32_t total_packets = 1 + ((uint32_t) ((total_data * 1.0f) / MAX_PACKET));
  1727. do
  1728. {
  1729. uint32_t ndata_sent;
  1730. if(total_data - data_seek < MAX_PACKET - 22)
  1731. {
  1732. ndata_sent = total_data - data_seek;
  1733. }
  1734. else
  1735. {
  1736. ndata_sent = MAX_PACKET - 22;
  1737. }
  1738. sndbuf[0] = magic_number;
  1739. sndbuf[1] = 0xFD;
  1740. memcpy(sndbuf + 2, &i, sizeof(uint32_t));
  1741. memcpy(sndbuf + 6, &j, sizeof(uint32_t));
  1742. memcpy(sndbuf + 10, &total_packets, sizeof(uint32_t));
  1743. memcpy(sndbuf + 14, &packet, sizeof(uint32_t));
  1744. memcpy(sndbuf + 18, &ndata_sent, sizeof(uint32_t));
  1745. int16_t test_data = data_buffer_vec[i][j][0];
  1746. memcpy(sndbuf + 22, data_buffer_vec[i][j] + (data_seek / 2), ndata_sent);
  1747. logger << LogPref::Flag(INFO) << "Total data: " << total_data << ". Data seek: " << data_seek << ". Test data:" << test_data << endl;
  1748. logger << LogPref::Flag(INFO) << "Sending packet " << packet << " of " << total_packets << " (sig" << i << "ch" << j << "). Data to send: " << ndata_sent << endl;
  1749. if(SocketActive->Send(sndbuf, 22 + ndata_sent) == -1) {
  1750. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1751. return -1;
  1752. }
  1753. data_seek += ndata_sent;
  1754. ++packet;
  1755. int bytes_recieved = SocketActive->Receive(MAX_PACKET, rcbuf);
  1756. if(rcbuf[1] == 0x3D)
  1757. {
  1758. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1759. }
  1760. else{
  1761. return -1;
  1762. }
  1763. } while (packet < total_packets);
  1764. }
  1765. }
  1766. sndbuf[0] = magic_number;
  1767. sndbuf[1] = 0xFC;
  1768. if(SocketActive->Send(sndbuf, 2) == -1) {
  1769. logger << LogPref::Flag(ERROR) << "Failed to send data to socket" << endl;
  1770. return -1;
  1771. }
  1772. bytes_recieved = SocketActive->Receive(MAX_PACKET, rcbuf);
  1773. if(rcbuf[1] == 0x3C)
  1774. {
  1775. logger << LogPref::Flag(INFO) << "Data confirmed" << endl;
  1776. }
  1777. else{
  1778. return -1;
  1779. }
  1780. return 0;
  1781. }
  1782. };
  1783. int main()
  1784. {
  1785. logger.enableConsoleOutput(true);
  1786. logger << "Open socket" << endl;
  1787. CPassiveSocket SocketPassive(CSimpleSocket::CSocketType::SocketTypeTcp);
  1788. if (!SocketPassive.Initialize())
  1789. {
  1790. logger << LogPref::Flag(ERROR) << "Socket initialization failed" << endl;
  1791. return -1;
  1792. }
  1793. if(!SocketPassive.Listen("127.0.0.1", 5003))
  1794. {
  1795. logger << LogPref::Flag(ERROR) << "Socket listening failed" << endl;
  1796. return -1;
  1797. }
  1798. logger << "Socket initialized!" << endl;
  1799. CActiveSocket* ClientSocket;
  1800. PicoLocalService* pico_service;
  1801. while(true)
  1802. {
  1803. logger << LogPref::Flag(INFO) << "Wait for connection..." << endl;
  1804. logger.closeLogger();
  1805. if ((ClientSocket = SocketPassive.Accept()) == nullptr)
  1806. {
  1807. logger.closeLogger();
  1808. logger.initializeLogger("picologs", "pico");
  1809. logger.enableConsoleOutput(true);
  1810. logger << LogPref::Flag(ERROR) << "Socket accept failed" << endl;
  1811. logger.closeLogger();
  1812. return -1;
  1813. }
  1814. logger.initializeLogger("picologs", "pico");
  1815. logger.enableConsoleOutput(true);
  1816. logger << LogPref::Flag(INFO) << "Client connected" << endl;
  1817. pico_service = new PicoLocalService(ClientSocket);
  1818. while(pico_service->get_request() != 0)
  1819. {
  1820. logger << LogPref::Flag(INFO) << "Request received" << endl;
  1821. }
  1822. logger << LogPref::Flag(INFO) << "Request processing finished" << endl;
  1823. delete pico_service;
  1824. pico_service = nullptr;
  1825. delete ClientSocket;
  1826. ClientSocket = nullptr;
  1827. }
  1828. return 0;
  1829. }