LCOV - code coverage report
Current view: top level - sspmodules/test/apps - ssp_udp_test.cxx (source / functions) Coverage Total Hit
Test: code.result Lines: 0.0 % 52 0
Test Date: 2026-10-11 15:05:20 Functions: 0.0 % 5 0

            Line data    Source code
       1              : #include <stdio.h>
       2              : #include <stdlib.h>
       3              : #include <string.h>
       4              : 
       5              : #ifdef _WIN32
       6              : #include <Winsock2.h>
       7              : #include <direct.h>
       8              : #define close closesocket
       9              : #pragma comment(lib, "Ws2_32.lib")
      10              : typedef int socklen_t; // Define socklen_t for Windows
      11              : #else
      12              : #include <arpa/inet.h>
      13              : #include <netdb.h>
      14              : #include <netinet/in.h>
      15              : #include <sys/socket.h>
      16              : #include <sys/types.h>
      17              : #include <unistd.h>
      18              : #endif
      19              : 
      20              : #define PORT 55001
      21              : #define BUFFER_SIZE 1024
      22              : #define TIMEOUT_SEC 5
      23              : #define RETRY_COUNT 5
      24              : 
      25              : typedef struct
      26              : {
      27              :   unsigned int total_pkt_len;
      28              :   unsigned int address;
      29              :   unsigned int command;
      30              :   unsigned int size;
      31              :   unsigned int status;
      32              : } Ctrl_Header;
      33              : 
      34              : typedef struct
      35              : {
      36              :   Ctrl_Header header;
      37              :   unsigned int data[BUFFER_SIZE];
      38              : } Ctrl_Packet;
      39              : 
      40              : int
      41            0 : connectToDevice(const char* ip, struct sockaddr_in* server_addr)
      42              : {
      43            0 :   int sockfd;
      44              : 
      45              : #ifdef _WIN32
      46              :   WSADATA wsaData;
      47              :   if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
      48              :     fprintf(stderr, "WSAStartup failed\n");
      49              :     return -1;
      50              :   }
      51              : #endif
      52              : 
      53            0 :   sockfd = socket(AF_INET, SOCK_DGRAM, 0);
      54            0 :   if (sockfd < 0) {
      55            0 :     perror("Socket creation failed");
      56            0 :     return -1;
      57              :   }
      58              : 
      59            0 :   struct timeval timeout;
      60            0 :   timeout.tv_sec = TIMEOUT_SEC;
      61            0 :   timeout.tv_usec = 0;
      62              : 
      63            0 :   setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
      64            0 :   setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout));
      65              : 
      66            0 :   server_addr->sin_family = AF_INET;
      67            0 :   server_addr->sin_port = htons(PORT);
      68            0 :   inet_pton(AF_INET, ip, &server_addr->sin_addr);
      69              : 
      70            0 :   return sockfd;
      71              : }
      72              : 
      73              : void
      74            0 : disconnectDevice(int sockfd)
      75              : {
      76            0 :   close(sockfd);
      77              : #ifdef _WIN32
      78              :   WSACleanup();
      79              : #endif
      80            0 : }
      81              : 
      82              : int
      83            0 : sendReceive(int sockfd, struct sockaddr_in* server_addr, Ctrl_Packet* tx, Ctrl_Packet* rx)
      84              : {
      85            0 :   socklen_t addr_len = sizeof(*server_addr);
      86            0 :   for (int attempt = 0; attempt < RETRY_COUNT; ++attempt) {
      87            0 :     if (sendto(sockfd, (const char*)tx, tx->header.total_pkt_len, 0, (struct sockaddr*)server_addr, addr_len) < 0) {
      88            0 :       perror("Send failed");
      89            0 :       continue;
      90              :     }
      91              : 
      92            0 :     if (recvfrom(sockfd, (char*)rx, sizeof(Ctrl_Packet), 0, (struct sockaddr*)server_addr, &addr_len) < 0) {
      93            0 :       perror("Receive failed");
      94            0 :       continue;
      95              :     }
      96              : 
      97              :     return 0;
      98              :   }
      99              :   return -1;
     100              : }
     101              : 
     102              : int
     103            0 : DeviceRead(int sockfd, struct sockaddr_in* server_addr, unsigned int address, unsigned int* value)
     104              : {
     105            0 :   Ctrl_Packet tx, rx;
     106            0 :   tx.header.total_pkt_len = sizeof(Ctrl_Header);
     107            0 :   tx.header.address = address;
     108            0 :   tx.header.command = 0x01; // Assuming cmdRead is 0x01
     109            0 :   tx.header.size = 1;
     110            0 :   tx.header.status = 0;
     111              : 
     112            0 :   if (sendReceive(sockfd, server_addr, &tx, &rx) != 0) {
     113              :     return -1;
     114              :   }
     115              : 
     116            0 :   if (tx.header.address != rx.header.address) {
     117              :     return -1;
     118              :   }
     119              : 
     120            0 :   *value = rx.data[0];
     121            0 :   return 0;
     122              : }
     123              : 
     124              : int
     125            0 : main(int argc, char* argv[])
     126              : {
     127            0 :   if (argc != 3) {
     128            0 :     fprintf(stderr, "Usage: %s <device_ip> <address>\n", argv[0]);
     129            0 :     return EXIT_FAILURE;
     130              :   }
     131              : 
     132            0 :   const char* device_ip = argv[1];
     133            0 :   unsigned int address = strtoul(argv[2], NULL, 16); // Convert address from hexadecimal
     134              : 
     135            0 :   unsigned int value;
     136            0 :   struct sockaddr_in server_addr;
     137              : 
     138            0 :   int sockfd = connectToDevice(device_ip, &server_addr);
     139            0 :   if (sockfd < 0) {
     140              :     return EXIT_FAILURE;
     141              :   }
     142              : 
     143            0 :   if (DeviceRead(sockfd, &server_addr, address, &value) == 0) {
     144            0 :     printf("Read value: 0x%08X\n", value);
     145              :   } else {
     146            0 :     fprintf(stderr, "Failed to read from device\n");
     147              :   }
     148              : 
     149            0 :   disconnectDevice(sockfd);
     150              :   return EXIT_SUCCESS;
     151              : }
        

Generated by: LCOV version 2.0-1