/**
 *	@sn int SendData(char *data, int data_len)
 *	@brief the data is formated to transmition protocol STR + DATA LENGTH(2 bytes) + DATA(LLVAR) + ETX + LRC(STR...ETX)
 *	end sent at the end.
 *	@param data : the data to be transmited
 *	@param data_len : the length of the data to be transmited
 *	@return @li FAIL
 *		 @li SUCC
 *	@sa 
 */
int SendData(char *data, int data_len)
{
	char buffer[PACK_BUF_LEN];

	if((data_len < 0) || (data_len > (PACK_BUF_LEN - 5)))
	{
		return FAIL;
	}
	memset(buffer, 0, sizeof(buffer));
	//pack the data phase
	//add
	buffer[0] = TLVP_STX;
	// Add data length
	buffer[1] = ByteToBcd(data_len/100);
	buffer[2] = ByteToBcd(data_len%100);
	//Add data
	memcpy(&buffer[3], data, data_len);
	//Add ETC
	buffer[3 + data_len] = TLVP_ETX;
	//Add LRC
	buffer[4 + data_len] = LRC(buffer, 4 + data_len);
	if(portwrite(AUX1, 5 + data_len, buffer) != SUCC)
	{
		return FAIL;
	}
	return SUCC;
}
/*
 *	@sn int ReceiveData(char * data,int * data_len)
 *	@brief receive data and peel off the ransmition protocol
 *	@param data : store the received data 
 *	@param data_len : store the length of the data
 *	@return @li FAIL
 *		 @li SUCC
 *	@sa 
 */
int ReceiveData(char * data, int * data_len)
{
	int dataLen = 0, received_len = 0;
	char buffer[PACK_BUF_LEN];
	
	memset(buffer, 0, sizeof(buffer));
	//read STX
	if(portread(AUX1, 1, buffer, TLVP_TIMEOUT) != 1)
	{
		return FAIL;
	}	
	if(buffer[0] != TLVP_STX)
	{
		return FAIL;
	}
	received_len += 1;
	//read DATA_LEN
	if((portread(AUX1, 2, &buffer[received_len], TLVP_TIMEOUT) != 2))
	{
		return FAIL;
	}
	dataLen = 100*BcdToByte(buffer[1]) + BcdToByte(buffer[2]);
	if((dataLen < 0) || (dataLen > (PACK_BUF_LEN - 5)))
	{
		return FAIL;
	}
	received_len += 2;
	//read DATA
	if(portread(AUX1, dataLen, &buffer[received_len], TLVP_TIMEOUT) != dataLen)
	{
		return FAIL; 
	}
	received_len += dataLen;
	//read ETX
	if(portread(AUX1, 1, &buffer[received_len], TLVP_TIMEOUT) != 1)
	{
		return FAIL;
	}
	if(buffer[received_len] != TLVP_ETX)
	{
		return FAIL;
	}
	received_len += 1;
	//read LRC
	if(portread(AUX1, 1, &buffer[received_len], TLVP_TIMEOUT) != 1)
	{
		return FAIL;
	}
	if(buffer[received_len] != LRC(buffer, received_len))//check LRC
	{
		return FAIL;
	}
	received_len += 1;
	
	memcpy(data,  &buffer[3], dataLen);
	*data_len = dataLen;
	
	return SUCC;
}
int main(int argc, char *argv[]){

  unsigned char  addr, fc, data[256], crc[2];
  int datalen;
  char inport[100], outport[100];
  int i, j, len, err;
  int port;
  struct modbus_pdu *pdu;
  int cnt1, cnt2;

  strcpy(inport,"/dev/ttyUSB2");
  strcpy(outport,"/dev/ttyUSB0");

   for (i=1;i<argc;i++) {
    if (strcmp(argv[i], "-inport") == 0) {
      len = strlen(argv[i+1]);
      if (len > 100) {
         printf("Error: Port name must be less then 100 characters long.\n");
         return(-1);
      };
      strncpy(inport, argv[i+1],len);
      i++;
      printf("INFO: Input port = %s\n", inport);
    } else if (strcmp(argv[i], "-outport") == 0) {
      len = strlen(argv[i+1]);
      if (len > 100) {
         printf("Error: Port name must be less then 100 characters long.\n");
         return(-1);
      }
      strncpy(outport, argv[i+1],len);
      i++;
    } else {
      printf("ERROR: Illegal argument (%s)\n", argv[i]);
      printf("Usage: %s -inport /dev/ttyXX -outport /dev/ttyYY\n", argv[0]);
      return (-1);
    }
  }

 port = openport(outport);
  if (port < 0) {
   return (port);
  }
  printf("open %s ok port = %d\n", outport, port);
  
  char *str;
  unsigned char lrc, top, bottom;

  addr = (unsigned char) 0x04;
  fc = (unsigned char) 0x03;
  int cnt = 1;
  while(1){
  for(cnt1=0x48; cnt1<0xff; cnt1++){
   for(cnt2=0xbf; cnt2<0xff; cnt2++){
    datalen = 19;
    data[0] = 0x12;
    data[1] = 0x10;
    data[2] = 0x00;
    data[3] = 0x0e;
    data[4] = 0x00;
    data[5] = 0x0c;
    data[6] = 0x4c;
    data[7] = 0x00;
    data[8] = 0x00;
    data[9] = 0x00;
    data[10] = 0x00;
    data[11] = 0x00;
    data[12] = 0x00;
    data[13] = 0x00;
    data[14] = 0x00;
    data[15] = cnt2;

    data[16] = cnt1;
    data[17] = 0x00;
    data[18] = 0x00; 
 
    str = malloc(datalen + 2);
    str[0] = addr;
    str[1] = fc;
    memcpy(str+2, data, datalen);   
    lrc = LRC(str,datalen+2);
    free(str);    
    byte2ascii(lrc, &top, &bottom);
    //crc[0] = 0x34;
    // crc[1] = 0x39;
    crc[0] = top;
    crc[1] = bottom;
    pdu = mkpdu(addr, fc, data, datalen, crc);
    sendmodbus_ascii(port, pdu);
    freepdu(pdu);
    printf("number is %d\n", cnt++);
    sleep(1);

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

  unsigned char addr, fc, data[256], crc[2];
  int datalen;
  char inport[100], outport[100];
  int i, j, len, err;
  int port;
  struct modbus_pdu *pdu;
  int cnt1 = 0, cnt2 = 0x0, cnt;
  
  strcpy(inport, "/dev/ttyUSB2");
  strcpy(outport, "/dev/ttyUSB0");
  
  for(i=1; i<argc; i++){
    if(strcmp(argv[i], "-inport") == 0){
      len = strlen(argv[i+1]);
      if(len > 100){
        printf("Error: Port name must be less than 100 characters long.\n");
        return(-1);
      }
      strncpy(inport, argv[i+1], len);
      i++;
      printf("INFO: Input port = %s\n", inport);
    } else if(strcmp(argv[i], "-outport") == 0){
      len = strlen(argv[i+1]);
      if(len > 100){
        printf("Error: Port name must be less than 100 characters long.\n");
        return(-1);
      }
      strncpy(outport, argv[i+1],len);
      i++;      
    }else{
      printf("ERROR: Illegal arguments (%s)\n", argv[i]);
      printf("Usage: %s -inport /dev/ttyXX -outport /dev/ttyYY\n", argv[0]);
      return (-1);
    }
  }
   
  port = openport(outport);
  if(port < 0)
    return (port);
  printf("open %s ok port = %d\n", outport, port);
  
  char *str;
  unsigned char lrc, top, bottom;
  addr = (unsigned char) 0x4; 

  //fc =0x01 read coil,
  while(1){

   cnt1 = 0;
  for(cnt1=0; cnt1<100; cnt1++){
  fc = (unsigned char) 0x01;
  datalen = 19;
  data[0] = 0x00;
  data[1] = 0x00;
  data[2] = 0x00;
  data[3] = 0x00;
  data[4] = 0x00;
  data[5] = 0x00;
  data[6] = 0x00;
  data[7] = 0x00;
  data[8] = 0x00;
  data[9] = 0x00;
  data[10] = 0x00;
  data[11] = 0x00;
  data[12] = 0x00;
  data[13] = 0x00;
  data[14] = 0x00;
  data[15] = 0x00;
  data[16] = 0x00;
  data[17] = 0x00;
  data[18] = 0x00;


  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);     
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;
  
  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt1);
  sleep(1);
  }

   for(cnt1=0; cnt1<100; cnt1++){
  fc = (unsigned char) 0x01;
  datalen = 19;
  data[0] = 0xff;
  data[1] = 0xff;
  data[2] = 0xff;
  data[3] = 0xff;
  data[4] = 0xff;
  data[5] = 0xff;
  data[6] = 0xff;
  data[7] = 0xff;
  data[8] = 0xff;
  data[9] = 0xff;
  data[10] = 0xff;
  data[11] = 0xff;
  data[12] = 0xff;
  data[13] = 0xff;
  data[14] = 0xff;
  data[15] = 0xff;
  data[16] = 0xff;
  data[17] = 0xff;
  data[18] = 0xff;
   str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt1);
  sleep(1);
  }
 
  //fc = 0x02 Read Discrete Inputs, not implement excode = 01
  fc = (unsigned char)0x02;
  for(cnt1=0; cnt1<100; cnt1++){
   datalen = 19;
  data[0] = 0x00;
  data[1] = 0x00;
  data[2] = 0x00;
  data[3] = 0x00;
  data[4] = 0x00;
  data[5] = 0x00;
  data[6] = 0x00;
  data[7] = 0x00;
  data[8] = 0x00;
  data[9] = 0x00;
  data[10] = 0x00;
  data[11] = 0x00;
  data[12] = 0x00;
  data[13] = 0x00;
  data[14] = 0x00;
  data[15] = 0x00;
  data[16] = 0x00;
  data[17] = 0x00;
  data[18] = 0x00;
 
  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;
  
  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt);
  sleep(1);
  }

  for(cnt1=0; cnt1<100; cnt1++){
  fc = (unsigned char) 0x02;
  datalen = 19;
  data[0] = 0xff;
  data[1] = 0xff;
  data[2] = 0xff;
  data[3] = 0xff;
  data[4] = 0xff;
  data[5] = 0xff;
  data[6] = 0xff;
  data[7] = 0xff;
  data[8] = 0xff;
  data[9] = 0xff;
  data[10] = 0xff;
  data[11] = 0xff;
  data[12] = 0xff;
  data[13] = 0xff;
  data[14] = 0xff;
  data[15] = 0xff;
  data[16] = 0xff;
  data[17] = 0xff;
  data[18] = 0xff;
  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt1);
  sleep(1);
  }

  //fc = 0x03 Read Holding Registers, not implement excode = 01
  fc = 0x03;
  for(cnt1=0; cnt1<100; cnt1++){
  datalen = 19;
  data[0] = 0x00;
  data[1] = 0x00;
  data[2] = 0x00;
  data[3] = 0x00;
  data[4] = 0x00;
  data[5] = 0x00;
  data[6] = 0x00;
  data[7] = 0x00;
  data[8] = 0x00;
  data[9] = 0x00;
  data[10] = 0x00;
  data[11] = 0x00;
  data[12] = 0x00;
  data[13] = 0x00;
  data[14] = 0x00;
  data[15] = 0x00;
  data[16] = 0x00;
  data[17] = 0x00;
  data[18] = 0x00;

  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;
  
  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("numb is %d\n", cnt1);
  sleep(1);
  }

  for(cnt1=0; cnt1<100; cnt1++){
  fc = (unsigned char) 0x03;
  datalen = 19;
  data[0] = 0xff;
  data[1] = 0xff;
  data[2] = 0xff;
  data[3] = 0xff;
  data[4] = 0xff;
  data[5] = 0xff;
  data[6] = 0xff;
  data[7] = 0xff;
  data[8] = 0xff;
  data[9] = 0xff;
  data[10] = 0xff;
  data[11] = 0xff;
  data[12] = 0xff;
  data[13] = 0xff;
  data[14] = 0xff;
  data[15] = 0xff;
  data[16] = 0xff;
  data[17] = 0xff;
  data[18] = 0xff;
  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt1);
  sleep(1);
  }

  //fc = 0x04 Read Input Registers, not implement excode = 01
  fc = 0x04;
  for(cnt1=0; cnt1<100; cnt1++){
  len = 19;
  data[0] = 0x00;
  data[1] = 0x00;
  data[2] = 0x00;
  data[3] = 0x00;
  data[4] = 0x00;
  data[5] = 0x00;
  data[6] = 0x00;
  data[7] = 0x00;
  data[8] = 0x00;
  data[9] = 0x00;
  data[10] = 0x00;
  data[11] = 0x00;
  data[12] = 0x00;
  data[13] = 0x00;
  data[14] = 0x00;
  data[15] = 0x00;
  data[16] = 0x00;
  data[17] = 0x00;
  data[18] = 0x00;

  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);

  freepdu(pdu);
  printf("number is %d\n", cnt1);
  sleep(1);
  }
  
   for(cnt1=0; cnt1<100; cnt1++){
  fc = (unsigned char) 0x04;
  datalen = 19;
  data[0] = 0xff;
  data[1] = 0xff;
  data[2] = 0xff;
  data[3] = 0xff;
  data[4] = 0xff;
  data[5] = 0xff;
  data[6] = 0xff;
  data[7] = 0xff;
  data[8] = 0xff;
  data[9] = 0xff;
  data[10] = 0xff;
  data[11] = 0xff;
  data[12] = 0xff;
  data[13] = 0xff;
  data[14] = 0xff;
  data[15] = 0xff;
  data[16] = 0xff;
  data[17] = 0xff;
  data[18] = 0xff;
  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);

  freepdu(pdu);
  printf("number is %d\n", cnt1);
  sleep(1);
  }

  //fc = 0x18, read FIFO
  fc = 0x18;
  for(cnt1=0; cnt1<100; cnt1++){
  len = 19;
  data[0] = 0x00;
  data[1] = 0x00;
  data[2] = 0x00;
  data[3] = 0x00;
  data[4] = 0x00;
  data[5] = 0x00;
  data[6] = 0x00;
  data[7] = 0x00;
  data[8] = 0x00;
  data[9] = 0x00;
  data[10] = 0x00;
  data[11] = 0x00;
  data[12] = 0x00;
  data[13] = 0x00;
  data[14] = 0x00;
  data[15] = 0x00;
  data[16] = 0x00;
  data[17] = 0x00;
  data[18] = 0x00;

  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt1++);
  sleep(1);
  } 

   for(cnt1=0; cnt1<100; cnt1++){
  fc = (unsigned char) 0x18;
  datalen = 19;
  data[0] = 0xff;
  data[1] = 0xff;
  data[2] = 0xff;
  data[3] = 0xff;
  data[4] = 0xff;
  data[5] = 0xff;
  data[6] = 0xff;
  data[7] = 0xff;
  data[8] = 0xff;
  data[9] = 0xff;
  data[10] = 0xff;
  data[11] = 0xff;
  data[12] = 0xff;
  data[13] = 0xff;
  data[14] = 0xff;
  data[15] = 0xff;
  data[16] = 0xff;
  data[17] = 0xff;
  data[18] = 0xff;

  str = malloc(datalen+2);
  str[0] = addr;
  str[1] = fc;
  memcpy(str+2, data, datalen);
  lrc = LRC(str, datalen+2);
  free(str);
  byte2ascii(lrc, &top, &bottom);
  crc[0] = top;
  crc[1] = bottom;

  pdu = mkpdu(addr, fc, data, datalen, crc);
  sendmodbus_ascii(port, pdu);
  freepdu(pdu);
  printf("number is %d\n", cnt1++);
  sleep(1);
  }
 }
}
int main(int argc, char *argv[]){

  unsigned char  addr, fc, data[256], crc[2];
  int datalen;
  char inport[100], outport[100];
  int i, j, len, err;
  int port;
  struct modbus_pdu *pdu;
  int cnt = 0x0;
  int id = 0x0;

  strcpy(inport,"/dev/ttyUSB0");
  strcpy(outport,"/dev/ttyUSB2");

   for (i=1;i<argc;i++) {
    if (strcmp(argv[i], "-inport") == 0) {
      len = strlen(argv[i+1]);
      if (len > 100) {
         printf("Error: Port name must be less then 100 characters long.\n");
         return(-1);
      };
      strncpy(inport, argv[i+1],len);
      i++;
      printf("INFO: Input port = %s\n", inport);
    } else if (strcmp(argv[i], "-outport") == 0) {
      len = strlen(argv[i+1]);
      if (len > 100) {
         printf("Error: Port name must be less then 100 characters long.\n");
         return(-1);
      }
      strncpy(outport, argv[i+1],len);
      i++;
    } else {
      printf("ERROR: Illegal argument (%s)\n", argv[i]);
      printf("Usage: %s -inport /dev/ttyXX -outport /dev/ttyYY\n", argv[0]);
      return (-1);
    }
  }

 port = openport(outport);
  if (port < 0) {
   return (port);
  }
  printf("open %s ok port = %d\n", outport, port);
  
  char *str;
  unsigned char lrc, top, bottom;
  while(1){
  for(cnt=0x01; cnt<=0x04; cnt++){
   for(id=0x00; id<=0xff; id++){
    addr = (unsigned char) 0x07;
    fc = (unsigned char) 0x2b;
    datalen = 3;
    data[0] = 0x0e;  //MEI type
    data[1] = cnt;   // ID code
    data[2] = id;  //object ID
  
    str = malloc(datalen + 2);
    str[0] = addr;
    str[1] = fc;
    memcpy(str+2, data, datalen);   
    lrc = LRC(str,datalen+2);
    free(str);    
    byte2ascii(lrc, &top, &bottom);
    crc[0] = top;
    crc[1] = bottom;
  
    pdu = mkpdu(addr, fc, data, datalen, crc);
    sendmodbus_ascii(port, pdu);
    freepdu(pdu);
    printf("number is %d\n", cnt);
    sleep(4);
   }
  }
 }
  
}