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 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <sys/socket.h>
  4. #include <stdlib.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include <iostream>
  8. using namespace std;
  9. const char LABEL_ROBOT_PING = 'p';
  10. const char LABEL_ROBOT_RESET = 'r';
  11. const char LABEL_ROBOT_START_WITH_WD = 'W';
  12. const char LABEL_ROBOT_START_WITHOUT_WD = 'u';
  13. const char LABEL_ROBOT_RELOAD_WD = 'w';
  14. const char LABEL_ROBOT_MOVE = 'M';
  15. const char LABEL_ROBOT_TURN = 'T';
  16. const char LABEL_ROBOT_GET_BATTERY = 'v';
  17. const char LABEL_ROBOT_GET_STATE = 'b';
  18. const char LABEL_ROBOT_POWEROFF = 'z';
  19. const char LABEL_ROBOT_OK = 'O';
  20. const char LABEL_ROBOT_ERROR = 'E';
  21. const char LABEL_ROBOT_UNKNOWN_COMMAND = 'C';
  22. const char LABEL_ROBOT_SEPARATOR_CHAR = '=';
  23. const char LABEL_ROBOT_ENDING_CHAR = 0x0D;
  24. #define PORT 6699
  25. int main(int argc, char const *argv[]) {
  26. int server_fd, new_socket, valread;
  27. struct sockaddr_in address;
  28. int opt = 1;
  29. int addrlen = sizeof (address);
  30. char buffer[1024] = {0};
  31. // Creating socket file descriptor
  32. if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  33. perror("socket failed");
  34. exit(EXIT_FAILURE);
  35. }
  36. // Forcefully attaching socket to the port 8080
  37. if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
  38. &opt, sizeof (opt))) {
  39. perror("setsockopt");
  40. exit(EXIT_FAILURE);
  41. }
  42. address.sin_family = AF_INET;
  43. address.sin_addr.s_addr = INADDR_ANY;
  44. address.sin_port = htons(PORT);
  45. cout << "<<< simulator >>>" << endl;
  46. // Forcefully attaching socket to the port 8080
  47. if (bind(server_fd, (struct sockaddr *) &address,
  48. sizeof (address)) < 0) {
  49. perror("bind failed");
  50. exit(EXIT_FAILURE);
  51. }
  52. cout << ">>> waiting the opening" << endl;
  53. if (listen(server_fd, 3) < 0) {
  54. perror("listen");
  55. exit(EXIT_FAILURE);
  56. }
  57. if ((new_socket = accept(server_fd, (struct sockaddr *) &address,
  58. (socklen_t*) & addrlen)) < 0) {
  59. perror("accept");
  60. exit(EXIT_FAILURE);
  61. }
  62. cout << ">>> The robot is ready to receive something" << endl;
  63. unsigned long starttime = (unsigned long) time(NULL);
  64. while (1) {
  65. valread = read(new_socket, buffer, 1024);
  66. if (valread <= 0)
  67. break;
  68. printf(">>> I received : %s\n", buffer);
  69. cout << (unsigned long) time(NULL) << ": ";
  70. string s = "";
  71. s += LABEL_ROBOT_OK;
  72. switch (buffer[0]) {
  73. case LABEL_ROBOT_START_WITHOUT_WD:
  74. s += LABEL_ROBOT_OK;
  75. break;
  76. case LABEL_ROBOT_START_WITH_WD:
  77. s += LABEL_ROBOT_OK;
  78. break;
  79. case LABEL_ROBOT_MOVE:
  80. switch (buffer[2]) {
  81. case '0':
  82. cout << "oo I stop oo" << endl;
  83. break;
  84. case '-':
  85. cout << "\\/ I move backward \\/" << endl;
  86. break;
  87. default:
  88. cout << "/\\ I move forward /\\" << endl;
  89. break;
  90. }
  91. s += LABEL_ROBOT_OK;
  92. break;
  93. case LABEL_ROBOT_TURN:
  94. switch (buffer[2]) {
  95. case '-':
  96. cout << "<< I turn to the left <<" << endl;
  97. break;
  98. default:
  99. cout << ">> I turn to the right >>" << endl;
  100. break;
  101. }
  102. s += LABEL_ROBOT_OK;
  103. break;
  104. case LABEL_ROBOT_GET_BATTERY:
  105. if ((unsigned long) time(NULL) - starttime > 20) {
  106. s += '0';
  107. } else {
  108. if ((unsigned long) time(NULL) - starttime > 10) {
  109. s += '1';
  110. } else {
  111. s += '2';
  112. }
  113. }
  114. break;
  115. case '0':
  116. //msg = new MessageBattery(MESSAGE_ROBOT_BATTERY_LEVEL, BATTERY_EMPTY);
  117. break;
  118. case '1':
  119. //msg = new MessageBattery(MESSAGE_ROBOT_BATTERY_LEVEL, BATTERY_LOW);
  120. break;
  121. case '2':
  122. //msg = new MessageBattery(MESSAGE_ROBOT_BATTERY_LEVEL, BATTERY_FULL);
  123. break;
  124. default:
  125. //msg = new Message(MESSAGE_ANSWER_ROBOT_ERROR);
  126. cerr << "[" << __PRETTY_FUNCTION__ << "] Unknown message received from robot (" << buffer << ")" << endl << flush;
  127. }
  128. send(new_socket, s.c_str(), s.length(), 0);
  129. //printf("%s sent\n", s);
  130. }
  131. cout << "The robot is dead. End of story " << endl;
  132. cout << " /\\_/\\" << endl << "( o.o )" << endl << " > ^ <" << endl;
  133. return 0;
  134. }