//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "acces32.h" #include "DACu.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMainForm *MainForm; unsigned int device; int maxch = 16; double span=10.0, offset=5; unsigned curval=0; unsigned address, address2; bool RunFlag=False; unsigned bits=12; unsigned int CalibMax=0, CalibMin=0; #define myKey "Software\\PCIFIND\\NTioPCI\\Parameters" TPCI_COMMON_CONFIG buf[64]; TRegistry *DriverRegistry; // This function accepts a value of 0-65535 and returns // the value scaled for the current DAC settings. unsigned ConvertForOutput(unsigned v) { //12 bit is 0-4095 and 16-bit is 0-65535. unsigned Calv = (((65536 - CalibMax - CalibMin) / 65536.0) * v + CalibMin) / 65535.0*((1 << bits)-1); v = v / 65535.0*((1 << bits)-1); //scale for 12 or 16 bits. //write to hardware here. if (MainForm->GroupChannel->ItemIndex < maxch) //the last item in the channel list is ALL { OutPort(address+(MainForm->GroupChannel->ItemIndex*2),Calv); InPortB(address+8);//update DACs, stay in async mode. } else { InPortB(address+0);//enter simultaneous mode without updating DACs for (int i=0;i=1;i--) temp+= (input & (1<<(i-1)))?'1':'0'; if (bits==12) temp += "xxxx"; temp += ' '; f=(((1<<(bits+1))-1) & input)*(span/(1<GroupRange->ItemIndex>5)?" mA":" Volts"; return temp; } void UpdateDAC() { offset=0; switch(MainForm->GroupRange->ItemIndex){ case 0:span=5.0;break; case 1:span=2.5;break; case 2:span=10.0;break; case 3:offset=5.0;span=10.0;break; case 4:offset=2.5;span=5.0;break; case 5:offset=10;span=20.0;break; case 6:span=16.0;offset=-4.0;break; } MainForm->LOutput->Caption=IntToBin(ConvertForOutput(curval)); } //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TMainForm::ValueChange(TObject *Sender) { curval=Value->Position; UpdateDAC(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormCreate(TObject *Sender) { int num, i,n; AnsiString r; if (InPortB(0x61) == 0xAA55) { Application->MessageBox("ACCESNT.SYS not detected. Please copy ACCESNT.SYS into [NT]/system32/drivers and re-run this sample.", "Warning", IDOK); } ISAPanel->Visible = false; n=0; num=0; DriverRegistry = new TRegistry; DriverRegistry->RootKey = HKEY_LOCAL_MACHINE; // RunFlag = True; if (DriverRegistry->OpenKey(myKey, false)) num = DriverRegistry->ReadInteger("NumDevices"); if (num > 0) DriverRegistry->ReadBinaryData("PCICommonConfig",buf,(sizeof(TPCI_COMMON_CONFIG)*num)); for (i = 0; i < num; i++) { RunFlag = True; switch (buf[i].DeviceID) { case 0x6C90: CardName->Caption="PCI-DA12-2 Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-2: "+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; case 0x6C98: CardName->Caption="PCI-DA12-4 Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-4: "+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; case 0x6CA0: CardName->Caption="PCI-DA12-6 Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-6: "+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; case 0x6CA8: CardName->Caption="PCI-DA12-8 Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-8: "+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; case 0x6CB0: CardName->Caption = "PCI-DA12-16 Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-16: "+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; case 0x6CB1: CardName->Caption="PCI-DA12-16V Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-16V:"+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; case 0x6CA9: CardName->Caption="PCI-DA12-8V Digital-To-Analog Card"; AddressList->Items->Add("PCI-DA12-8V:"+IntToHex(int(buf[i].BaseAddresses[2] & 0xFFF8),4)+":"+IntToHex(int(buf[i].BaseAddresses[3] & 0xFFF8),4)); n++; break; } } if (n==0) { CardName->Caption="No PCI DAC Card Found In Registry"; Memo1->Lines->Clear(); Memo1->Lines->Append("No PCI DAC Card Found In Registry."); Memo1->Lines->Append("This may mean no PCI card is installed, or that PCIFind.exe or NTioPCI.SYS (NT only) is not installed, or the PCI card(s) you have installed are not DAC cards. " "If you believe this message is in error, please make sure you have run PCIFind.EXE."); Memo1->Lines->Append("If you have an ISA DAC card installed, you may continue running the sample " "by entering the card's Base Address in the edit box above and continuing as normal."); ISAPanel->Visible = True; AddressList->Visible = False; AddressList->Enabled=False; RunFlag=False; } AddressList->ItemIndex=0; if (RunFlag){ address =StrToInt("0x"+AddressList->Items->Strings[AddressList->ItemIndex].SubString(AddressList->Items->Strings[AddressList->ItemIndex].Length()-8,4)); address2=StrToInt("0x"+AddressList->Items->Strings[AddressList->ItemIndex].SubString(AddressList->Items->Strings[AddressList->ItemIndex].Length()-3,4)); r = AddressList->Items->Strings[AddressList->ItemIndex]; r = AddressList->Items->Strings[AddressList->ItemIndex].SubString(10,1); sscanf(r.c_str(), "%x", &device); switch (device) { case 2: maxch=2; CardName->Caption="PCI-DA12-2 Digital-To-Analog Card"; break; case 4: maxch=4; CardName->Caption="PCI-DA12-4 Digital-To-Analog Card"; break; case 6: maxch=6; CardName->Caption="PCI-DA12-6 Digital-To-Analog Card"; break; case 8: maxch=8; CardName->Caption="PCI-DA12-8 Digital-To-Analog Card"; break; default: CardName->Caption="PCI-DA12-16 Digital-To-Analog Card"; maxch=16; } } DriverRegistry->Free(); GroupChannel->Items->Clear(); for (i=1; i <= maxch; i++) GroupChannel->Items->Append("Channel "+IntToStr(i-1)); GroupChannel->Items->Append("All Channels"); GroupChannel->ItemIndex=0; } //--------------------------------------------------------------------------- void __fastcall TMainForm::ExitButtonClick(TObject *Sender) { Close(); } //need to set address somewhere, fix this function to work with this board //void __fastcall TMainForm::AddressListChange(TObject *Sender) //{ // char msg[255]; // AnsiString s; // s = AddressList->Items->Strings[AddressList->ItemIndex]; // sprintf(msg, "New Port Selected: %s", s.c_str()); // Memo1->Lines->Add(msg); // s = AddressList->Items->Strings[AddressList->ItemIndex].SubString(24,4); // sscanf(s.c_str(), "%x", &Address); //} //--------------------------------------------------------------------------- void __fastcall TMainForm::InitializeClick(TObject *Sender) { unsigned data=0; if (RunFlag) { CalibMin = InPortB((address2+(GroupChannel->ItemIndex*2)+(GroupRange->ItemIndex)*32)); unsigned long NewTicks = GetTickCount() + 10; do Application->ProcessMessages(); while (GetTickCount() < NewTicks); //Pause for 10ms CalibMax = InPortB((address2+(GroupChannel->ItemIndex*2)+(GroupRange->ItemIndex)*32)+1); if (bits == 12) { CalibMax *= 16; CalibMin *= 16; } } else try { CalibMax = 0; //ISA cards are calibrated by pots, so there's no software CalibMin = 0; //calibration on the max or min data=StrToInt("0x"+ISAEdit->Text); } catch(...) { data = 0; } if ((data>0x100)) { address=data; RunFlag=true; } if (RunFlag) { InPortB(address+2); //remove simul mode InPortB(address+15); //remove zero latch GroupOutput->Visible=True; GroupOutput->Enabled=True; } } //--------------------------------------------------------------------------- void __fastcall TMainForm::GroupRangeClick(TObject *Sender) { UpdateDAC(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormActivate(TObject *Sender) { if (!RunFlag) FocusControl(ISAEdit); // UpdateDAC; Memo1->Lines->Append(""); Memo1->Lines->Append("Please configure the dialog options shown to reflect the card that is installed. " "The card's output voltage shown onscreen will only be correct if these settings are correct. " "Refer to the card's manual for specifics about jumper settings and switches."); Memo1->ScrollBars=ssVertical; } //--------------------------------------------------------------------------- void __fastcall TMainForm::GroupBitsClick(TObject *Sender) { switch(GroupBits->ItemIndex) { case 0:bits=12;Value->LineSize=16;break; case 1:bits=16;Value->LineSize=1;break; } UpdateDAC(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::GroupSpanClick(TObject *Sender) { UpdateDAC(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::AddressListChange(TObject *Sender) { int i; AnsiString s; AnsiString t; s = AddressList->Items->Strings[AddressList->ItemIndex]; s = AddressList->Items->Strings[AddressList->ItemIndex].SubString(13,4); sscanf(s.c_str(), "%x", &address); t = AddressList->Items->Strings[AddressList->ItemIndex]; t = AddressList->Items->Strings[AddressList->ItemIndex].SubString(10,1); sscanf(t.c_str(), "%x", &device); //this wont work switch (device) { case 2: maxch=2; CardName->Caption="PCI-DA12-2 Digital-To-Analog Card"; break; case 4: maxch=4; CardName->Caption="PCI-DA12-4 Digital-To-Analog Card"; break; case 6: maxch=6; CardName->Caption="PCI-DA12-6 Digital-To-Analog Card"; break; case 8: maxch=8; CardName->Caption="PCI-DA12-8 Digital-To-Analog Card"; break; default: CardName->Caption="PCI-DA12-16 Digital-To-Analog Card"; maxch=16; } GroupChannel->Items->Clear(); for (i=1; i <= maxch; i++) GroupChannel->Items->Append("Channel "+IntToStr(i-1)); GroupChannel->Items->Append("All Channels"); GroupChannel->ItemIndex=0; } //---------------------------------------------------------------------------