command.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "command.h"
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <inttypes.h>
  5. #include <stdio.h>
  6. #include <strings.h>
  7. #include <string.h>
  8. #include <sys/socket.h>
  9. //Массив структур Command, который связывает строки команд с соответствующими функциями.
  10. Command commands[] = {
  11. {"TMSG44:FREQ ", handleFreqCmd},
  12. {"TMSG44:LD?", handleLdCmd},
  13. {"TMSG44:POW ", handlePowCmd},
  14. {"TMSG44:ARM ", handleArmCmd},
  15. {"TMSG44:ATT ", handleAttCmd},
  16. {"*IDN?", handleIdnCmd},
  17. {NULL, NULL} // Завершающий элемент для обозначения конца массива
  18. };
  19. //handleXXXXCmd - обработчики команд
  20. void handleFreqCmd(const char* recvBuff)
  21. {
  22. printf("\nTMSG44:FREQ\n");
  23. uint64_t freq[1] = {0};
  24. splitLexeme(recvBuff, freq, sizeof(freq[0]), convertToUint64);
  25. printf("%" PRId64 "\n", freq[0]);
  26. }
  27. void handleLdCmd(const char* recvBuff)
  28. {
  29. int n = 0;
  30. char messageLd[2] = "0";
  31. printf("\nTMSG44:LD?\n");
  32. if (1)
  33. {
  34. strcpy(messageLd, "1");
  35. }
  36. else if (0)
  37. {
  38. strcpy(messageLd, "0");
  39. }
  40. send(sockfd, messageLd, sizeof(messageLd), 0);
  41. printf("\nSend msg LD!\n");
  42. }
  43. void handlePowCmd(const char* recvBuff)
  44. {
  45. printf("\nTMSG44:POW\n");
  46. double pow[1] = {0};
  47. splitLexeme(recvBuff, pow, sizeof(pow[0]), convertToDouble);
  48. printf("%f\n", pow[0]);
  49. }
  50. void handleArmCmd(const char* recvBuff)
  51. {
  52. printf("\nTMSG44:ARM\n");
  53. uint16_t armCode[1] = {0};
  54. splitLexeme(recvBuff, armCode, sizeof(armCode[0]), convertToUInt16);
  55. printf("\n%u\n", armCode[0]);
  56. }
  57. void handleAttCmd(const char* recvBuff)
  58. {
  59. printf("\nTMSG44:ATT\n");
  60. uint16_t attCode[1] = {0};
  61. splitLexeme(recvBuff, attCode, sizeof(attCode[0]), convertToUInt16);
  62. printf("\n%u\n", attCode[0]);
  63. }
  64. void handleIdnCmd(const char* recvBuff)
  65. {
  66. printf("\n*IDN?\n");
  67. }
  68. //Проходим по массиву команд и ищем команду, которая совпадает с началом строки recvBuff.
  69. //Если команда найдена, вызывается соответствующая функция-обработчик
  70. void processCommand(const char* recvBuff)
  71. {
  72. for (int i = 0; commands[i].command != NULL; i++)
  73. {
  74. if (!strncasecmp(recvBuff, commands[i].command, strlen(commands[i].command)))
  75. {
  76. commands[i].handler(recvBuff);
  77. return;
  78. }
  79. }
  80. printf("\nUnknown command: %s\n", recvBuff);
  81. }
  82. // Преобразование строки в uint16_t
  83. void convertToUInt16(const char *str, void *output)
  84. {
  85. *(uint16_t *)output = (uint16_t)strtoul(str, NULL, 10);
  86. }
  87. // Преобразование строки в unsigned long long int
  88. void convertToUint64(const char *str, void *output)
  89. {
  90. *(uint64_t *)output = (uint64_t)strtoull(str, NULL, 10);
  91. }
  92. // Преобразование строки в double
  93. void convertToDouble(const char *str, void *output)
  94. {
  95. *(double *)output = strtod(str, NULL);
  96. }
  97. // Универсальная функция для разделения строки на лексемы
  98. void splitLexeme(const char *ptrSCPI, void *numOutAndValue, size_t elementSize, ConvertFunc convertFunc)
  99. {
  100. uint8_t counter = 0;
  101. // Разделители лексем
  102. char charSeparator[3] = {' ', '\n', '\\'};
  103. char *ptrLexeme = NULL;
  104. // Инициализируем функцию
  105. ptrLexeme = strtok((char *)ptrSCPI, charSeparator);
  106. // Ищем лексемы разделенные разделителем
  107. ptrLexeme = strtok(NULL, charSeparator);
  108. // Ищем лексемы строки
  109. while (ptrLexeme) {
  110. // Проверяем, является ли первый символ лексемы числом
  111. if(('0' <= ptrLexeme[0]) && (ptrLexeme[0] <= '9')) {
  112. // Преобразуем строку с числом в число
  113. convertFunc(ptrLexeme, (uint8_t *)numOutAndValue + counter * elementSize);
  114. counter++;
  115. }
  116. // Ищем лексемы разделенные разделителем
  117. ptrLexeme = strtok(NULL, charSeparator);
  118. }
  119. }