//--------------------------------------------------------------------------- // GidDIO base class. 2000/03/27 #include #pragma hdrstop //============================================== #include "giddio.h" #define BIT(x) (1<<(x)) //============================================== void GidDIO::DioSetDCB(void) { rs->dcb.fBinary = 1; /* バイナリ モード、 EOFをチェックしない */ rs->dcb.fOutxCtsFlow = 0; /* CTS出力フロー制御 */ rs->dcb.fOutxDsrFlow = 0; /* DSR出力フロー制御 */ rs->dcb.fDtrControl = DTR_CONTROL_ENABLE; /* DTRフロー制御の種類 */ rs->dcb.fDsrSensitivity =0; /* DSRの感度 */ rs->dcb.fTXContinueOnXoff = 1; /* XOFF後も送信を継続 */ rs->dcb.fOutX = 0; /* XON/XOFF出力フロー制御 */ rs->dcb.fInX = 0; /* XON/XOFF入力フロー制御 */ rs->dcb.fErrorChar = 0; /* エラーによる置換を有効 */ rs->dcb.fNull = 0; /* ヌル ストリッピングを有効 */ rs->dcb.fRtsControl = RTS_CONTROL_ENABLE; /* RTSフロー制御 */ rs->dcb.fAbortOnError = 0; /* エラー時に読み取りまたは書き込みを中止 */ rs->SetDCB(); } //============================================== //エラーなら1で帰る int GidDIO::ModeSet(enum DIOMODE mode, int DefaultData) { int modebit, rts, dtr, ModeCheck; unsigned char buf[32]; switch(mode) { case PcTrigBurst: modebit = 0x11; break; case ExtTrigBurst: modebit = 0x13; break; case InputTrigBurst: modebit = 0x12; break; case InputTrigSingle: modebit = 0x22; break; case ExtTrigRiseSingle:modebit = 0x23; break; case ExtTrigFallSingle:modebit = 0x21; break; case PcTrigSingle: modebit = 0x33; break; default: modebit = -1; }; if(modebit<0) return 1;//モードが不正。 //初期化開始 DioSetDCB(); SetupComm(rs->ComHandle, 16384, 16384); rs->Flush(); //BREAKを発行して明示的にハードリセットを掛ける。 rs->SetBreak(1); Sleep(100); //起動時RTS/DTRセット GID-DIO電源ON rts = (modebit & 0x20)? 1 : 0; dtr = (modebit & 0x10)? 1 : 0; rs->SetDTR(dtr); rs->SetRTS(rts); //PICが安定するまで待つ rs->SetBreak(0); Sleep(100); //bps設定送信 buf[0] = (unsigned char)((baudrate == baud1200)? 0x0f : 0xf0); buf[1] = 0; rs->Send(buf, 1); Sleep(100); if(!rs->GetDCD()) return 2; //PIC-2のリセット解除信号を見つけられなかった //または、GID-DIOがつながってない。 //115kならDCBを再設定 if(baudrate == baud115k){ rs->dcb.BaudRate = 115200; DioSetDCB(); } //動作時RTS/DTRをセット rts = (modebit & 0x02)? 1 : 0; dtr = (modebit & 0x01)? 1 : 0; rs->SetDTR(dtr); rs->SetRTS(rts); //動作時RTS/DTRセット完了を通知 PutData(0x00); Sleep(100); //設定したモードのバイナリを返事してくれば成功 //mask 00000011b first //mask 00110000b second mode set ModeCheck=GetData(); if(ModeCheck != modebit) return 3; //初期出力 PutData((unsigned char)DefaultData); return 0; } //============================================== //データの送信 送信したデータ数を返す int GidDIO::PutData(unsigned char d) { unsigned char buf[2]; DefaultData = d; buf[0] = d; return rs->Send(buf, 1); } //============================================== //データの送信 送信したデータ数を返す int GidDIO::PutData(unsigned char *d, int n) { return rs->Send(d, n); } //============================================== //1文字送って1文字返す int GidDIO::PutGetWaitData(unsigned char d) { int dt; PutData(d); while((dt = GetData())<0); return dt; } //============================================== //データの受信,データが無ければ-1 int GidDIO::GetData(void) { char buf[3]; if(rs->Read(buf, 1)) return ((int)buf[0]) & 0xff; // 入力値を返す return -1; } // BITSET (pcmode) channelビットをOn/Offして受信データを返す int GidDIO::BitSet( bool OnOff, int channel ) { unsigned char outd = static_cast( GetDefaultData() ); if ( OnOff == false ) outd &= static_cast( ~(BIT( channel ) ) ); else outd |= static_cast( BIT( channel ) ); return PutGetWaitData( outd ); } //============================================== //連続入力する n>0なら個数分 int GidDIO::GetBurst(int n, unsigned char *p, unsigned char d) { int ns; PutData(d); for(ns = 0; ns += rs->Read(p+ns, n), ns