//
// csc /t:winexe /addmodule:ccusb.netmodule,w32device.netmodule swsend.cs
// or
// csc /t:winexe swsend.cs ccusb.cs /unsafe w32device.cs
//

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Threading;

public class SWSend : Form
{

  static Button getbutton = new Button();
  static TextBox devnam = new TextBox();
  static TextBox idnam = new TextBox();
  static TextBox waitarea = new TextBox();
  static TextBox evntarea = new TextBox();
  static TextBox dataarea = new TextBox();
  static TextBox stnumber = new TextBox();
  static TextBox datestrt = new TextBox();
  static TextBox datearea = new TextBox();
  static CCUSB ccusb = new CCUSB();

  static bool runit = false;
  static int numevent = 0;
  static int swn = 2;
  static int waittime = 0;

  Thread tdate = null;
  Thread tdaq = null;

  public SWSend()
  {
    Text = "CC/7700 USB Switch Register";
    Size = new Size(320, 240);

    // DeviceName
    Panel devline = new Panel();
    devline.Dock = DockStyle.Top;
    devline.Size = new Size(320, 24);

    devnam.Text = @"5&27ff6fc&0&1";
    devnam.Dock = DockStyle.Fill;
    devnam.TabStop = true;
    devnam.TabIndex = 1;
    devline.Controls.Add( devnam );

    TextBox devlabel = new TextBox();
    devlabel.Text = @"Device Name";
    devlabel.Dock = DockStyle.Left;
    devlabel.ReadOnly = true;
    devlabel.TabStop = false;
    devline.Controls.Add( devlabel );

    // Station Number
    Panel stnline = new Panel();
    stnline.Dock = DockStyle.Top;
    stnline.Size = new Size(320, 24);

    stnumber.Text = swn.ToString();
    stnumber.Dock = DockStyle.Fill;
    stnumber.TabStop = true;
    stnumber.TabIndex = 2;
    stnline.Controls.Add( stnumber );

    TextBox stnlabel = new TextBox();
    stnlabel.Text = @"Station Number";
    stnlabel.Dock = DockStyle.Left;
    stnlabel.ReadOnly = true;
    stnlabel.TabStop = false;
    stnline.Controls.Add( stnlabel );

    // Wait (Sleep) time
    Panel waitline = new Panel();
    waitline.Dock = DockStyle.Top;
    waitline.Size = new Size(320, 24);

    waitarea.Text = waittime.ToString();
    waitarea.Dock = DockStyle.Fill;
    waitarea.TabStop = true;
    waitarea.TabIndex = 3;
    waitline.Controls.Add( waitarea );

    TextBox waitlabel = new TextBox();
    waitlabel.Text = @"Sleep Time(msec)";
    waitlabel.Dock = DockStyle.Left;
    waitlabel.ReadOnly = true;
    waitlabel.TabStop = false;
    waitline.Controls.Add( waitlabel );

    // DeviceId
    Panel idline = new Panel();
    idline.Dock = DockStyle.Top;
    idline.Size = new Size(320, 24);

    idnam.Dock = DockStyle.Fill;
    idnam.ReadOnly = true;
    idnam.TabStop = false;
    idline.Controls.Add( idnam );

    TextBox idlabel = new TextBox();
    idlabel.Text = @"Adapter ID";
    idlabel.Dock = DockStyle.Left;
    idlabel.ReadOnly = true;
    idlabel.TabStop = false;
    idline.Controls.Add( idlabel );

    // Number of Events Line
    Panel evntline = new Panel();
    evntline.Dock = DockStyle.Top;
    evntline.Size = new Size(320, 24);

    evntarea.Dock = DockStyle.Fill;
    evntarea.Text = numevent.ToString();
    evntarea.ReadOnly = true;
    evntarea.TabStop = false;
    evntline.Controls.Add( evntarea );

    TextBox evntlabel = new TextBox();
    evntlabel.Text = @"Number of Events";
    evntlabel.Dock = DockStyle.Left;
    evntlabel.ReadOnly = true;
    evntlabel.TabStop = false;
    evntline.Controls.Add( evntlabel );

    // Data Line
    Panel dataline = new Panel();
    dataline.Dock = DockStyle.Top;
    dataline.Size = new Size(320, 24);

    dataarea.Dock = DockStyle.Fill;
    dataarea.ReadOnly = true;
    dataarea.TabStop = false;
    dataline.Controls.Add( dataarea );

    TextBox datalabel = new TextBox();
    datalabel.Text = @"Data";
    datalabel.Dock = DockStyle.Left;
    datalabel.ReadOnly = true;
    datalabel.TabStop = false;
    dataline.Controls.Add( datalabel );

    // Start Line
    Panel strline = new Panel();
    strline.Dock = DockStyle.Bottom;
    strline.Size = new Size(320, 24);
    

    // Start Date
    datestrt.Dock = DockStyle.Left;
    datestrt.Size = new Size(160,24);
    datestrt.ReadOnly = true;
    datestrt.TabStop = false;
    strline.Controls.Add( datestrt );

    // Bottom Line
    Panel btmline = new Panel();
    btmline.Dock = DockStyle.Bottom;
    btmline.Size = new Size(320, 24);

    // Button
    getbutton.Text = @"ŠJŽn";
    getbutton.Dock = DockStyle.Right;
    getbutton.Size = new Size(80, 24);
    getbutton.TabStop = true;
    getbutton.TabIndex = 0;
    getbutton.Click += new System.EventHandler(getbuttonClick);
    btmline.Controls.Add( getbutton );

    // Date and Time
    datearea.Dock = DockStyle.Left;
    datearea.Size = new Size(160,24);
    datearea.ReadOnly = true;
    datearea.TabStop = false;
    btmline.Controls.Add( datearea );

    Controls.AddRange(
      new Control[]
       {strline, btmline, dataline, evntline, idline, waitline, stnline, devline});

  }

  protected override void OnClosing(CancelEventArgs e)
  {
    runit = false;
    if( tdaq != null )
      tdaq.Abort();
    if( tdate != null )
      tdate.Abort();
    ccusb.Close();
    base.OnClosing(e);
  }

  public static void Main()
  {
    Application.Run(new SWSend());
  }

  public static void ShowNow()
  {
    DateTime datenow;
    while( runit )
    {
      datenow = DateTime.Now;
      datearea.Text = datenow.ToString();
      datearea.Invalidate();
      Thread.Sleep(200);
    }
  }

  public static void RunDAQ()
  {
    int d;
    int d24;

    while( runit )
    {
      d = ccusb.NAF(swn,0,8);   // Test LAM
      Thread.Sleep(waittime);

      ccusb.NAF(swn,0,24);  // Disable LAM
      d = ccusb.NAF(swn,1,0);
      d24 = (numevent & 0x00ffffff);
      ccusb.NAF(swn,0,16,d24);
      ccusb.NAF(swn,0,10);  // Clear LAM
      ccusb.NAF(swn,0,26);  // Enable LAM
      numevent += 1;
      dataarea.Text = d.ToString();
      dataarea.Invalidate();
      evntarea.Text = numevent.ToString();
      evntarea.Invalidate();
    }
  }

  private void getbuttonClick(object sender, EventArgs evArgs)
  {
    if( !runit )
    {
      ccusb.Open( devnam.Text );
      swn = int.Parse( stnumber.Text );
      waittime = int.Parse( waitarea.Text );

      tdate = new Thread(new ThreadStart(ShowNow));
      tdaq = new Thread(new ThreadStart(RunDAQ));

      Byte bId = ccusb.GetId();
      idnam.Text = bId.ToString();
      idnam.Invalidate();
      numevent = 0;
      ccusb.Z();
      ccusb.C();
      ccusb.NAF(swn,0,10);  // Clear LAM
      ccusb.NAF(swn,0,26);  // Enable LAM
      DateTime strtdate = DateTime.Now;
      datestrt.Text = strtdate.ToString();
      datestrt.Invalidate();
      runit = true;
      tdate.Start();
      tdaq.Start();
      getbutton.Text = @"’âŽ~";
    }
    else
    {
      runit = false;
      if( tdaq != null )
        tdaq.Abort();
      if( tdate != null )
        tdate.Abort();
      getbutton.Text = @"ŠJŽn";
    }
  }
}