#include <aspoutil.h>
#include <aspoprotocol.h>
#include <stdlib.h>
#include <unistd.h>

#define LOG_BUFSZ 200
const size_t log_bufsz = LOG_BUFSZ;
char log_buffer[LOG_BUFSZ];

#define TIME 200000

uint8_t req[S6400_MAXREQLEN];
#define RESSZ 10000
uint8_t res[RESSZ];
#define OLEN 1000
char obuf[OLEN];
struct termios ttysave;


static void Usage(void) {
  printf("Usage:\n"
	 "\tTestreader [serial port] [mode] [cmd] [serial] [uid] [data]\n"
	 );
  exit(1);
}

int main(int argc, char *argv[]) {
  int val;
  char *dev;
  char *end = obuf;
  size_t olen = OLEN;
  int blanks[] = { 6, -2, 0 };
  int fd = -1;
  int flag = 0;
  struct openraw_t opts = { 8, 0, 1, 1, 0, };

  log_open(NULL, LOG_PRIO | 2, 0);
  if (argc < 7) Usage();
  dev = argv[1];
  /* remove first two args: this programs name and serial port */
  argc -= 2;
  argv += 2;

  val = s6400_strcmd(req, S6400_MAXREQLEN, argc, argv);

  val = byte2hex(&end, &olen, req, S6400_PACKETLENGTH(req), blanks, 0);
  printf("req <%s>\n", obuf);

  LOG_VIF( (fd = tty_openraw(&ttysave, dev, B38400, &opts)) < 0, LOG_ERR, " dev = %s fd = %d", dev, fd ) return 1;

  /*--- */
  write(fd, req, S6400_PACKETLENGTH(req));

  usleep(TIME);
  while(flag < 2) {
    val = read(fd, res, RESSZ);
    if (val < 1) {
      flag++;
      sleep(1);
      continue;
    }
    flag = 0;
    end = obuf;
    olen = OLEN;
    (void) byte2hex(&end, &olen, res, val, blanks, 0);
    printf("res <%s>\n", obuf);
    if (s6400_validate(res, RESSZ) == 0) {
      
      break;
    }
  }
  /*--- */

  LOG_VIF( tty_close(fd, &ttysave, dev, getpid()) < 0, LOG_ERR, " dev = %s fd = %d", dev, fd ) return 1;
  return 0;
}
