#include <stdio.h>     
#include <string.h>    
#include <unistd.h>    
#include <fcntl.h>     
#include <errno.h>     
#include <time.h>     
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdarg.h>
#include <signal.h>
#include "sys/ioctl.h"
#include "asm/etraxgpio.h" 

int fda=-1;
int fdg=-1;


void led(int value) {
  int iomask;
  int line=3;
  
  if (fda==-1) {
    if ((fda = open("/dev/gpioa", O_RDWR))<0) {
      printf("Open error on /dev/gpioa\n");
      exit(0);
    }
  } 
  iomask = 1 << line;
  if (value==1) ioctl(fda,_IO(ETRAXGPIO_IOCTYPE,IO_CLRBITS),iomask);
  else ioctl(fda,_IO(ETRAXGPIO_IOCTYPE,IO_SETBITS),iomask);
}

int button(void) {
  int value;
  
  if (fda==-1) {
    if ((fda = open("/dev/gpioa", O_RDWR))<0) {
      printf("Open error on /dev/gpioa\n");
      exit(0);
    }
  } 

  value=ioctl(fda,_IO(ETRAXGPIO_IOCTYPE, IO_READBITS));
  if ((value&(1<<1))==0) return 1;
  return 0; 
} 

void flash(int value) {
  int i;
  for (i=0;i<value;i++) {
    led(1);
    usleep(100000);
    led(0);
    usleep(100000);
  }
}

void status(int value) {
  int i;
  while (button()==0) {
    for (i=0;i<value;i++) {
      led(1);
      usleep(100000);
      led(0);
      usleep(100000);
    }
    sleep(1);
  } 
}

int main(int argc, char *argv[]) {
  int rtc=0;
  char cmdString[1024];
  int serial_num;
  char mac_address[30];
  FILE *serial_num_filestream;
  struct tm *ptr;
  time_t tm;
  char timebuffer[50];
  int ping_counter;
  
  printf("Fox test utility v.1.02\n");


  while (1) {
  
    if (button()==1) {
      printf("Flashatura\n");
      sprintf(cmdString,"/mnt/1/etrax100boot --setreg b0000000 000095f8 --setreg b0000004 00000004 --setreg b000000c 09603636 --setreg b0000008 8000c801 --pause 20000 --setreg b0000008 8000ce01 --setreg b0000008 8000c801 --setreg +0 7 --label label1 --setreg b0000008 8000cc01 --setreg b0000008 8000c801 --loop +0 label1 --setreg b0000008 8020ca01 --setreg b0000008 8000c801 --setreg b0000008 80008002 --setreg b0000030 00001cf0 --setreg b0000038 0000ce03 --file %s c0004000 --flash c0004000 0 400000 --jump 0","/mnt/1/fimage");
      system(cmdString);

      //---------------------------------
      // Test ping
      //---------------------------------

      printf("Ping to 192.168.0.90\n");
      sprintf(cmdString,"ping 192.168.0.90");
      ping_counter=0;
      while (1) {
        flash(1);

        rtc=system(cmdString);
        if (rtc==256) {
          ping_counter++;
          if (ping_counter==4) {
            status(1);
            break;
          } 
        } 
        if (rtc==0) break;
      }  
      if (ping_counter==4) continue;
      printf("Success\n\n");

      //---------------------------------
      // Test chiave USB 1
      //---------------------------------

      printf("USB KEY 1 Mounting\n");
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 mount -t vfat /dev/sda1 /mnt/1");
      flash(2);
      rtc=system(cmdString);
      if (rtc==256) {
        status(2);
        continue;
      } 
      printf("Success\n\n");

      printf("USB KEY 1 Read file\n");
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 cp /mnt/1/data.txt /var/data1.txt");
      flash(2);
      rtc=system(cmdString);
      if (rtc==256) {
        status(2);
        continue;
      } 
      printf("Success\n\n");

      printf("USB KEY 1 Verify \n");
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 cat /var/data1.txt");
      flash(2);
      rtc=system(cmdString);
      if (rtc==256) {
        status(2);
        continue;
      } 
      printf("Success\n\n");


      //---------------------------------
      // Test chiave USB 2
      //---------------------------------

      printf("USB KEY 2 Mounting\n");
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 mount -t vfat /dev/sdb1 /mnt/2");
      flash(3);
      rtc=system(cmdString);
      if (rtc==256) {
        status(3);
        continue;
      } 
      printf("Success\n\n");

      printf("USB KEY 2 Read file\n");
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 cp /mnt/2/data.txt /var/data2.txt");
      flash(3);
      rtc=system(cmdString);
      if (rtc==256) {
        status(3);
        continue;
      } 
      printf("Success\n\n");

      printf("USB KEY 2 Verify \n");
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 cat /var/data2.txt");
      flash(3);
      rtc=system(cmdString);
      if (rtc==256) {
        status(3);
        continue;
      } 
      printf("Success\n\n");

      //---------------------------------
      // Serializzazione
      //---------------------------------

      if ((serial_num_filestream=fopen("/mnt/1/serial_num","r"))==NULL) {
        status(10);
        continue;
      } 
      fscanf(serial_num_filestream,"%d",&serial_num);
      fclose(serial_num_filestream);
      
      serial_num++;
      sprintf(mac_address,"00408C%06d",serial_num);

      printf("Setting MAC address to: %s\n",mac_address);
      sprintf(cmdString,"ssh -i /mnt/1/identity 192.168.0.90 bootblocktool -a SERNO %s",mac_address);
      flash(4);
      rtc=system(cmdString);
      if (rtc==256) {
        status(4);
        continue;
      } 
      printf("Success\n\n");


      //---------------------------------
      // Salva il numero seriale
      //---------------------------------

      printf("Saving MAC address to: %s\n",mac_address);
      if ((serial_num_filestream=fopen("/mnt/1/serial_num","w"))==NULL) {
        status(11);
        continue;
      } 
      fprintf(serial_num_filestream,"%06d",serial_num);
      fclose(serial_num_filestream);
      
      //---------------------------------
      // Aggiorna il file di log
      //---------------------------------
      
      printf("Update log file\n");
      if ((serial_num_filestream=fopen("/mnt/1/serial_log","a"))==NULL) {
        status(12);
        continue;
      } 

      tm = time(NULL);
      ptr = localtime(&tm);
      strftime(timebuffer,100,"%d/%m/%Y %T",ptr); 
      printf("%s\n",timebuffer);

      fprintf(serial_num_filestream,"%s %06d\n ",timebuffer,serial_num);
      fclose(serial_num_filestream);
      
      system("sync");

      led(1);
      while (button());
    }

  }

  return EXIT_SUCCESS;
}

     
