| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #include "command.h"
- #include <stdint.h>
- #include <stdlib.h>
- #include <inttypes.h>
- #include <stdio.h>
- #include <strings.h>
- #include <string.h>
- #include <sys/socket.h>
- #include "Devices/lmx2594.h"
- //Массив структур Command, который связывает строки команд с соответствующими функциями.
- Command commands[] = {
- {"TMSG44:FREQ ", handleFreqCmd},
- {"TMSG44:LD?", handleLdCmd},
- {"TMSG44:POW ", handlePowCmd},
- {"TMSG44:ARM ", handleArmCmd},
- {"TMSG44:ATT ", handleAttCmd},
- {"*IDN?", handleIdnCmd},
- {NULL, NULL} // Завершающий элемент для обозначения конца массива
- };
- //handleXXXXCmd - обработчики команд
- void handleFreqCmd(const char* recvBuff)
- {
- printf("\nTMSG44:FREQ\n");
- double freq[1] = {0};
- splitLexeme(recvBuff, freq, sizeof(freq[0]), convertToDouble);
- printf("%f\n", freq[0]);
- lmx_freq_set(bar1, freq[0]);
- printf("The frequency is set to %f Hz\n", freq[0]);
- }
- void handleLdCmd(const char* recvBuff)
- {
- int n = 0;
- char messageLd[] = "0\n";
- printf("\nTMSG44:LD?\n");
- if (1)
- {
- strcpy(messageLd, "1\n");
- }
- else if (0)
- {
- strcpy(messageLd, "0\n");
- }
- send(conn_fd, messageLd, sizeof(messageLd), 0);
-
- printf("\nSend msg LD!\n");
- }
- void handlePowCmd(const char* recvBuff)
- {
- printf("\nTMSG44:POW\n");
- double pow[1] = {0};
- splitLexeme(recvBuff, pow, sizeof(pow[0]), convertToDouble);
- printf("%f\n", pow[0]);
- }
- void handleArmCmd(const char* recvBuff)
- {
- printf("\nTMSG44:ARM\n");
- uint16_t armCode[1] = {0};
- splitLexeme(recvBuff, armCode, sizeof(armCode[0]), convertToUInt16);
- printf("\n%u\n", armCode[0]);
- }
- void handleAttCmd(const char* recvBuff)
- {
- printf("\nTMSG44:ATT\n");
- uint16_t attCode[1] = {0};
- splitLexeme(recvBuff, attCode, sizeof(attCode[0]), convertToUInt16);
- printf("\n%u\n", attCode[0]);
- }
- void handleIdnCmd(const char* recvBuff)
- {
- ssize_t n;
- printf("\n*IDN?\n");
- char messageIdn[] = "TMSG44_CoolPi\n";
- n = send(conn_fd, messageIdn, sizeof(messageIdn), 0);
- printf("%ld \n", n);
- }
- //Проходим по массиву команд и ищем команду, которая совпадает с началом строки recvBuff.
- //Если команда найдена, вызывается соответствующая функция-обработчик
- void processCommand(const char* recvBuff)
- {
- for (int i = 0; commands[i].command != NULL; i++)
- {
- if (!strncasecmp(recvBuff, commands[i].command, strlen(commands[i].command)))
- {
- commands[i].handler(recvBuff);
- return;
- }
- }
- printf("\nUnknown command: %s\n", recvBuff);
- }
- // Преобразование строки в uint16_t
- void convertToUInt16(const char *str, void *output)
- {
- *(uint16_t *)output = (uint16_t)strtoul(str, NULL, 10);
- }
- // Преобразование строки в unsigned long long int
- void convertToUint64(const char *str, void *output)
- {
- *(uint64_t *)output = (uint64_t)strtoull(str, NULL, 10);
- }
- // Преобразование строки в double
- void convertToDouble(const char *str, void *output)
- {
- *(double *)output = strtod(str, NULL);
- }
- // Универсальная функция для разделения строки на лексемы
- void splitLexeme(const char *ptrSCPI, void *numOutAndValue, size_t elementSize, ConvertFunc convertFunc)
- {
- uint8_t counter = 0;
- // Разделители лексем
- char charSeparator[3] = {' ', '\n', '\\'};
- char *ptrLexeme = NULL;
- // Инициализируем функцию
- ptrLexeme = strtok((char *)ptrSCPI, charSeparator);
- // Ищем лексемы разделенные разделителем
- ptrLexeme = strtok(NULL, charSeparator);
- // Ищем лексемы строки
- while (ptrLexeme) {
- // Проверяем, является ли первый символ лексемы числом
- if(('0' <= ptrLexeme[0]) && (ptrLexeme[0] <= '9')) {
- // Преобразуем строку с числом в число
- convertFunc(ptrLexeme, (uint8_t *)numOutAndValue + counter * elementSize);
- counter++;
- }
- // Ищем лексемы разделенные разделителем
- ptrLexeme = strtok(NULL, charSeparator);
- }
- }
|