No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.cpp 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. /*
  7. * File: main.cpp
  8. * Author: dimercur
  9. *
  10. * Created on 6 novembre 2018, 10:54
  11. */
  12. #include <cstdlib>
  13. #include "image.h"
  14. #include "server.h"
  15. #include "robot.h"
  16. #include "message.h"
  17. #include <iostream>
  18. #include <string>
  19. #include <time.h>
  20. #include <thread>
  21. #include "definitions.h"
  22. #define HEADER_STM_IMAGE "IMG" // Envoi d'une image
  23. #define HEADER_STM_BAT "BAT" // Envoi de l'état de la batterie
  24. #define HEADER_STM_POS "POS" // Envoi de la position
  25. #define HEADER_STM_NO_ACK "NAK" // Acquittement d'un échec
  26. #define HEADER_STM_ACK "ACK" // Acquittement d'un succès
  27. #define HEADER_STM_MES "MSG" // Message textuel
  28. #define HEADER_STM_LOST_DMB "LCD" // Perte de la communication avec le robot
  29. #define HEADER_MTS_MSG "MSG" // Message directe pour Console Dumber
  30. #define HEADER_MTS_DMB_ORDER "DMB" // Message d'ordre pour le robot
  31. #define HEADER_MTS_COM_DMB "COM" // Message de gestion de la communication avec le robot
  32. #define HEADER_MTS_CAMERA "CAM" // Message de gestion de la camera
  33. #define HEADER_MTS_STOP "STO" // Message d'arrêt du system
  34. int socketID;
  35. char data[1000];
  36. int receivedLength;
  37. bool disconnected = true;
  38. bool dataReady = false;
  39. bool sysTick = false;
  40. bool sendImage = false;
  41. bool sendPos = false;
  42. Image monImage;
  43. Jpg imageCompressed;
  44. Camera cam;
  45. typedef struct {
  46. char header[4];
  47. char data[500];
  48. } MessageFromMon;
  49. MessageFromMon *message;
  50. MessageToMon messageAnswered;
  51. std::thread *threadTimer;
  52. std::thread *threadServer;
  53. char* imgMsg = NULL;
  54. using namespace std;
  55. /*
  56. *
  57. */
  58. void ThreadServer(void) {
  59. // Recuperation d'une evenutelle commande sur le serveur
  60. while (1) {
  61. receivedLength = receiveDataFromServer(data, 1000);
  62. if (receivedLength > 0) dataReady = true;
  63. }
  64. }
  65. void ThreadTimer(void) {
  66. struct timespec tim, tim2;
  67. tim.tv_sec = 0;
  68. tim.tv_nsec = 100000000;
  69. int cnt =0;
  70. while (1) {
  71. //std::this_thread::sleep_for(std::chrono::seconds )
  72. //sleep(1);
  73. if (nanosleep(&tim, &tim2) < 0) {
  74. printf("Nano sleep system call failed \n");
  75. return;
  76. }
  77. cnt++;
  78. if (cnt>=1)
  79. {
  80. sysTick = true;
  81. cnt=0;
  82. }
  83. }
  84. }
  85. void printReceivedMessage(MessageFromMon *mes) {
  86. cout << "Received " + to_string(receivedLength) + " data";
  87. cout << std::endl;
  88. cout << "Header: ";
  89. for (int i = 0; i < 4; i++) {
  90. cout << mes->header[i];
  91. }
  92. cout << std::endl;
  93. cout << "Data: ";
  94. for (int i = 0; i < receivedLength - 4; i++) {
  95. cout << mes->data[i];
  96. }
  97. cout << std::endl;
  98. }
  99. int sendAnswer(string cmd, string data) {
  100. int status = 0;
  101. string msg;
  102. msg = cmd + ':' + data;
  103. cout << "Answer: " + msg;
  104. cout << std::endl;
  105. sendDataToServer((char*) msg.c_str(), msg.length());
  106. return status;
  107. }
  108. int sendBinaryData(string cmd, char* data, int length) {
  109. int status = 0;
  110. int lengthSend;
  111. if (imgMsg != NULL) free((void*) imgMsg);
  112. imgMsg = (char*) malloc(length + 4);
  113. imgMsg[0] = cmd[0];
  114. imgMsg[1] = cmd[1];
  115. imgMsg[2] = cmd[2];
  116. imgMsg[3] = ':';
  117. memcpy((void*) &imgMsg[4], (const void *) data, length);
  118. cout << "Answer: " + cmd;
  119. cout << std::endl;
  120. lengthSend=sendDataToServer(imgMsg, length + 4);
  121. cout << "Requested Length: " + to_string(length) + " / Send Length: " + to_string(lengthSend);
  122. cout << std::endl;
  123. return status;
  124. }
  125. int decodeMessage(MessageFromMon *mes, int dataLength) {
  126. int status = 0;
  127. string header(mes->header, 4);
  128. string data(mes->data, dataLength);
  129. if (header.find(HEADER_MTS_COM_DMB) != std::string::npos) // Message pour la gestion du port de communication
  130. {
  131. if (data.find(OPEN_COM_DMB) != std::string::npos) sendAnswer(HEADER_STM_ACK, "");
  132. else if (data.find(CLOSE_COM_DMB) != std::string::npos) sendAnswer(HEADER_STM_ACK, "");
  133. } else if (header.find(HEADER_MTS_CAMERA) != std::string::npos) // Message pour la camera
  134. {
  135. if (data.find(CAM_OPEN) != std::string::npos) {
  136. sendAnswer(HEADER_STM_ACK, "");
  137. sendImage = true;
  138. } else if (data.find(CAM_CLOSE) != std::string::npos) {
  139. sendImage = false;
  140. } else if (data.find(CAM_COMPUTE_POSITION) != std::string::npos) {
  141. sendPos = true;
  142. } else if (data.find(CAM_STOP_COMPUTE_POSITION) != std::string::npos) {
  143. sendPos = false;
  144. } else {
  145. }
  146. } else if (header.find(HEADER_MTS_DMB_ORDER) != std::string::npos) // Message de com pour le robot
  147. {
  148. if (data.find(DMB_START_WITHOUT_WD) != std::string::npos) {
  149. sendAnswer(HEADER_STM_ACK, "");
  150. } else if (data.find(DMB_START_WITH_WD) != std::string::npos) {
  151. sendAnswer(HEADER_STM_ACK, "");
  152. } else if (data.find(DMB_GET_VBAT) != std::string::npos) {
  153. sendAnswer(HEADER_STM_BAT, to_string(DMB_BAT_HIGH));
  154. } else if (data.find(DMB_MOVE) != std::string::npos) {
  155. } else if (data.find(DMB_TURN) != std::string::npos) {
  156. } else {
  157. }
  158. } else if (header.find(HEADER_MTS_STOP) != std::string::npos) // Message d'arret
  159. {
  160. sendAnswer(HEADER_STM_ACK, "");
  161. } else {
  162. sendAnswer(HEADER_STM_NO_ACK, "");
  163. }
  164. return status;
  165. }
  166. int main(int argc, char** argv) {
  167. // Ouverture de la com robot
  168. #ifdef __FOR_PC__
  169. if (open_communication_robot("/dev/ttyUSB0") != 0) {
  170. #else
  171. if (open_communication_robot("/dev/ttyS0") != 0) {
  172. #endif /*__FOR_PC__ */
  173. cerr << "Unable to open /dev/ttyUSB0: abort";
  174. cout << std::endl;
  175. return -1;
  176. }
  177. cout << "Com port opened";
  178. cout << std::endl;
  179. // Ouverture de la camera
  180. if (open_camera(&cam) == -1) {
  181. cerr << "Unable to open camera: abort";
  182. cout << std::endl;
  183. return -1;
  184. }
  185. cout << "Camera opened";
  186. cout << std::endl;
  187. // Ouverture du serveur
  188. socketID = openServer(5544);
  189. cout << "Server opened on port 5544";
  190. cout << std::endl;
  191. threadTimer = new std::thread(ThreadTimer);
  192. for (;;) {
  193. cout << "Waiting for client to connect ...";
  194. cout << std::endl;
  195. acceptClient();
  196. disconnected = false;
  197. dataReady = false;
  198. cout << "Client connected";
  199. cout << std::endl;
  200. threadServer = new std::thread(ThreadServer);
  201. while (disconnected == false) {
  202. // Recuperation de l'image
  203. get_image(&cam, &monImage, "");
  204. if (dataReady == true) // des données ont été recu par le serveur
  205. {
  206. message = (MessageFromMon*) malloc(sizeof (MessageFromMon));
  207. memcpy((void*) message, (const void*) data, sizeof (MessageFromMon));
  208. dataReady = false;
  209. //if (message->header[4] == ':') message->header[4];
  210. printReceivedMessage(message);
  211. decodeMessage(message, receivedLength - 4);
  212. free(message);
  213. }
  214. if (sysTick) {
  215. sysTick = false;
  216. if (sendImage) {
  217. compress_image(&monImage, &imageCompressed);
  218. int length = imageCompressed.size();
  219. sendBinaryData(HEADER_STM_IMAGE, reinterpret_cast<char*> (imageCompressed.data()), length);
  220. //sendAnswer(HEADER_STM_IMAGE, reinterpret_cast<char*> (imageCompressed.data()));
  221. }
  222. if (sendPos) {
  223. //sendAnswer(HEADER_STM_POS,)
  224. }
  225. }
  226. }
  227. }
  228. threadTimer->join();
  229. threadServer->join();
  230. // test de la camera
  231. if (open_camera(0) != -1) {
  232. for (;;) {
  233. get_image(0, &monImage, "");
  234. if (monImage.empty()) printf("image vide");
  235. else {
  236. imshow("Sortie Camera", monImage);
  237. waitKey(10);
  238. }
  239. }
  240. } else {
  241. printf("Echec ouverture de camera");
  242. return -1;
  243. }
  244. return 0;
  245. }