{"id":380900,"date":"2024-06-29T03:21:42","date_gmt":"2024-06-29T03:21:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=380900"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=380900","title":{"rendered":"<span>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043f\u043e\u0434 Linux<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/b3e\/54e\/fec\/b3e54efecf61af42c436614d78e2c43a.jpg\" width=\"645\" height=\"653\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3e\/54e\/fec\/b3e54efecf61af42c436614d78e2c43a.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0413\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0441\u0435\u0440\u0438\u0439\u043d\u0430\u044f, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Echologger MRS-900. \u041e\u0434\u043d\u043e\u043b\u0443\u0447\u0435\u0432\u0430\u044f, \u043b\u0443\u0447 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043a\u0440\u0443\u0433\u0443 \u0438\u043b\u0438 \u0432 \u0441\u0435\u043a\u0442\u043e\u0440\u0435. \u0421\u0432\u044f\u0437\u044c \u0441 \u041f\u041a \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 RS-232\/RS-485. \u0428\u0442\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434 Windows. \u041e\u0442 \u043c\u0435\u043d\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0434 Linux.<\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438. \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u044d\u0445\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043d\u0430 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ( \u0432\u044b\u0431\u043e\u0440 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430, \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0438 \u0442.\u043f.). \u041e\u0442 \u043d\u0430\u0441 \u0445\u043e\u0442\u0435\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/c63\/5a1\/8e4\/c635a18e48fe9d9a4ade189fbc8fe457.jpg\" width=\"832\" height=\"836\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c63\/5a1\/8e4\/c635a18e48fe9d9a4ade189fbc8fe457.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043e \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0411\u044b\u043b\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 Linux \u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 \u042d\u0412\u041c, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0441 3D \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u043c. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f Debian 9\/10 \u0432\u0435\u0440\u0441\u0438\u0438, \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Ubuntu \u0438 \u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u042d\u0412\u041c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0441\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0431\u0443\u0434\u0435\u0442. \u041d\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0438 \u043d\u043e\u0432\u043e\u0439, \u0447\u0442\u043e-\u0442\u043e \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u043c\u043d\u043e\u0433\u043e\u043b\u0443\u0447\u0435\u0432\u043e\u0433\u043e, \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043e\u0431\u0437\u043e\u0440\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0434 Windows, \u043d\u0430 Visual C++. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/126\/8b2\/d96\/1268b2d96897db62b17123f7c4169804.jpg\" width=\"1248\" height=\"992\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/126\/8b2\/d96\/1268b2d96897db62b17123f7c4169804.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u0442\u0435\u043c\u0443 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u043a\u0438, \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0438\u0435 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u0423 \u043c\u0435\u043d\u044f \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0438\u0445 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u041e\u0421 Windows. \u0421\u0432\u043e\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0443 \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0431\u044b\u043b\u0438. \u0412\u0438\u0434\u0438\u043c\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441 \u0438 \u043d\u0430\u043d\u044f\u043b\u0438 \u043a\u0430\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u041f\u041e \u043f\u043e\u0434 Linux, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u043f\u044b\u0442 \u0432 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u0430\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u044b\u043b\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0449\u0435 &#8212; \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u043b\u0441\u044f \u0432 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0440\u043e\u0434\u0435 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0412\u0410\u0420\u0423, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0438 \u0434\u043d\u0430, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u0441\u044f\u043a\u043e\u0432 \u0440\u044b\u0431\u044b \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 &#8212; \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u043c\u0435\u0440\u0442\u0432\u043e\u0439 \u0437\u043e\u043d\u044b&#187;, \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435, \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u0432\u0441\u0451 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043e\u0442\u0441\u0447\u0435\u0442\u0430\u043c\u0438, \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>C \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 &#171;\u043e\u043a\u043d\u043e&#187; \u043e\u0431\u0449\u0435\u0439 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u043a\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e, \u0445\u043e\u0447\u0443 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e, \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043b\u0443\u0447 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 2 \u0433\u0440\u0430\u0434\u0443\u0441\u0430. \u041b\u0443\u0447 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u0440\u0443\u0433\u0443 \u0438\u043b\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435. \u0423\u0433\u043b\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u0445\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u044b. \u041f\u0435\u0440\u0438\u043e\u0434 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a ( \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u0442.\u0434.). \u041f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f (\u0412\u0410\u0420\u0423), \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0442\u043e\u0447\u0435\u043a, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e \u0443\u0433\u043b\u0443, \u0437\u0430\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0443\u0436\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 \u043d\u0430\u0434\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 &#171;\u043c\u0435\u0440\u0442\u0432\u043e\u0439 \u0437\u043e\u043d\u044b&#187; &#8212; \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e &#171;\u043c\u0443\u0441\u043e\u0440\u0430&#187; \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u0442\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 700 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432, \u043f\u0440\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0435 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 10\u043c\u0441. \u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0437\u0430\u043f\u0438\u0441\u0438, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0443\u0447\u0448\u0435 Python \u0438 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e C\/C++.<\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0443\u0433\u043b\u0443. \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u044b \u043f\u043e \u0443\u0433\u043b\u0443 \u0438 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u043c &#8212; \u043e\u043d \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u0443 \u0438 \u0435\u0451 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a x, y. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0441\u0447\u0451\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/ maximum amplitude samples in one beam #define MAX_SAMPLES_TO_SHOW 1024  \/\/ beams per 360 degrees, maximum angles with step 0.1125 corresponf to 3600 beams, 720 beams correpond to 0.5 degrees #define BEAMS 1440  \/\/ limit of reserved real screen pixels for each sample #define MAX_PIXELS_PER_SAMPLE 32  \/\/ arrays of pixels coordinates for each sonar ADC sample  int16_t pixel_table_x[BEAMS][MAX_SAMPLES_TO_SHOW][MAX_PIXELS_PER_SAMPLE],\\     pixel_table_y[BEAMS][MAX_SAMPLES_TO_SHOW][MAX_PIXELS_PER_SAMPLE],\\     pixel_table_n[BEAMS][MAX_SAMPLES_TO_SHOW];  \/\/ samples number equal to diameter int samples_per_beam; \/\/ have to be lower than MAX_SAMPLES_TO_SHOW   \/\/ calculate angle between vector (x,y) and X axis, the result in the sonar coordinates float angle(float x, float y) { float alpha, pi=3.1415926, tpi = 2*pi; if (abs(x)&lt;0.0001) {  if (y>0) alpha=pi\/2.0; else alpha=3.0*pi\/2.0; }     else if(abs(y)&lt;0.0001) {         if (x>0) alpha=0;         else alpha=pi;     } else { alpha = atan(y\/x); if( (x&lt;0)&amp;&amp;(y>0) ) alpha += pi; if( (x&lt;0)&amp;&amp;(y&lt;0) ) alpha += pi; if( (x>0)&amp;&amp;(y&lt;0) ) alpha += tpi; }     alpha = 3*pi\/2.0-alpha;          if ( alpha&lt;0 ) alpha+=tpi;     if ( alpha>tpi) alpha-=tpi;      return alpha; }   \/\/ calculate table of the pixels void pixel_table_ini( int diagram_diameter_in_pixels ) { float r, alpha; int beam, i; \/\/ indexes in the table int j; float xc,yc,pi=3.1415926; float dyy=0;      \/\/ reset the tables memset( pixel_table_n, 0, sizeof( pixel_table_n ) );  memset( pixel_table_x, 0, sizeof( pixel_table_x ) );  memset( pixel_table_y, 0, sizeof( pixel_table_y ) );           \/\/ check for MAX_SAMPLES_TO_SHOW     if (diagram_diameter_in_pixels > (MAX_SAMPLES_TO_SHOW*2))         diagram_diameter_in_pixels = MAX_SAMPLES_TO_SHOW*2;          samples_per_beam = diagram_diameter_in_pixels\/2;     float Radius = diagram_diameter_in_pixels \/ 2.0;      \/\/ check all pixels inside diameter*diameter bar to fill pixels arrays for(float x=0; x &lt; diagram_diameter_in_pixels; x++ ) {          for(float y=0; y &lt; diagram_diameter_in_pixels; y++ ) { xc = x - Radius; yc = y - Radius; r = sqrt( xc*xc + yc*yc ); \/\/ distance to center alpha = angle(xc,yc);  beam = alpha\/(3.1415926*2.0) * (float)BEAMS; i = (r + 0.5)*2.0; \/\/ index of the sample inside the beam i \/= 2; if ( (i&lt;Radius)&amp;&amp;(beam>=0)&amp;&amp;(beam&lt;=BEAMS) ) { j = pixel_table_n[beam][i]; \/\/ index of the pixel in the table if( (j&lt;MAX_PIXELS_PER_SAMPLE) ) { pixel_table_x[beam][i][j] = x; pixel_table_y[beam][i][j] = y; ++pixel_table_n[beam][i]; } } }     } } <\/code><\/pre>\n<p>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u044b\u0431\u0440\u0430\u043b SDL2. \u0411\u044b\u043b \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434 Windows, \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u041f\u041e \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 Visual C++. \u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/f41\/c13\/b4c\/f41c13b4cb984a6af2591c47b2cc42d5.jpg\" width=\"1239\" height=\"703\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f41\/c13\/b4c\/f41c13b4cb984a6af2591c47b2cc42d5.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0437\u0434\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e c CodeBlocks \u0438 MinGW. \u0417\u0432\u0443\u043a \u0431\u044b\u043b \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 SDL2 \u0432 Debian 10 \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-gfx-dev<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 c \u0438\u043c\u0435\u043d\u0435\u043c <a href=\"http:\/\/libsonarwindow.so\" rel=\"noopener noreferrer nofollow\">libsonarwindow.so<\/a> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">g++ -std=c++0x -shared -fPIC -pedantic main.cpp -o libsonarwindow.so `sdl2-config --cflags --libs` -lSDL2_image -lSDL2_ttf -lpthread<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"bash\">g++ -std=c++0x -pedantic main.cpp -o main `sdl2-config --cflags --libs` -lSDL2_image -lSDL2_ttf -lpthread<\/code><\/pre>\n<p>&#171;\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435&#187; \u043e\u043a\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0441\u043e \u0441\u043c\u0435\u043d\u043e\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#171;\u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u043e\u0433\u043e&#187; \u043e\u043a\u043d\u0430 \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b SDL2. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 SDL2 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0430\u0441\u044c. \u041d\u0438\u0436\u0435 \u0447\u0430\u0441\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443:<\/p>\n<pre><code class=\"cpp\">\/\/----------------------- \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043b\u0443\u0447 ( \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 ) -----------------------------             if (isDataBufferReady || usefile) {      if (usefile) {         \/\/ \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430         GetUnpackedDesc( saved_beam_i, dataHeader);      }     else {         dataHeader = dataHeaderStream;                             pUnpackedSamples = (uint32_t*)(comBuffer);     }          \/\/ \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430     AddDeadZone( deadzone_value ); \/\/ default 5     AddGain( gain_value, dataHeader.samples); \/\/ default 8     AddBrightness( brightness_value, dataHeader.samples); \/\/ default 400     AddContrast( contrast_value, dataHeader.samples); \/\/ default 2          isDataBufferReady = false;          int samples_n = dataHeader.samples; \/\/ number of samples in the burst      \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c     current_range = 10.0; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c 1392, \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 1376     for (int i=0;i&lt;15;i++) {         if ( samples_set[i] == samples_n ) {             current_range = range_set[i];             break;         }     }      \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u0433\u043b\u044b \u0438 \u043d\u043e\u043c\u0435\u0440 \u043b\u0443\u0447\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435     tetha = dataHeader.angle*0.0125\/360.0;     ray = tetha*BEAMS;     beam = ray;          \/\/ \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 samplesnum >= samples \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     if ( samples_per_beam &lt;= samples_n ) { \/\/ too much samples                  float kpN = (float)samples_n \/ (float)samples_per_beam; \/\/ scale ratio             for(int i=0; i&lt;samples_per_beam; i++) {                  int start = kpN*(float)i - 0.5;                 if (start&lt;0) start=0;                 end   = kpN*(float)(i+1) + 0.5;                 if( end >= samples_n ) end = samples_n - 1;                  for( int j=start; j&lt;=end; j++) {                     a = pUnpackedSamples[j];                     if(j==start) Amax=a;                     else if (a>Amax) Amax=a;                 }                                  samples_to_show[i] = Amax;             }     }     else { \/\/ \u0435\u0441\u043b\u0438 samplesnum &lt; samples \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435         float kpN = (float)samples_n \/ (float)samples_per_beam;         int j; \/\/ sample inside beam index         for(int i=0; i&lt;samples_per_beam; i++) {             j = (kpN*(float)i);             samples_to_show[i] = pUnpackedSamples[j];         }     }           \/\/ \u043f\u043e\u0441\u043b\u0435 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c samples_drawn[] \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438,     \/\/ \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 samples_to_show[] \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435     for(int i=0; i &lt; samples_per_beam; i++ ) {         sample = samples_to_show[i];          if (sample>4096) sample=4095;              for ( int j = 0; j &lt; pixel_table_n[beam][i]; j++ ) {             x = pixel_table_x[beam][i][j];             y = pixel_table_y[beam][i][j];             samples_drawn[x+y*MAX_SAMPLES_TO_SHOW] = sample;         }     }  }  \/\/ \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440 \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043b\u0443\u0447\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 if (pointer_show)     FillRedCursor(cursor, diameter, tetha);             is_beam_ready = false;  \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u0448\u043a\u0430\u043b \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 pixels[] int samples_index = 0; int pixels_index = 0; for(y=0;y&lt;diameter;y++) {     for(x=0;x&lt;diameter;x++) {         sample = samples_drawn[x+samples_index];         if (sample&lt;4096) {                          if (show_in_rainbow_palette) pixels[pixels_index] = palette_rainbow[ sample ];             else pixels[pixels_index] = palette_brown[ sample ];         }         else pixels[pixels_index]=background_color;                  if (cursor[pixels_index])             pixels[pixels_index] = cursor[pixels_index];         else              if (grid_show)                  if (net[pixels_index]) pixels[pixels_index] = net[pixels_index];                                      ++pixels_index;     }     samples_index+=MAX_SAMPLES_TO_SHOW; }   \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c pixels[] \u0432 SDL2 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 SDL_UpdateTexture(texture, NULL, pixels, diameter * sizeof(uint32_t));  \/\/ ----        \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435,         ---- \/\/ ---- \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043e\u0442 \u0441\u043e\u043d\u0430\u0440\u0430 ----  \/\/--- \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c dest.w = diameter; dest.h = diameter;  \/\/ \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 dest.x = (window_width-diameter)\/2;   dest.y = (window_height-diameter)\/2; if (dest.y>16) dest.y-=16;  \/\/ \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b src.x = source_rect.x; src.y = source_rect.y; src.w = source_rect.w; src.h = source_rect.h;   if ( window_height &lt; window_width ) { \/\/ \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u0430\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u043a\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     float window_ratio = (float)window_width\/((float)window_height-10);     \/\/ .h \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c .w:     dest.x = dest.x-(window_ratio-1.0)*(float)dest.w\/2;     src.x  = src.x-(window_ratio-1.0)*(float)src.w\/2;      dest.w = dest.w * window_ratio;     src.w  = src.w  * window_ratio; } else { \/\/ \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u043d\u0430\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u043a\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     float window_ratio = ((float)window_height-10)\/((float)window_width);      dest.y = dest.y-(window_ratio-1.0)*(float)dest.h\/2;     src.y  = src.y-(window_ratio-1.0)*(float)src.h\/2;      dest.h = dest.h * window_ratio;     src.h  = src.h  * window_ratio; }  if ((src.w+src.x)>diameter) {     float k = (float)(diameter - src.x)\/(float)src.w;     src.w = diameter - src.x;     dest.w *= k;     dest.x = 0; }  if (src.x&lt;0) {     float k_short = (float)(-src.x)\/(float)src.w;     float k = (float)(src.w+src.x)\/(float)src.w;     src.w = src.w+src.x; \/\/ cut left side     src.x = 0;     dest.x = (float)dest.w * k_short;     dest.w *= k; }  if ((src.h+src.y)>diameter) {     float k = (float)(diameter - src.y)\/(float)src.h;     src.h = diameter - src.y;     dest.h *= k;     dest.y = 0; }  if (src.y&lt;0) {     float k_short = (float)(-src.y)\/(float)src.h;     float k = (float)(src.h+src.y)\/(float)src.h;     src.h = src.h+src.y; \/\/ cut left side     src.y = 0;     dest.y = (float)dest.h * k_short;     dest.h *= k; }  \/\/ ---- \u043a\u043e\u043d\u0435\u0446 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 ----  \/\/ \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043e\u043a\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u044b SDL_RenderCopy(renderer, texture, &amp;src, &amp;dest); <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u0445\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0431\u0435\u0437 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/48c\/e4c\/4a8\/48ce4c4a8eebabceaf009af6700a8e70.jpg\" width=\"987\" height=\"954\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/48c\/e4c\/4a8\/48ce4c4a8eebabceaf009af6700a8e70.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430 \u0436\u0435 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430, \u043d\u043e \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u0447\u0430\u0441\u0442\u043a\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/264\/424\/9e3\/2644249e34e08a028bb598cbc89b0d3b.jpg\" width=\"975\" height=\"955\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/264\/424\/9e3\/2644249e34e08a028bb598cbc89b0d3b.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/307\/c0f\/842\/307c0f8427229dbb9416437caadbdcb6.jpg\" width=\"937\" height=\"897\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/307\/c0f\/842\/307c0f8427229dbb9416437caadbdcb6.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0430\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 Qt, \u0444\u0430\u0439\u043b main.cpp :<\/p>\n<pre><code class=\"cpp\">#include \"mainwindow.h\" #include \"sonarwindow.h\" #include &lt;QApplication> #include &lt;QWidget>  \/\/ to compile: \/\/ Build->Rebuild all  \/\/ to launch from command line copy gost_b.ttf, hrs900_20150526_063659.bin \/\/ to directory ~\/build-qt_example-Desktop-Debug  , then:  \/\/ cd ~\/build-qt_example-Desktop-Debug \/\/ export LD_LIBRARY_PATH=\/home\/&lt;user>\/qt_example:$LD_LIBRARY_PATH \/\/ .\/qt_example  int main(int argc, char *argv[]) {     QApplication a(argc, argv);     MainWindow w;      \/\/      File_Read(\"hrs900_20150526_063659.bin\");     File_Play(1); \/\/ 1 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, 2,3,4 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435      View_setting(8, 5, 1, 400, 0, true, true, true, true, true);     Create_Window(100,120,820,820);      \/\/Change_Window(200,200,620,720);       w.move(95,40);     w.show();     w.raise();     w.activateWindow();      return a.exec(); } <\/code><\/pre>\n<p>\u0422\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 Qt \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/218\/903\/b7d\/218903b7db19845ff715834e8da5d4ca.jpg\" width=\"1000\" height=\"575\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/218\/903\/b7d\/218903b7db19845ff715834e8da5d4ca.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 sonarwindow.h :<\/p>\n<pre><code class=\"cpp\">void View_setting(int gain, int deadzone, int contrast, int brightness, bool pallete, bool grid, bool autocontrast, bool pointer, bool fitwindow, bool repeatplayback);  \/\/ \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \/\/ bool grid_show = true, show_in_rainbow_palette = false, pointer = true, repeat_playback = true; \/\/ int contrast_value = 1, deadzone_value = 5, gain_value = 8, brightness_value = 400;  int Create_Window( int x_pos, int y_pos, int width, int height ); int Change_Window( int x_pos, int y_pos, int width, int height ); int FillRawComBufferArray(unsigned char* inArray, int inArraySize); int File_Read(const char* afilename); int File_Play(int speed); void File_Hold(); void File_Stop();<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 GUI \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 FLTK:<\/p>\n<pre><code class=\"cpp\">#include &lt;stdio.h> #include &lt;stdlib.h> #include &lt;stdio.h> #include &lt;math.h> #include &lt;unistd.h> #include &lt;time.h> #include &lt;sys\/time.h>  #include \"sonarwindow.h\"  #include &lt;pthread.h>  #include &lt;string.h> #include &lt;fcntl.h> \/\/ Contains file controls like O_RDWR #include &lt;errno.h> \/\/ Error integer and strerror() function #include &lt;termios.h> \/\/ Contains POSIX terminal control definitions #include &lt;unistd.h> \/\/ write(), read(), close()  #include &lt;FL\/Fl.H> #include &lt;FL\/Fl_Window.H> #include &lt;FL\/Fl_Box.H> #include &lt;FL\/Fl_Button.H> #include &lt;FL\/Fl_Menu_Bar.H>  \/\/ To install FLTK: \/\/ sudo apt install fltk1.3-dev  \/\/ To compile and run: \/\/ g++ -L\/home\/tolik\/sonar_FLTK -o test main.cpp -lsonarwindow -L\/usr\/local\/lib -lfltk -lXext -lXinerama -lXft -lX11 -lXi -lm -lpthread \/\/ export LD_LIBRARY_PATH=\/home\/user\/sonar_FLTK:$LD_LIBRARY_PATH \/\/ .\/test  \/\/ FLTK buttons callbacks void start_button_callback(Fl_Widget *w, void *data) {     File_Play(1);     printf(\" start \\n\"); }  void stop_button_callback(Fl_Widget *w, void *data) {     File_Stop();     printf(\" stop \\n\"); }  bool stop_serial_reading=false; bool usefile = false; const char* USBname=NULL; int USB; \/\/USB port id char buf = '\\0'; struct termios tty; struct termios tty_old;  #define DEMOCOMBUFSIZE 128 unsigned char DemoComBuffer[DEMOCOMBUFSIZE]; int DemoComBufferLast=0;  int UpdateRawComBuffer() { while (DemoComBufferLast&lt;sizeof(DemoComBuffer)) { int testReading=read( USB, &amp;DemoComBuffer[DemoComBufferLast], 1); if (testReading==-1) { break; \/\/COM is empty } DemoComBufferLast++; while((DemoComBufferLast&lt;sizeof(DemoComBuffer)) &amp;&amp; (testReading!=-1)) { testReading=read( USB, &amp;DemoComBuffer[DemoComBufferLast++], 1); \/\/if (testReading!=-1) TotalComRead++; \/\/printf(\"+%c\", DemoComBuffer[DemoComBufferLast-1]); } if (testReading==-1) DemoComBufferLast--; } int UsedElements=FillRawComBufferArray(&amp;DemoComBuffer[0], DemoComBufferLast); memmove((unsigned char*)&amp;DemoComBuffer[0], ((unsigned char*)&amp;DemoComBuffer[0])+UsedElements, sizeof(DemoComBuffer)-UsedElements); DemoComBufferLast-=UsedElements;     return 0; }       void* thread_serial_port_parsing_auto2( void* args ) {           printf(\"thread_serial_port_parsing_auto2 - started\\n\");     while(!stop_serial_reading) {                            UpdateRawComBuffer();     }     return &amp;stop_serial_reading; }     int main( int argc, char **argv ) {      usefile = true;          if( !usefile) { \/\/ just to communicate via serial port                  \/\/ select COM or file         USBname=\"\/dev\/ttyS1\";         printf(\"%s\\n\", USBname);                 USB = open( USBname, O_RDWR| O_NOCTTY | O_NONBLOCK);         if (USB &lt; 0) printf(\"Error %i from open: %s\\n\", errno, strerror(errno));         memset (&amp;tty, 0, sizeof tty);                  if ( tcgetattr ( USB, &amp;tty ) != 0 )         {             \/\/std::cout &lt;&lt; \"Error \" &lt;&lt; errno &lt;&lt; \" from tcgetattr: \" &lt;&lt; strerror(errno) &lt;&lt; std::endl;             printf(\"Error\");         }                  tty_old = tty;         \/* Set Baud Rate *\/         \/\/cfsetospeed (&amp;tty, (speed_t)B38400);         \/\/cfsetispeed (&amp;tty, (speed_t)B38400);                  cfsetospeed (&amp;tty, (speed_t)B115200);         cfsetispeed (&amp;tty, (speed_t)B115200);         \/* Setting other Port Stuff *\/         tty.c_cflag     &amp;=  ~PARENB;            \/\/ Make 8n1         tty.c_cflag     &amp;=  ~CSTOPB;         tty.c_cflag     &amp;=  ~CSIZE;         tty.c_cflag     |=  CS8;         tty.c_cflag     &amp;=  ~CRTSCTS;           \/\/ no flow control         tty.c_cc[VMIN]   =  0;                  \/\/ read doesn't block         tty.c_cc[VTIME]  =  0;                  \/\/          tty.c_cflag     |=  CREAD | CLOCAL;     \/\/ turn on READ &amp; ignore ctrl lines         \/* Make raw *\/         cfmakeraw(&amp;tty);         \/* Flush Port, then applies attributes *\/         tcflush( USB, TCIFLUSH );         if ( tcsetattr ( USB, TCSANOW, &amp;tty ) != 0)         {             \/\/std::cout &lt;&lt; \"Error \" &lt;&lt; errno &lt;&lt; \" from tcsetattr\" &lt;&lt; std::endl;             printf(\"Error 1\");         }         int n = 0,         spot = 0;         n = read( USB, &amp;buf, 1 );         if (n &lt; 0) {             printf(\"Error 2\\n\");\/\/std::cout &lt;&lt; \"Error reading: \" &lt;&lt; strerror(errno) &lt;&lt; std::endl;         }                  \/\/ launch COM serial reading thread (should be external)         pthread_t id;             if (!usefile) {                             int ret;                     ret = pthread_create(&amp;id, NULL, &amp;thread_serial_port_parsing_auto2, NULL);             if(ret==0) printf(\"main(): thread_serial_port_parsing_auto2() thread created successfully.\\n\");             else{                 printf(\"main(): thread_serial_port_parsing_auto2() thread not created.\\n\");                 return 0; \/*return from main*\/             }                 }      }          Fl_Menu_Item menuitems[] = {       { \"&amp;File\",              0, 0, 0, FL_SUBMENU },         { \"E&amp;xit\", 0, (Fl_Callback *)stop_button_callback, 0 },         { 0 },       { \"&amp;Settings\", 0, 0, 0, FL_SUBMENU },         { \"&amp;Language\",       0, (Fl_Callback *)stop_button_callback, 0, FL_MENU_DIVIDER },         { \"&amp;Sonar settings\",        FL_COMMAND + 's', (Fl_Callback *)stop_button_callback },         { \"&amp;View settings\",       0, (Fl_Callback *)stop_button_callback },         { \"&amp;Working folder\",      0, (Fl_Callback *)stop_button_callback },         { \"&amp;Autoscreenshot\",     0, (Fl_Callback *)stop_button_callback },         { 0 },       { \"&amp;Help\", 0, 0, 0, FL_SUBMENU },         { \"&amp;About...\",       0, (Fl_Callback *)stop_button_callback },         { 0 },       { 0 }     };               Fl_Window *window = new Fl_Window(80,10,850,800,\"Control\");     Fl_Button *button_start = new Fl_Button(710, 130, 100, 25, \"Start\");     Fl_Button *button_stop = new Fl_Button(710, 170, 100, 25, \"Stop\");      Fl_Menu_Bar *m = new Fl_Menu_Bar(0, 0, 680, 30);     m->copy(menuitems);      int xyz_data;     button_start->callback(start_button_callback, &amp;xyz_data);     button_stop->callback(stop_button_callback, &amp;xyz_data);        File_Read(\"hrs900_20150526_063659.bin\");     File_Play(1);     View_setting(8, 5, 1, 400, true, true, true, true, true, true);          Create_Window(100,100,650,800);        sleep(1);          \/\/ Change_Window(200,200,620,720);     window->end();     window->show(argc, argv);        return Fl::run(); } <\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 FLTK \u0434\u043b\u044f Debian\/Ubuntu:<\/p>\n<pre><code class=\"bash\">sudo apt install fltk1.3-dev<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439:<\/p>\n<pre><code class=\"bash\">g++ -L\/home\/tolik\/sonar_FLTK -o test main.cpp -lsonarwindow -L\/usr\/local\/lib -lfltk -lXext -lXinerama -lXft -lX11 -lXi -lm -lpthread  export LD_LIBRARY_PATH=\/home\/user\/sonar_FLTK:$LD_LIBRARY_PATH <\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/632307f99fd9c5cec24b498b\" data-style=\"\" id=\"632307f99fd9c5cec24b498b\" width=\"\"><\/div>\n<p>\u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0434 Windows. \u0412 \u0447\u0430\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u0448 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u0430 \u0432 5 \u043a\u043e\u0440\u043e\u0447\u0435, \u0432\u0441\u0451 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e SDL2.<\/p>\n<p>\u041d\u0430\u043c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434 Raspberry Pi. Rasbian \u0445\u043e\u0442\u044c \u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 Debian, \u043d\u043e \u0434\u0440\u0443\u0433\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c SDL2 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043e\u0442\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0420\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043d\u0430 \u043c\u043e\u0435\u043c \u0441\u0442\u0430\u0440\u043e\u043c i3-2100, \u0441\u043e \u0441\u0442\u0430\u0440\u0435\u043d\u044c\u043a\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 Radeon 512\u041c\u0431. \u041d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u0431\u0435\u0437 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a, \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c. \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u044d\u0442\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441 Ubuntu.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/688440\/\"> https:\/\/habr.com\/ru\/articles\/688440\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0413\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0441\u0435\u0440\u0438\u0439\u043d\u0430\u044f, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Echologger MRS-900. \u041e\u0434\u043d\u043e\u043b\u0443\u0447\u0435\u0432\u0430\u044f, \u043b\u0443\u0447 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043a\u0440\u0443\u0433\u0443 \u0438\u043b\u0438 \u0432 \u0441\u0435\u043a\u0442\u043e\u0440\u0435. \u0421\u0432\u044f\u0437\u044c \u0441 \u041f\u041a \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 RS-232\/RS-485. \u0428\u0442\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434 Windows. \u041e\u0442 \u043c\u0435\u043d\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0434 Linux.<\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438. \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u044d\u0445\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043d\u0430 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ( \u0432\u044b\u0431\u043e\u0440 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0434\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430, \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0438 \u0442.\u043f.). \u041e\u0442 \u043d\u0430\u0441 \u0445\u043e\u0442\u0435\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043e \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0411\u044b\u043b\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 Linux \u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 \u042d\u0412\u041c, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0441 3D \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u043c. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f Debian 9\/10 \u0432\u0435\u0440\u0441\u0438\u0438, \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Ubuntu \u0438 \u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u042d\u0412\u041c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0441\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0431\u0443\u0434\u0435\u0442. \u041d\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0438 \u043d\u043e\u0432\u043e\u0439, \u0447\u0442\u043e-\u0442\u043e \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u043c\u043d\u043e\u0433\u043e\u043b\u0443\u0447\u0435\u0432\u043e\u0433\u043e, \u0441\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043e\u0431\u0437\u043e\u0440\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0434 Windows, \u043d\u0430 Visual C++. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u0442\u0435\u043c\u0443 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u043a\u0438, \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0438\u0435 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u0423 \u043c\u0435\u043d\u044f \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0438\u0445 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u041e\u0421 Windows. \u0421\u0432\u043e\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0443 \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0431\u044b\u043b\u0438. \u0412\u0438\u0434\u0438\u043c\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441 \u0438 \u043d\u0430\u043d\u044f\u043b\u0438 \u043a\u0430\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u041f\u041e \u043f\u043e\u0434 Linux, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u043f\u044b\u0442 \u0432 \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u0430\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u044b\u043b\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0449\u0435 &#8212; \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u043b\u0441\u044f \u0432 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0440\u043e\u0434\u0435 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0412\u0410\u0420\u0423, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0438 \u0434\u043d\u0430, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u0441\u044f\u043a\u043e\u0432 \u0440\u044b\u0431\u044b \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 &#8212; \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u043c\u0435\u0440\u0442\u0432\u043e\u0439 \u0437\u043e\u043d\u044b&#187;, \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435, \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u0432\u0441\u0451 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043e\u0442\u0441\u0447\u0435\u0442\u0430\u043c\u0438, \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>C \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 &#171;\u043e\u043a\u043d\u043e&#187; \u043e\u0431\u0449\u0435\u0439 \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u043a\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e, \u0445\u043e\u0447\u0443 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e, \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043b\u0443\u0447 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 2 \u0433\u0440\u0430\u0434\u0443\u0441\u0430. \u041b\u0443\u0447 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u0440\u0443\u0433\u0443 \u0438\u043b\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435. \u0423\u0433\u043b\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u0445\u043e\u0441\u0438\u0433\u043d\u0430\u043b\u044b. \u041f\u0435\u0440\u0438\u043e\u0434 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a ( \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u0442.\u0434.). \u041f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f (\u0412\u0410\u0420\u0423), \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0442\u043e\u0447\u0435\u043a, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e \u0443\u0433\u043b\u0443, \u0437\u0430\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0443\u0436\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 \u043d\u0430\u0434\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 &#171;\u043c\u0435\u0440\u0442\u0432\u043e\u0439 \u0437\u043e\u043d\u044b&#187; &#8212; \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e &#171;\u043c\u0443\u0441\u043e\u0440\u0430&#187; \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u0442\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 700 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432, \u043f\u0440\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0435 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 10\u043c\u0441. \u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0437\u0430\u043f\u0438\u0441\u0438, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0443\u0447\u0448\u0435 Python \u0438 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e C\/C++.<\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0443\u0433\u043b\u0443. \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u044b \u043f\u043e \u0443\u0433\u043b\u0443 \u0438 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0417\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u043c &#8212; \u043e\u043d \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u0443 \u0438 \u0435\u0451 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a x, y. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0441\u0447\u0451\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/ maximum amplitude samples in one beam #define MAX_SAMPLES_TO_SHOW 1024  \/\/ beams per 360 degrees, maximum angles with step 0.1125 corresponf to 3600 beams, 720 beams correpond to 0.5 degrees #define BEAMS 1440  \/\/ limit of reserved real screen pixels for each sample #define MAX_PIXELS_PER_SAMPLE 32  \/\/ arrays of pixels coordinates for each sonar ADC sample  int16_t pixel_table_x[BEAMS][MAX_SAMPLES_TO_SHOW][MAX_PIXELS_PER_SAMPLE],\\     pixel_table_y[BEAMS][MAX_SAMPLES_TO_SHOW][MAX_PIXELS_PER_SAMPLE],\\     pixel_table_n[BEAMS][MAX_SAMPLES_TO_SHOW];  \/\/ samples number equal to diameter int samples_per_beam; \/\/ have to be lower than MAX_SAMPLES_TO_SHOW   \/\/ calculate angle between vector (x,y) and X axis, the result in the sonar coordinates float angle(float x, float y) { float alpha, pi=3.1415926, tpi = 2*pi; if (abs(x)&lt;0.0001) {  if (y>0) alpha=pi\/2.0; else alpha=3.0*pi\/2.0; }     else if(abs(y)&lt;0.0001) {         if (x>0) alpha=0;         else alpha=pi;     } else { alpha = atan(y\/x); if( (x&lt;0)&amp;&amp;(y>0) ) alpha += pi; if( (x&lt;0)&amp;&amp;(y&lt;0) ) alpha += pi; if( (x>0)&amp;&amp;(y&lt;0) ) alpha += tpi; }     alpha = 3*pi\/2.0-alpha;          if ( alpha&lt;0 ) alpha+=tpi;     if ( alpha>tpi) alpha-=tpi;      return alpha; }   \/\/ calculate table of the pixels void pixel_table_ini( int diagram_diameter_in_pixels ) { float r, alpha; int beam, i; \/\/ indexes in the table int j; float xc,yc,pi=3.1415926; float dyy=0;      \/\/ reset the tables memset( pixel_table_n, 0, sizeof( pixel_table_n ) );  memset( pixel_table_x, 0, sizeof( pixel_table_x ) );  memset( pixel_table_y, 0, sizeof( pixel_table_y ) );           \/\/ check for MAX_SAMPLES_TO_SHOW     if (diagram_diameter_in_pixels > (MAX_SAMPLES_TO_SHOW*2))         diagram_diameter_in_pixels = MAX_SAMPLES_TO_SHOW*2;          samples_per_beam = diagram_diameter_in_pixels\/2;     float Radius = diagram_diameter_in_pixels \/ 2.0;      \/\/ check all pixels inside diameter*diameter bar to fill pixels arrays for(float x=0; x &lt; diagram_diameter_in_pixels; x++ ) {          for(float y=0; y &lt; diagram_diameter_in_pixels; y++ ) { xc = x - Radius; yc = y - Radius; r = sqrt( xc*xc + yc*yc ); \/\/ distance to center alpha = angle(xc,yc);  beam = alpha\/(3.1415926*2.0) * (float)BEAMS; i = (r + 0.5)*2.0; \/\/ index of the sample inside the beam i \/= 2; if ( (i&lt;Radius)&amp;&amp;(beam>=0)&amp;&amp;(beam&lt;=BEAMS) ) { j = pixel_table_n[beam][i]; \/\/ index of the pixel in the table if( (j&lt;MAX_PIXELS_PER_SAMPLE) ) { pixel_table_x[beam][i][j] = x; pixel_table_y[beam][i][j] = y; ++pixel_table_n[beam][i]; } } }     } } <\/code><\/pre>\n<p>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432\u044b\u0431\u0440\u0430\u043b SDL2. \u0411\u044b\u043b \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434 Windows, \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u041f\u041e \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0433\u0438\u0434\u0440\u043e\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 Visual C++. \u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0437\u0434\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e c CodeBlocks \u0438 MinGW. \u0417\u0432\u0443\u043a \u0431\u044b\u043b \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 SDL2 \u0432 Debian 10 \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-gfx-dev<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 c \u0438\u043c\u0435\u043d\u0435\u043c <a href=\"http:\/\/libsonarwindow.so\" rel=\"noopener noreferrer nofollow\">libsonarwindow.so<\/a> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">g++ -std=c++0x -shared -fPIC -pedantic main.cpp -o libsonarwindow.so `sdl2-config --cflags --libs` -lSDL2_image -lSDL2_ttf -lpthread<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"bash\">g++ -std=c++0x -pedantic main.cpp -o main `sdl2-config --cflags --libs` -lSDL2_image -lSDL2_ttf -lpthread<\/code><\/pre>\n<p>&#171;\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435&#187; \u043e\u043a\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0441\u043e \u0441\u043c\u0435\u043d\u043e\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#171;\u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u043e\u0433\u043e&#187; \u043e\u043a\u043d\u0430 \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b SDL2. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 SDL2 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0430\u0441\u044c. \u041d\u0438\u0436\u0435 \u0447\u0430\u0441\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443:<\/p>\n<pre><code class=\"cpp\">\/\/----------------------- \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043b\u0443\u0447 ( \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 ) -----------------------------             if (isDataBufferReady || usefile) {      if (usefile) {         \/\/ \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0441\u0447\u0435\u0442\u043e\u0432 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430         GetUnpackedDesc( saved_beam_i, dataHeader);      }     else {         dataHeader = dataHeaderStream;                             pUnpackedSamples = (uint32_t*)(comBuffer);     }          \/\/ \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430     AddDeadZone( deadzone_value ); \/\/ default 5     AddGain( gain_value, dataHeader.samples); \/\/ default 8     AddBrightness( brightness_value, dataHeader.samples); \/\/ default 400     AddContrast( contrast_value, dataHeader.samples); \/\/ default 2          isDataBufferReady = false;          int samples_n = dataHeader.samples; \/\/ number of samples in the burst      \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c     current_range = 10.0; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c 1392, \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 1376     for (int i=0;i&lt;15;i++) {         if ( samples_set[i] == samples_n ) {             current_range = range_set[i];             break;         }     }      \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u0433\u043b\u044b \u0438 \u043d\u043e\u043c\u0435\u0440 \u043b\u0443\u0447\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435     tetha = dataHeader.angle*0.0125\/360.0;     ray = tetha*BEAMS;     beam = ray;          \/\/ \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 samplesnum >= samples \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435     if ( samples_per_beam &lt;= samples_n ) { \/\/ too much samples                  float kpN = (float)samples_n \/ (float)samples_per_beam; \/\/ scale ratio             for(int i=0; i&lt;samples_per_beam; i++) {                  int start = kpN*(float)i - 0.5;                 if (start&lt;0) start=0;                 end   = kpN*(float)(i+1) + 0.5;                 if( end >= samples_n ) end = samples_n - 1;                  for( int j=start; j&lt;=end; j++) {                     a = pUnpackedSamples[j];                     if(j==start) Amax=a;                     else if (a>Amax) Amax=a;                 }                                  samples_to_show[i] = Amax;             }     }     else { \/\/ \u0435\u0441\u043b\u0438 samplesnum &lt; samples \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435         float kpN = (float)samples_n \/ (float)samples_per_beam;         int j; \/\/ sample inside beam index         for(int i=0; i&lt;samples_per_beam; i++) {             j = (kpN*(float)i);             samples_to_show[i] = pUnpackedSamples[j];        <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-380900","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/380900","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=380900"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/380900\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=380900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=380900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=380900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}