mainwindow.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. #include "mainwindow.h"
  2. #include "./ui_mainwindow.h"
  3. #include "CommonButton.hpp"
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. /*
  10. * Отображение страницы авторизации
  11. */
  12. ui->main_stack->setCurrentIndex(0);
  13. /*
  14. * Инициализация интерфейса управления
  15. */
  16. taskInit();
  17. task_state = 0;
  18. ctl_state = 0;
  19. ui->stop_button->setEnabled(false);
  20. ui->resum_button->setEnabled(false);
  21. ui->telemRpm7_val->setVisible(false);
  22. ui->telemRpm8_val->setVisible(false);
  23. ui->telemRpm7->setVisible(false);
  24. ui->telemRpm8->setVisible(false);
  25. /*
  26. * Инициализация внешнего канала управления
  27. */
  28. external_cmd_sock = external_start();
  29. /*
  30. * Подготовка канала телеметрии
  31. */
  32. ftc_tlm_init(&tlm.ftc_tlm);
  33. tlm_sock = tlm_start();
  34. fc_tlm_init(&tlm.fc_tlm);
  35. ftc_tlm_init(&tlm.ftc_tlm);
  36. bc_tlm_init(&tlm.bc_tlm);
  37. QLabel* acts_val[MAX_ACTUATORS_COUNT] = {
  38. ui->telemRpm1_val
  39. ,ui->telemRpm2_val
  40. ,ui->telemRpm3_val
  41. ,ui->telemRpm4_val
  42. ,ui->telemRpm5_val
  43. ,ui->telemRpm6_val
  44. ,ui->telemRpm7_val
  45. ,ui->telemRpm8_val
  46. };
  47. for(auto i : acts_val)
  48. i->setNum(0);
  49. /*
  50. * Запуск главного таймера
  51. */
  52. timer = new QTimer();
  53. connect(timer, SIGNAL(timeout()), this, SLOT(slotTimerAlarm()));
  54. timer->start(500);
  55. }
  56. MainWindow::~MainWindow()
  57. {
  58. delete ui;
  59. }
  60. void MainWindow::ctlConnector()
  61. {
  62. if(ctl_state == 0){
  63. //std::cout << "Запрос соединения.\n";
  64. // Запрос соединения если оно не установлено
  65. if(ctl_connect(&ctl_sock) != -1)
  66. ctl_state = 1;
  67. }else{
  68. //std::cout << "Проверка соединения.\n";
  69. // Проверка работоспособности соединения
  70. if(ctl_con_check(ctl_sock) == -1){
  71. ctl_state = 0;
  72. ctl_con_close(ctl_sock);
  73. std::cout << "Завершение соединения.\n";
  74. }
  75. }
  76. }
  77. void MainWindow::telemHandler()
  78. {
  79. recv_tlm(tlm_sock, &tlm);
  80. task_state = tlm.ftc_tlm.state_flg;
  81. switch(task_state){
  82. case STATE_INIT:
  83. ui->taskStart_button->setEnabled(true);
  84. ui->interrupt_button->setEnabled(false);
  85. ui->stop_button->setEnabled(false);
  86. ui->resum_button->setEnabled(false);
  87. break;
  88. case STATE_TAKEOFF:
  89. ui->taskStart_button->setEnabled(false);
  90. ui->interrupt_button->setEnabled(true);
  91. ui->stop_button->setEnabled(true);
  92. ui->resum_button->setEnabled(false);
  93. break;
  94. case STATE_STOP:
  95. ui->taskStart_button->setEnabled(false);
  96. ui->interrupt_button->setEnabled(true);
  97. ui->stop_button->setEnabled(false);
  98. ui->resum_button->setEnabled(true);
  99. break;
  100. case STATE_RESUM:
  101. ui->taskStart_button->setEnabled(false);
  102. ui->interrupt_button->setEnabled(true);
  103. ui->stop_button->setEnabled(true);
  104. ui->resum_button->setEnabled(false);
  105. break;
  106. default:
  107. ui->taskStart_button->setEnabled(false);
  108. ui->interrupt_button->setEnabled(true);
  109. ui->stop_button->setEnabled(false);
  110. ui->resum_button->setEnabled(false);
  111. break;
  112. }
  113. if(tlm.fc_tlm.lat < 1e-5 || tlm.fc_tlm.gps_fix < 2)
  114. ui->telemLat_val->setNum(0);
  115. else
  116. ui->telemLat_val->setNum(tlm.fc_tlm.lat);
  117. if(tlm.fc_tlm.lon < 1e-5 || tlm.fc_tlm.gps_fix < 2)
  118. ui->telemLon_val->setNum(0);
  119. else
  120. ui->telemLon_val->setNum(tlm.fc_tlm.lon);
  121. // Высота, м
  122. ui->telemHight_val->setNum(tlm.fc_tlm.hight);
  123. // Скорость, м/c
  124. ui->telemSpeed_val->setNum(tlm.fc_tlm.speed);
  125. // Температура, C
  126. ui->telemTemperature_val->setNum(tlm.bc_tlm.temperature);
  127. // Обороты, об/мин
  128. QLabel* acts_val[MAX_ACTUATORS_COUNT] = {
  129. ui->telemRpm1_val
  130. ,ui->telemRpm2_val
  131. ,ui->telemRpm3_val
  132. ,ui->telemRpm4_val
  133. ,ui->telemRpm5_val
  134. ,ui->telemRpm6_val
  135. ,ui->telemRpm7_val
  136. ,ui->telemRpm8_val
  137. };
  138. for(int i = 0; i < tlm.fc_tlm.actuators_count; ++i){
  139. double val = pwm_convert(tlm.fc_tlm.actuators[i]);
  140. acts_val[i]->setText(QString::number(val, 'f', 2));
  141. }
  142. // Таймер начала взлета
  143. ui->telemTimerStart_val->setText(QTime::fromMSecsSinceStartOfDay(tlm.ftc_tlm.timer_1*1000).toString("hh:mm:ss"));
  144. // Таймер начала посадки
  145. int tmp = tlm.ftc_tlm.timer_2;
  146. QString timer_2_str;
  147. if(tmp >= 86400)
  148. timer_2_str = "01:" + QTime::fromMSecsSinceStartOfDay((tmp - 86400)*1000).toString("hh:mm:ss");
  149. else
  150. timer_2_str = QTime::fromMSecsSinceStartOfDay(tmp*1000).toString("hh:mm:ss");
  151. ui->telemTimerFinish_val->setText(timer_2_str);
  152. // Соединение (Да/Нет)
  153. if (ctl_state == 1){
  154. ui->telemConnect_val->setText(static_cast<QString>("Да"));
  155. if(task_state == 0){
  156. ui->taskStart_button->setEnabled(true);
  157. ui->interrupt_button->setEnabled(false);
  158. }else{
  159. ui->taskStart_button->setEnabled(false);
  160. ui->interrupt_button->setEnabled(true);
  161. }
  162. }else{
  163. ui->telemConnect_val->setText(static_cast<QString>("Нет"));
  164. ui->taskStart_button->setEnabled(false);
  165. ui->interrupt_button->setEnabled(false);
  166. }
  167. // Обработка failsafes
  168. int cur_time = static_cast<int>(std::time(nullptr));
  169. if( tlm.fc_tlm.fail.time != 0
  170. && tlm.fc_tlm.fail.time + 2 >= cur_time
  171. && tlm.fc_tlm.fail.time != last_fail_time){
  172. //std::cout << "Type:\t" << tlm.fc_tlm.fail.type << "\n";
  173. last_fail_time = tlm.fc_tlm.fail.time;
  174. switch (tlm.fc_tlm.fail.type){
  175. case FAIL_GPS:
  176. fail_buff = " / Потерян сигнал СНС";
  177. break;
  178. case FAIL_BATTERY:
  179. fail_buff = " / Потеря питания";
  180. break;
  181. case FAIL_MOTOR:
  182. fail_buff = " / Потеря двигателя";
  183. break;
  184. case FAIL_POWER:
  185. fail_buff = " / Потеря основного питания";
  186. break;
  187. case FAIL_UNKNOWN:
  188. fail_buff = " / Ошибка бортовой системы управления";
  189. break;
  190. default:
  191. break;
  192. }
  193. }
  194. // Консоль отладки
  195. EVENT_t new_event = tlm.ftc_tlm.event;
  196. if(last_event != new_event && new_event < EVENT_MAX){
  197. if(alarm_buff.size() > 1024){
  198. while(alarm_buff.at(0) != '\n')
  199. //alarm_buff.erase(alarm_buff.cbegin());
  200. alarm_buff = alarm_buff.right(alarm_buff.size()-1);
  201. //alarm_buff.erase(alarm_buff.cbegin());
  202. alarm_buff = alarm_buff.right(alarm_buff.size()-1);
  203. }
  204. alarm_buff += QDateTime::currentDateTime().toString("hh:mm:ss");
  205. alarm_buff += "\t";
  206. alarm_buff += alarms.at(static_cast<int>(new_event));
  207. alarm_buff += fail_buff;
  208. alarm_buff += "\n";
  209. ui->textEdit->setText(alarm_buff);
  210. last_event = new_event;
  211. fail_buff.clear();
  212. ui->textEdit->verticalScrollBar()->setValue(ui->textEdit->verticalScrollBar()->maximum());
  213. }
  214. }
  215. void MainWindow::taskInit()
  216. {
  217. ui->taskStart_button->setEnabled(false);
  218. ui->interrupt_button->setEnabled(false);
  219. }
  220. // Сигналы
  221. void MainWindow::slotTimerAlarm()
  222. {
  223. telemHandler();
  224. ctlConnector();
  225. external_cmds_handler();
  226. }
  227. void MainWindow::on_taskStart_button_clicked()
  228. {
  229. flight_task_t tsk;
  230. // Высота, м
  231. tsk.hight = ui->taskHight_val->displayText().toInt();
  232. // Время старта от начала дня, сек
  233. tsk.start_time = ui->taskStartTime_val->time().msecsSinceStartOfDay() / 1000;
  234. // Время полета, сек
  235. tsk.hang_time = ui->taskFlightTime_val->time().msecsSinceStartOfDay() / 1000;
  236. if(ui->plusDay->isChecked())
  237. tsk.hang_time += 86400;
  238. // Блокировка по высоте и времени зависания
  239. if( tsk.hight == 0
  240. || tsk.hang_time == 0
  241. || tsk.hight > 100
  242. || tsk.hang_time > 172800)
  243. return;
  244. CTL_COMMAND_t cmd = CTL_TASK;
  245. send_cmd(ctl_sock, &cmd);
  246. send_task(ctl_sock, &tsk);
  247. }
  248. void MainWindow::on_interrupt_button_clicked()
  249. {
  250. CTL_COMMAND_t cmd = CTL_INTERRUPT;
  251. send_cmd(ctl_sock, &cmd);
  252. }
  253. void MainWindow::on_stop_button_clicked()
  254. {
  255. CTL_COMMAND_t cmd = CTL_STOP;
  256. send_cmd(ctl_sock, &cmd);
  257. }
  258. void MainWindow::on_resum_button_clicked()
  259. {
  260. CTL_COMMAND_t cmd = CTL_RESUM;
  261. send_cmd(ctl_sock, &cmd);
  262. }
  263. void MainWindow::on_pass_val_returnPressed()
  264. {
  265. QString LOGIN = "admin";
  266. QString PASS = "1234";
  267. QString login = ui->login_val->text();
  268. QString pass = ui->pass_val->text();
  269. if(login == LOGIN && pass == PASS)
  270. ui->main_stack->setCurrentIndex(1);
  271. }
  272. double MainWindow::pwm_convert(int pwm){
  273. const int PWM_MIN = 1100;
  274. const int PWM_MAX = 1900;
  275. if(pwm <= PWM_MIN)
  276. return 0;
  277. if(pwm >= PWM_MAX)
  278. return 100;
  279. return static_cast<double>(pwm - PWM_MIN) * 100 / (PWM_MAX - PWM_MIN);
  280. }
  281. void MainWindow::external_cmds_handler(){
  282. CTL_COMMAND_t cmd = static_cast<CTL_COMMAND_t>(-1);
  283. char byte = -1;
  284. recv_external_cmd(external_cmd_sock, &byte);
  285. if(byte != -1){
  286. cmd = static_cast<CTL_COMMAND_t>(byte - '0');
  287. //std::cout << cmd << " <- \n";
  288. }
  289. switch(cmd){
  290. case CTL_TASK:
  291. on_taskStart_button_clicked();
  292. break;
  293. case CTL_INTERRUPT:
  294. on_interrupt_button_clicked();
  295. break;
  296. case CTL_STOP:
  297. on_stop_button_clicked();
  298. break;
  299. case CTL_RESUM:
  300. on_resum_button_clicked();
  301. break;
  302. default:
  303. break;
  304. }
  305. }