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

Generated by: LCOV version 2.0-1