/****************************************************************************
 * apps/examples/tcp_ipc_client/tcp_ipc_client_main.c
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 ****************************************************************************/

/* This program consists of a client socket & custom messages that send
 * data (hex-string formatted data) to a server (server_tcp). Then,
 * server_tcp send this data over LoraWAN (using Radioenge LoRaWAn module)
 * Both client and server work on local network.
 * IMPORTANT NOTE:
 * In order to test client_tcp & server_tcp together, there are two
 * ways to proceed:
 * 1) Init server manually (command: SERVER &), and after successfull
 * server init, also init client manually (CLIENT 127.0.0.1)
 * 2) Init server automatically after boot using NuttShell start up scripts.
 */

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

#include "protocol.h"

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/****************************************************************************
 * Private Types
 ****************************************************************************/

/****************************************************************************
 * Private Function Prototypes
 ****************************************************************************/

/****************************************************************************
 * Private Data
 ****************************************************************************/

/****************************************************************************
 * Public Data
 ****************************************************************************/

/****************************************************************************
 * Private Functions
 ****************************************************************************/

static void show_usage(FAR const char *progname)
{
  fprintf(stderr, "USAGE: %s <Server-IP>\n", progname);
  fprintf(stderr, "       %s -h\n", progname);
  fprintf(stderr, "Where:\n");
  fprintf(stderr, "\t<<Server-IP>: IP of server TCP/IP socket for IPC.\n");
}

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Definitions
 ****************************************************************************/

#define SOCKET_PORT                     5000
#define TCP_DATA_RCV_WITHOUT_FLAGS      0
#define RCV_BUFFER_SIZE                 520
#define SEND_BUFFER_SIZE                500
#define TIME_SECONDS_TO_SEND_NEXT_DATA  15

/****************************************************************************
 * Client_tcp_main
 ****************************************************************************/

int main(int argc, char *argv[])
{
  int socket_client = 0;
  char rcv_buffer[RCV_BUFFER_SIZE];
  char buffer_to_send[SEND_BUFFER_SIZE];
  int bytes_read_from_server = 0;
  struct sockaddr_in serv_addr;
  protocolo_ipc tprotocol;

  /* Check if there are sufficient arguments passed to this program */

  if (argc != 2)
    {
      printf("\nNot enough parameters: %s.\n", argv[0]);
      return 1;
    }

  if (strcmp(argv[1], "-h") == 0)
    {
      show_usage(argv[0]);
      return EXIT_FAILURE;
    }

  /* Create client socket */

  memset(rcv_buffer, 0x00, sizeof(rcv_buffer));
  socket_client = socket(AF_INET, SOCK_STREAM, 0);
  if (socket_client < 0)
    {
      perror("Failed to create client socket");
      exit(EXIT_FAILURE);
    }

  /* Connect to server socket */

  memset(&serv_addr, 0x00, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(SOCKET_PORT);

  if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0)
    {
      perror("Failed when executing inet_pton()");
      exit(EXIT_FAILURE);
    }

  if (connect(socket_client, (struct sockaddr *)&serv_addr,
              sizeof(serv_addr)) < 0)
    {
      perror("Failed to connect to server socket");
      exit(EXIT_FAILURE);
    }

  /* Countinuosly send server data to be forwarded to LPWAN transceiver */

  while (1)
    {
      /* Formats message to be sent to server (opcode, message size
       * and message content)
       */

      tprotocol.opcode = 'U';
      tprotocol.msg_size = 4;
      snprintf((char *)tprotocol.msg, sizeof(tprotocol.msg), "0102");

      /* Send message to server */

      memcpy(buffer_to_send, (unsigned char *)&tprotocol,
             sizeof(protocolo_ipc));
      write(socket_client, buffer_to_send, strlen(buffer_to_send));
      printf("Message sent to server!\n\n");

      /* Waits for server response */

      bytes_read_from_server = recv(socket_client, rcv_buffer,
                               sizeof(protocolo_ipc),
                               TCP_DATA_RCV_WITHOUT_FLAGS);

      if (bytes_read_from_server < 0)
        {
          perror("Failed to get server response");
          exit(EXIT_FAILURE);
        }
      else
        {
          /* Server response successfully received. Print it on the screen */

          memcpy((unsigned char *)&tprotocol, rcv_buffer,
                 sizeof(protocolo_ipc));
          printf("Protocol: opcode: %c\n", tprotocol.opcode);
          printf("Protocol: message size: %d\n", tprotocol.msg_size);
          printf("Protocol: message: %s\n", tprotocol.msg);
        }

      /* Wait to send again */

      sleep(TIME_SECONDS_TO_SEND_NEXT_DATA);
    }

  return 0;
}
