using System; using System.IO; using System.Runtime.InteropServices; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using pac8014WNet; namespace pac_i8014W_MagicScan { public partial class Form1 : Form { [System.Runtime.InteropServices.DllImport("coredll.dll")] private static extern UInt32 GetTickCount(); [System.Runtime.InteropServices.DllImport("coredll.dll")] private static extern uint GetModuleFileName(IntPtr hModule, System.Text.StringBuilder lpFileName, int nSize); private static Int16 MAX_FIFO = 4096; private static Int16 slotIndex = 0, jumper = 0, maxCh = 8; Int16[] chArr = new Int16[16]; Int16[] gainArr = new Int16[16]; Int16 scanChCount; UInt32 T1, T2; float sampleRate, realsampleRate = 0; short scanMode, triggerSource, triggerState; short[] hexData = new short[8192]; Int16 totalScanned = 0; string[] GainStr = { "+/-10V", "+/-5V", "+/-2.5V", "+/-1.25V", "+/-20mA" }; string[] ModeStr = { "M1:Standard ", "M2:Sample and Hold " }; string[] SourceStr = { "Software Command", "Internal Interrupt Signal", "External Trigger Signal" }; string[] StateStr = { "High", "Low" }; int runFlag = 1; UInt32 IntCnt = 0; bool ConfigFlag = false; Int16 TargetCnt; public Form1() { InitializeComponent(); } private string GetAppPath() { string csTemp = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; return System.IO.Path.GetDirectoryName(csTemp); } private void Form1_Load(object sender, EventArgs e) { int i; ComboBox[] cboType = { cboType0, cboType1, cboType2, cboType3, cboType4, cboType5, cboType6, cboType7, cboType8, cboType9, cboType10, cboType11, cboType12, cboType13, cboType14, cboType15 }; ComboBox[] cboChArray = { cboChArr0, cboChArr1, cboChArr2, cboChArr3, cboChArr4, cboChArr5, cboChArr6, cboChArr7, cboChArr8, cboChArr9, cboChArr10, cboChArr11, cboChArr12, cboChArr13, cboChArr14, cboChArr15 }; cboChCnt.SelectedIndex = 0; cboScanMode.SelectedIndex = 0; cboTrigSrc.SelectedIndex = 0; cboTrigState.SelectedIndex = 0; for (i = 0; i < 16; i++) { cboType[i].SelectedIndex = 0; cboChArray[i].SelectedIndex = 0; } } private void ShowAI() { int i; float calibratedAI = 0; lstData.Items.Clear(); //Console.Write("Start to Print all data:\n\n\r"); for (i = 0; i < totalScanned; i++) { pac8014W.CalibrateData(slotIndex, gainArr[i % scanChCount], hexData[i], ref calibratedAI); lstData.Items.Add(String.Format("CH[{0}]= {1}", chArr[i % scanChCount], calibratedAI)); } } private void btnExit_Click(object sender, EventArgs e) { Application.Exit(); } private void ISRFun(int slot) { short ret; Int16[] buf = new Int16[4096]; short readFromFIFO = 0; IntCnt++; ret = pac8014W.ReadFIFO((Int16)slot, buf, (Int16)(TargetCnt - totalScanned), ref readFromFIFO);// <=== get data from FIFO ,long* dataCnt if (ret == (Int16)ErrorCode.FIFO_LATCHED) { pac8014W.UnInstallMagicScanISR((Int16)slot); } if (readFromFIFO > 0) { for (int i = 0; i < readFromFIFO; i++) hexData[totalScanned + i] = buf[i]; totalScanned += readFromFIFO; if (totalScanned >= TargetCnt) { pac8014W.UnInstallMagicScanISR((Int16)slot); } } pac8014W.ClearInt((Int16)slot); } private void timer1_Tick(object sender, EventArgs e) { T2 = GetTickCount() - T1; txtTicks.Text = T2.ToString(); txtDataCnt.Text = totalScanned.ToString(); if (totalScanned >= TargetCnt) { pac8014W.StopMagicScan(slotIndex); lstMsg.Items.Add("Magic Scan Stopped"); timer1.Enabled = false; } } private void cboSlot_SelectedIndexChanged(object sender, EventArgs e) { int ret = -1; string[] SingleEndedStr = new string[2]; SingleEndedStr[0] = "Differential"; SingleEndedStr[1] = "Single Ended"; ret = pac8014W.Init((Int16)cboSlot.SelectedIndex); if (ret == 0) { slotIndex = (Int16)cboSlot.SelectedIndex; jumper = pac8014W.SingleEndJumper(slotIndex); lbJumper.Text = SingleEndedStr[jumper]; } else { MessageBox.Show("I-8014W is not at slot " + cboSlot.SelectedIndex.ToString()); } } private void btnStart_Click(object sender, EventArgs e) { if (!ConfigFlag) { MessageBox.Show("Please Configure the Magic Scan Parameters first", "Error"); return; } Int16 triggerLevel; /* triggerLevel used to define the FIFO level to trigger the Interrupt ISR function for this example, we define triggerLevel = 2, means the ISR function will be trigger every time when FIFO get 32 AI short values (64 bytes data) The following table triggerLevel 0: FIFO count to trigger Interrupt ISR = 8 short AI values, 16 bytes triggerLevel 1: FIFO count to trigger Interrupt ISR = 16 short AI values, 32 bytes triggerLevel 2: FIFO count to trigger Interrupt ISR = 32 short AI values, 64 bytes triggerLevel 3: FIFO count to trigger Interrupt ISR = 64 short AI values, 128 bytes triggerLevel 4: FIFO count to trigger Interrupt ISR = 128 short AI values, 256 bytes triggerLevel 5: FIFO count to trigger Interrupt ISR = 256 short AI values, 512 bytes triggerLevel 6: FIFO count to trigger Interrupt ISR = 512 short AI values, 1024 bytes triggerLevel 7: FIFO count to trigger Interrupt ISR = 2048 short AI values, 4096 bytes */ triggerLevel = 2; pac8014W.InstallMagicScanISR(slotIndex, ISRFun, triggerLevel); pac8014W.StartMagicScan(slotIndex); IntCnt = 0; runFlag = 1; totalScanned = 0; //Send external trigger for I-8014W module if (triggerSource == 2) { lstMsg.Items.Add(String.Format("Wait for external trigger signal source to {0} .....", StateStr[triggerState])); } T1 = GetTickCount(); timer1.Enabled = true; } private void btnShow_Click(object sender, EventArgs e) { ShowAI(); } private void btnSet_Click(object sender, EventArgs e) { Int16 i, ret; ComboBox[] cboType = { cboType0, cboType1, cboType2, cboType3, cboType4, cboType5, cboType6, cboType7, cboType8, cboType9, cboType10, cboType11, cboType12, cboType13, cboType14, cboType15 }; ComboBox[] cboChArray = { cboChArr0, cboChArr1, cboChArr2, cboChArr3, cboChArr4, cboChArr5, cboChArr6, cboChArr7, cboChArr8, cboChArr9, cboChArr10, cboChArr11, cboChArr12, cboChArr13, cboChArr14, cboChArr15 }; lstMsg.Items.Clear(); string[] SingleEndedStr = new string[2]; scanChCount = (Int16)(cboChCnt.SelectedIndex + 1); // scan channel count must begin at 1 for (i = 0; i < scanChCount; i++) { chArr[i] = (Int16)cboChArray[i].SelectedIndex; gainArr[i] = (Int16)cboType[i].SelectedIndex; lstMsg.Items.Add(String.Format("Selected Magic Scan Channel Gain Array[{0}] C = {1} G ={2}", i, chArr[i], gainArr[i])); } // Sample channel counts // scanChCount can be 1 ~ 16 (max =16 for both Differential and Single Ended) sampleRate = Convert.ToSingle(txtSampleRate.Text); scanMode = (Int16)(cboScanMode.SelectedIndex + 1); // trigger source 0, start magic scan via polling Mode, software command can only trigger one slot I-8014 // trigger source 1, start magic scan via internal interrupt signal Mode, internal interrupt signal can trigger all I-8014Ws on slots at the same time. // trigger source 2, start magic scan via external trigger signal Mode, extern trigger can also trigger all I-8014Ws on slots at the same time. triggerSource = (Int16)cboTrigSrc.SelectedIndex; // triggerState only related with external DI trigger signal. // if triggerState 0, external DI trigger signal must be high to start magic scan (default) // if triggerState 1, external DI trigger signal must be low to start magic scan triggerState = (Int16)cboTrigState.SelectedIndex; // When Configure Sample Rate of Magic Scan, the result sample rate may be different from input sample rate // Note i8014W_ConfigMagicScan only tell I-8014W how to start magic scan,it will not start magic scan // We have to call i8014W_StartMagicScan to start up the magic scan. pac8014W.ConfigMagicScan(slotIndex, chArr, gainArr, scanChCount, sampleRate, scanMode, triggerSource, triggerState, ref realsampleRate); lstMsg.Items.Add(String.Format("The Magic Scan Configurations of I-8014W are:")); TargetCnt = Convert.ToInt16(txtTargetCnt.Text); lstMsg.Items.Add(String.Format("Scan channel count = {0}, Total sample count ={1}", scanChCount, TargetCnt)); for (i = 0; i < scanChCount; i++) { lstMsg.Items.Add(String.Format("CH[{0}]= {1} Gain[{2}]= {3} ( {4} )", i, chArr[i], i, gainArr[i], GainStr[gainArr[i]])); } lstMsg.Items.Add(String.Format("Scan Mode = {0} ( {1} )", scanMode, ModeStr[scanMode - 1])); lstMsg.Items.Add(String.Format("Trigger Source = {0} ( {1} )", triggerSource, SourceStr[triggerSource])); if (triggerSource == 2) lstMsg.Items.Add(String.Format("Trigger State = {0} ( {1} )", triggerState, StateStr[triggerState])); else lstMsg.Items.Add(String.Format("Trigger State = {0} ( No need for External Trigger Signal )", triggerState)); lstMsg.Items.Add(String.Format("Set Sample Rate = {0} Real Sample Rate = {1}", sampleRate, realsampleRate)); ConfigFlag = true; } private void btnSave_Click(object sender, EventArgs e) { int i; string fPath = GetAppPath() + "\\SampleData.csv"; string data = string.Empty; StreamWriter Dsw = new StreamWriter(fPath, false, System.Text.Encoding.Default); float calibratedAI = 0; // Console.Write("Start to Print all data:\n\n\r"); for (i = 0; i < totalScanned; i++) { pac8014W.CalibrateData(slotIndex, gainArr[i % scanChCount], hexData[i], ref calibratedAI); Dsw.WriteLine(i.ToString() + "," + chArr[i % scanChCount].ToString() + "," + calibratedAI.ToString()); } Dsw.Flush(); Dsw.Close(); } } }