using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
  class Program
  {
    static void usage()
    {
      string execname = System.AppDomain.CurrentDomain.FriendlyName;
      Console.WriteLine(execname + " <serial_number> ");
      Console.WriteLine(execname + " <logical_name>");
      Console.WriteLine(execname + "  any ");
      System.Threading.Thread.Sleep(2500);
      Environment.Exit(0);
    }

    static void Main(string[] args)
    {
      string errmsg = "";
      string target;
      YFiles files;


      if (args.Length < 1) usage();

      target = args[0].ToUpper();

      // API init
      if (YAPI.RegisterHub("usb", ref errmsg) != YAPI.SUCCESS) {
        Console.WriteLine("RegisterHub error: " + errmsg);
        Environment.Exit(0);
      }

      // find the display according to command line parameters
      if (target == "ANY") {
        files = YFiles.FirstFiles();
        if (files == null) {
          Console.WriteLine("No module with files features  (check USB cable) ");
          Environment.Exit(0);
        }
      } else files = YFiles.FindFiles(target + ".files");


      if (!files.isOnline()) {
        Console.WriteLine("No module with files connected (check identification and USB cable) ");
        Environment.Exit(0);
      }

      Console.WriteLine();
      Console.WriteLine("Using " + files.get_friendlyName());
      Console.WriteLine();

      byte[] binaryData;

      // create text files and upload them to the device
      for (int i = 1 ; i <= 5; i++) {
        string contents = "This is file " + i;

        // convert the string to binary data
        binaryData = Encoding.ASCII.GetBytes(contents);
        // upload the file to the device
        files.upload("file" + i + ".txt", binaryData );

      }

      // list files found on the device
      Console.WriteLine("Files on device:");
      List<YFileRecord>   filelist = files.get_list("*");
      for (int i = 0 ; i < filelist.Count(); i++) {
        string filename = filelist[i].get_name();
        Console.Write(filename);
        Console.Write(new string(' ', 40 - filename.Length)); // align
        Console.Write(filelist[i].get_crc().ToString("X"));
        Console.Write("    ");
        Console.WriteLine(filelist[i].get_size() + " bytes");
      }

      //download a file
      binaryData = files.download("file1.txt");

      // convert to string
      string st = System.Text.Encoding.Default.GetString(binaryData);


      // and display
      Console.WriteLine("");
      Console.WriteLine("contents of file1.txt:");
      Console.WriteLine(st);

    }
  }
}
