picofunctions.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #include "picofunctions.h"
  2. #define DEFAULT_FREQ 400000000
  3. uint32_t
  4. check(const string& param)
  5. {
  6. uint32_t result = stod(param);
  7. if (result > 0)
  8. {
  9. return uint32_t(result);
  10. }
  11. else
  12. return 1;
  13. }
  14. bool
  15. ShowParameterText(string param, pugi::xml_node node)
  16. {
  17. cout << "Showing parameter : " << param << std::endl;
  18. if (node == nullptr)
  19. {
  20. cout << "ERROR no such parameter : " << param << std::endl;
  21. return false;
  22. }
  23. if (strlen(node.text().get()) == 0)
  24. {
  25. cout << "ERROR no text for parameter : " << param << std::endl;
  26. return false;
  27. }
  28. cout << param << " get text: " << node.text().get() << std::endl;
  29. cout << param << " get as int : " << check(node.text().get()) << std::endl;
  30. return true;
  31. }
  32. string
  33. return_fun(uint32_t value)
  34. {
  35. string rv;
  36. switch (value)
  37. {
  38. // return values from set channel
  39. case PICO_OK: rv = "PICO_OK"; break;
  40. case PICO_USER_CALLBACK: rv = "PICO_USER_CALLBACK"; break;
  41. case PICO_INVALID_HANDLE: rv = "INVALID HANDLE"; break;
  42. case PICO_INVALID_CHANNEL: rv = "PICO_INVALID_CHANNEL"; break;
  43. case PICO_INVALID_VOLTAGE_RANGE: rv = "PICO_INVALID_VOLTAGE_RANGE"; break;
  44. case PICO_DRIVER_FUNCTION: rv = "PICO_DRIVER_FUNCTION"; break;
  45. case PICO_INVALID_COUPLING: rv = "PICO_INVALID_COUPLING"; break;
  46. case PICO_INVALID_ANALOGUE_OFFSET: rv = "PICO_INVALID_ANALOG_OFFSET"; break;
  47. case PICO_WARNING_PROBE_CHANNEL_OUT_OF_SYNC:
  48. rv = "PICO_WARNING_PROBE_CHANNEL_OUT_OF_SYNC";
  49. break;
  50. case PICO_PROBE_NOT_POWERED_WITH_DC_POWER_SUPPLY:
  51. rv = "PICO_PROBE_NOT_POWERED_WITH_DC_POWER_SUPPLY";
  52. break;
  53. case PICO_PROBE_POWER_DC_POWER_SUPPLY_REQUIRED:
  54. rv = "PICO_PROBE_POWER_DC_POWER_SUPPLY_REQUIRED";
  55. break;
  56. // return values from flash led
  57. case PICO_BUSY: rv = "PICO_BUSY"; break;
  58. case PICO_MEMORY: rv = "PICO_MEMORY"; break;
  59. case PICO_INTERNAL_ERROR: rv = "PICO_INTERNAL_ERROR"; break;
  60. case PICO_POWER_SUPPLY_UNDERVOLTAGE: rv = "PICO_POWER_SUPPLY_UNDERVOLTAGE"; break;
  61. case PICO_NOT_RESPONDING: rv = "PICO_NOT_RESPONDING"; break;
  62. case PICO_POWER_SUPPLY_CONNECTED: rv = "PICO_POWER_SUPPLY_CONNECTED"; break;
  63. case PICO_POWER_SUPPLY_NOT_CONNECTED: rv = "PICO_POWER_SUPPLY_NOT_CONNECTED"; break;
  64. case PICO_TIMEOUT: rv = "PICO_TIMEOUT"; break;
  65. case PICO_RESOURCE_ERROR: rv = "PICO_RESOURCE_ERROR"; break;
  66. case PICO_DEVICE_NOT_FUNCTIONING: rv = "PICO_DEVICE_NOT_FUNCTIONING"; break;
  67. // return values from open
  68. case PICO_OS_NOT_SUPPORTED: rv = "PICO_OS_NOT_SUPPORTED"; break;
  69. case PICO_OPEN_OPERATION_IN_PROGRESS: rv = "PICO_OPEN_OPERATION_IN_PROGRESS"; break;
  70. case PICO_EEPROM_CORRUPT: rv = "PICO_EEPROM_CORRUPT"; break;
  71. case PICO_KERNEL_DRIVER_TOO_OLD: rv = "PICO_KERNEL_DRIVER_TOO_OLD"; break;
  72. case PICO_FW_FAIL: rv = "PICO_FW_FAIL"; break;
  73. case PICO_MAX_UNITS_OPENED: rv = "PICO_MAX_UNITS_OPENED"; break;
  74. case PICO_NOT_FOUND: rv = "PICO_NOT_FOUND"; break;
  75. case PICO_USB3_0_DEVICE_NON_USB3_0_PORT: rv = "PICO_USB3_0_DEVICE_NON_USB3_0_PORT"; break;
  76. case PICO_MEMORY_FAIL: rv = "PICO_MEMORY_FAIL"; break;
  77. case PICO_HARDWARE_VERSION_NOT_SUPPORTED: rv = "PICO_HARDWARE_VERSION_NOT_SUPPORTED"; break;
  78. case PICO_NOT_USED: rv = "PICO_NOT_USED"; break;
  79. case PICO_FPGA_FAIL: rv = "PICO_FPGA_FAIL"; break;
  80. // return values from get timebase
  81. case PICO_TOO_MANY_SAMPLES: rv = "PICO_TOO_MANY_SAMPLES"; break;
  82. case PICO_INVALID_TIMEBASE: rv = "PICO_INVALID_TIMEBASE"; break;
  83. case PICO_INVALID_PARAMETER: rv = "PICO_INVALID_PARAMETER"; break;
  84. case PICO_SEGMENT_OUT_OF_RANGE: rv = "PICO_SEGMENT_OUT_OF_RANGE"; break;
  85. // return values from run block
  86. case PICO_INVALID_TRIGGER_CHANNEL: rv = "PICO_INVALID_TRIGGER_CHANNEL"; break;
  87. case PICO_INVALID_CONDITION_CHANNEL: rv = "PICO_INVALID_CONDITION_CHANNEL"; break;
  88. case PICO_CONFIG_FAIL: rv = "PICO_CONFIG_FAIL"; break;
  89. case PICO_TRIGGER_ERROR: rv = "PICO_TRIGGER_ERROR"; break;
  90. case PICO_NOT_USED_IN_THIS_CAPTURE_MODE: rv = "PICO_NOT_USED_IN_THIS_CAPTURE_MODE"; break;
  91. case PICO_TRIGGER_WITHIN_PRE_NOT_ALLOWED_WITH_DELAY:
  92. rv = "PICO_TRIGGER_WITHIN_PRE_NOT_ALLOWED_WITH_DELAY";
  93. break;
  94. case PICO_INVALID_NUMBER_CHANNELS_FOR_RESOLUTION:
  95. rv = "PICO_INVALID_NUMBER_CHANNELS_FOR_RESOLUTION";
  96. break;
  97. case PICO_NOT_ENOUGH_SEGMENTS: rv = "PICO_NOT_ENOUGH_SEGMENTS"; break;
  98. case PICO_NO_TRIGGER_ENABLED_FOR_TRIGGER_IN_PRE_TRIG:
  99. rv = "PICO_NO_TRIGGER_ENABLED_FOR_TRIGGER_IN_PRE_TRIG";
  100. break;
  101. // return values from set data buffer
  102. case PICO_RATIO_MODE_NOT_SUPPORTED: rv = "PICO_RATIO_MODE_NOT_SUPPORTED"; break;
  103. // return values from get values
  104. case PICO_NO_SAMPLES_AVAILABLE: rv = "PICO_NO_SAMPLES_AVAILABLE"; break;
  105. case PICO_DEVICE_SAMPLING: rv = "PICO_DEVICE_SAMPLING"; break;
  106. case PICO_NULL_PARAMETER: rv = "PICO_NULL_PARAMETER"; break;
  107. case PICO_DATA_NOT_AVAILABLE: rv = "PICO_DATA_NOT_AVAILABLE"; break;
  108. case PICO_STARTINDEX_INVALID: rv = "PICO_STARTINDEX_INVALID"; break;
  109. case PICO_INVALID_SAMPLERATIO: rv = "PICO_INVALID_SAMPLERATIO"; break;
  110. case PICO_INVALID_CALL: rv = "PICO_INVALID_CALL"; break;
  111. case PICO_BUFFERS_NOT_SET: rv = "PICO_BUFFERS_NOT_SET"; break;
  112. case PICO_ETS_NOT_RUNNING: rv = "PICO_ETS_NOT_RUNNING"; break;
  113. // return value from SetTriggerChannelConditions
  114. case PICO_TOO_MANY_CHANNELS_IN_USE: rv = "PICO_TOO_MANY_CHANNELS_IN_USE"; break;
  115. case PICO_INVALID_CONDITION_INFO: rv = "PICO_INVALID_CONDITION_INFO"; break;
  116. case PICO_DUPLICATE_CONDITION_SOURCE: rv = "PICO_DUPLICATE_CONDITION_SOURCE"; break;
  117. case PICO_CANCELLED: rv = "PICO_CANCELLED"; break;
  118. default: rv = "unknown return value = " + std::to_string(value);
  119. }
  120. return rv;
  121. }
  122. Parse_data
  123. parse_xml_function(const char* file_name)
  124. {
  125. pugi::xml_document doc;
  126. pugi::xml_parse_result result = doc.load_file(file_name);
  127. if (!result)
  128. {
  129. std::cerr << "Ошибка загрузки XML-файла: " << result.description() << std::endl;
  130. }
  131. pugi::xml_node root = doc.child("root");
  132. string points = root.child("points").child("value").text().as_string();
  133. int32_t num_of_channels = root.child("num_of_channels").child("value").text().as_int();
  134. string times = root.child("times").child("value").text().as_string();
  135. int32_t sample_freq = root.child("sample_freq").child("value").text().as_int();
  136. return std::make_tuple(points, num_of_channels, times, sample_freq);
  137. }
  138. std::vector<uint32_t>
  139. string_to_vector(string times)
  140. {
  141. times = times.substr(1, times.length() - 2);
  142. std::vector<uint32_t> vec_times;
  143. std::stringstream ss(times);
  144. string token;
  145. while (std::getline(ss, token, ','))
  146. {
  147. vec_times.push_back(std::stoi(token));
  148. }
  149. return vec_times;
  150. }
  151. std::vector<PS4000A_CHANNEL>
  152. create_channel(const int32_t& num_of_channels)
  153. {
  154. std::vector<PS4000A_CHANNEL> channels;
  155. for (int32_t i = 0; i < num_of_channels; i++)
  156. {
  157. switch (i)
  158. {
  159. case 0:
  160. {
  161. PS4000A_CHANNEL trigger_channel{PS4000A_CHANNEL_A};
  162. channels.push_back(trigger_channel);
  163. break;
  164. }
  165. case 1:
  166. {
  167. PS4000A_CHANNEL data2_channel{PS4000A_CHANNEL_B};
  168. channels.push_back(data2_channel);
  169. break;
  170. }
  171. case 2:
  172. {
  173. PS4000A_CHANNEL data3_channel{PS4000A_CHANNEL_C};
  174. channels.push_back(data3_channel);
  175. break;
  176. }
  177. case 3:
  178. {
  179. PS4000A_CHANNEL data4_channel{PS4000A_CHANNEL_D};
  180. channels.push_back(data4_channel);
  181. break;
  182. }
  183. case 4:
  184. {
  185. PS4000A_CHANNEL data5_channel{PS4000A_CHANNEL_E};
  186. channels.push_back(data5_channel);
  187. break;
  188. }
  189. case 5:
  190. {
  191. PS4000A_CHANNEL data6_channel{PS4000A_CHANNEL_F};
  192. channels.push_back(data6_channel);
  193. break;
  194. }
  195. case 6:
  196. {
  197. PS4000A_CHANNEL data7_channel{PS4000A_CHANNEL_G};
  198. channels.push_back(data7_channel);
  199. break;
  200. }
  201. case 7:
  202. {
  203. PS4000A_CHANNEL data8_channel{PS4000A_CHANNEL_H};
  204. channels.push_back(data8_channel);
  205. break;
  206. }
  207. }
  208. }
  209. return channels;
  210. }
  211. void writing_data(const std::vector<int16_t*>& vec_buffer, const int32_t bufferLth,
  212. const int32_t NUMBER_OF_CHANNELS)
  213. {
  214. // Получаем текущее время
  215. std::time_t now = std::time(nullptr);
  216. std::tm* now_tm = std::localtime(&now);
  217. #ifdef _WIN32
  218. CreateDirectoryA("output", NULL);
  219. #endif // _WIN32
  220. // Формируем имя файла с текущей датой и временем
  221. std::stringstream filename;
  222. #ifdef _WIN32
  223. filename << "output\\";
  224. #endif // _WIN32
  225. filename << "data_"
  226. << std::put_time(now_tm, "%Y-%m-%d_%H-%M-%S")
  227. << ".csv";
  228. // Открываем новый файл для записи (не для дозаписи)
  229. std::ofstream testfile(filename.str());
  230. if (testfile.is_open())
  231. {
  232. for (int i = 0; i < bufferLth; ++i)
  233. {
  234. for (int j = 0; j < NUMBER_OF_CHANNELS; ++j)
  235. {
  236. testfile << vec_buffer[j][i] << ","; // Вывод значений
  237. }
  238. testfile << "\n";
  239. }
  240. testfile.close();
  241. }
  242. else
  243. {
  244. // Обработка ошибки открытия файла, если необходимо
  245. std::cerr << "Unable to open file to write data" ;
  246. }
  247. }
  248. void writing_data_fixed_name(const std::vector<int16_t*>& vec_buffer, const int32_t bufferLth,
  249. const int32_t NUMBER_OF_CHANNELS)
  250. {
  251. // Получаем текущее время
  252. std::time_t now = std::time(nullptr);
  253. std::tm* now_tm = std::localtime(&now);
  254. #ifdef _WIN32
  255. CreateDirectoryA("output", NULL);
  256. #endif // _WIN32
  257. // Формируем имя файла с текущей датой и временем
  258. std::stringstream filename;
  259. #ifdef _WIN32
  260. filename << "output\\";
  261. #endif // _WIN32
  262. filename << "data_"
  263. << "fixed"
  264. << ".csv";
  265. // Открываем новый файл для записи (не для дозаписи)
  266. std::ofstream testfile(filename.str());
  267. if (testfile.is_open())
  268. {
  269. for (int i = 0; i < bufferLth; ++i)
  270. {
  271. for (int j = 0; j < NUMBER_OF_CHANNELS; ++j)
  272. {
  273. testfile << vec_buffer[j][i] << ","; // Вывод значений
  274. }
  275. testfile << "\n";
  276. }
  277. testfile.close();
  278. }
  279. else
  280. {
  281. // Обработка ошибки открытия файла, если необходимо
  282. std::cerr << "Unable to open file to write data" ;
  283. }
  284. }
  285. void
  286. free_buffers(const std::vector<int16_t*>& vec_buffer)
  287. {
  288. for (const auto& it : vec_buffer)
  289. {
  290. delete[] it;
  291. }
  292. }
  293. uint32_t
  294. timebase_choice(const int32_t SAMPLE_FREQ)
  295. {
  296. return DEFAULT_FREQ / SAMPLE_FREQ - 1;
  297. }