/***********************************************************************/
/*                    Demo source for esd NTCAN-API                    */
/*                                                                     */
/*       Copyright by Shanghai ESD Electric Technology Co., Ltd.       */
/*---------------------------------------------------------------------*/
/*         Filename:      interaction.c                                */
/*         Date:          2022-1-5                                     */
/*         Language:      ANSI C                                       */
/*         Targetsystem:  Windows 10, Linux                            */
/*         Purpose:       Demostrate Interaction mechanism, 1) Turn    */
/*                        ON/OFF Interaction. 2) Mark interaction      */
/*                        messages in CMSG.                            */
/*         Author:        Bob Tu                                       */
/*---------------------------------------------------------------------*/ 
/* Revision history:                                                   */
/*---------------------------------------------------------------------*/
/* v1.0    Birth of module                                             */
/***********************************************************************/

#include <stdio.h>
#include "ntcan.h"
#include <string.h>

int main(int argc, char *argv[])
{

  int net=3; /* logical net number */
  uint32_t mode; /* mode bits for canOpen */
  int32_t txqueuesize=8; /* maximum number of messages to transmit */
  int32_t rxqueuesize=8; /* maximum number of messages to receive */
  int32_t txtimeout=1000; /* timeout for transmit in ms */
  int32_t rxtimeout=10000; /* timeout for receiving data in ms */
  NTCAN_HANDLE rxhandle; /* can handle returned by canOpen() */
  NTCAN_RESULT retvalue; /* return values of NTCAN API calls */
  uint32_t baud=NTCAN_BAUD_1000; /* configured CAN baudrate */
  int32_t lenRcv;
  CMSG cmsgRcv; 
  uint32_t idCnt = 0x800;

  if (argc != 2){
    printf("Usage: ./interaction on|off|mark \n");
    return 0;
  }

  if (strcmp(argv[1], "on")==0)
  {
    printf("set Interaction ON! \n");
    /*mode flags 0 means NTCAN_MODE_NO_INTERACTION is not set*/
    mode=0; 
  }
  else if (strcmp(argv[1], "off")==0)
  {
    printf("set Interaction OFF! \n");
    /*mode flag NTCAN_MODE_NO_INTERACTION is set*/
    mode=NTCAN_MODE_NO_INTERACTION; 
  }
  else if (strcmp(argv[1], "mark")==0)
  {  
    printf("Mark Interaction messages! \n");
    /*mode flag NTCAN_MODE_MARK_INTERACTION is set*/
    mode=NTCAN_MODE_MARK_INTERACTION;
  }
  else
  {
    printf("Usage: ./interaction on|off|mark \n");
    return 0;
  }
  
/* ############################################################### */
  retvalue = canOpen(net,
                      mode,
                      txqueuesize,
                      rxqueuesize,
                      txtimeout,
                      rxtimeout,
                      &rxhandle);
  if (retvalue != NTCAN_SUCCESS)
  {
    printf("canOpen() failed with error %d!\n", retvalue);
    return(-1);
  }
/* ############################### ################################ */
  retvalue = canSetBaudrate(rxhandle, baud);
  if (retvalue != NTCAN_SUCCESS)
  {
    printf("canSetBaudrate() failed with error %d!\n", retvalue);
    canClose(rxhandle);
    return(-1);
  }
/* ############################################################### */
/* All 11-bit ID CAN messages can be received */
  retvalue = canIdRegionAdd(rxhandle, 0, &idCnt);
  if (retvalue != NTCAN_SUCCESS)
  {
    printf("canIdAdd() failed with error %d!\n", retvalue);
    canClose(rxhandle);
    return(-1);
  }
/* ############################################################### */  
  printf("Send CAN msg with 11-bit ID=0 to Exit Program!\n");
  while(1)
  {
    lenRcv = 1;
    retvalue = canRead(rxhandle, &cmsgRcv, &lenRcv, NULL);
    if (retvalue == NTCAN_RX_TIMEOUT)
    {
      printf("canRead() returned timeout\n");
      continue;
    }
    else if(retvalue != NTCAN_SUCCESS)
    {
      printf("canRead() failed with error %d!\n", retvalue);
    }
    else
    { 
      if(NTCAN_IS_INTERACTION(cmsgRcv.len))
        printf("!!!NTCAN_INTERACTION message!!!\n");   
      printf("Id of received message :%x!\n", cmsgRcv.id);
      if (cmsgRcv.id == 0){
        printf("Exit program!\n");
        break;
      }
      printf("Len of received message :%x!\n", (cmsgRcv.len & 0x0f));
      printf("Rtr of received message :%x!\n", ((cmsgRcv.len & 0x10)>>4));
      for (int i=0;i<(cmsgRcv.len & 0x0f);i++)
        printf("Byte %d of received message :%x!\n", i, cmsgRcv.data[i]);
      printf("\n");
    }
  }  
/* ############################################################### */
  retvalue = canIdRegionDelete(rxhandle, 0 , &idCnt);
  if (retvalue != NTCAN_SUCCESS)
	  printf("canIdRegionDelete() failed with error %d!\n", retvalue);
/* ############################################################### */
  retvalue = canClose (rxhandle);
  if (retvalue != NTCAN_SUCCESS)
	  printf("canClose() failed with error %d!\n", retvalue);
/* ############################################################### */
  return(0);
}