/// <summary> /// /// </summary> /// <param name="msg"></param> private void ParseMessage(ref byte[] msg) { _DevId dev = (_DevId)Enum.Parse(typeof(_DevId), msg[3].ToString()); string senderdesc = Common.Utility.EnumTypeConverter.GetDescriptionFromEnumValue(dev); //!< 망함 다시... }
/// <summary> /// 요청 패킷을 생성하여 보냄 /// </summary> /// <param name="targetDevId"></param> /// <param name="cmd"></param> public void RequestRTUByDevCmd(_DevId targetDevId, _opCode cmd) { //!< 도어 상태정보 31 //!< 온습도 32, 온도 31 //!< 조도 31 //!< 마이크 31 //!< 스피커 상태정보 31, 볼륨 설정 30/해제 31 //!< 뮤트 상태정보 31, 설정 30/해제 31 //!< 팬 수량 31, 상태 //!< 팬 제어 동작 제어, 자동모드 설정 30/해제 31, 개별 끔 30, 켬 31 수량만큼 //!< 히터 전원상태, 전원동작 설정 및 제어 자동/수동 ?? 헷갈림 //!< LCD 전원상태, 전원제어 //!< LED 전원상태, 전원제어 //!< AC 전원 리셋, 예약제어(4byte 시간값이 이해가 안됨) //!< 전체장치 전원제어 수량정보, 전체장치 전원상태 정보, 전체장치 전원제어 //!< 초기값 파라미터 설정 32byte //!< 모뎀 리셋 //!< 충격센서 설정값 읽기, 설정 요청(3Byte) //!< 상태요청(단순 응답 확인) }
/// <summary> /// 단순한 ACK 처리 /// </summary> /// <param name="code"></param> /// <param name="dev"></param> private void ReplyEventACK(_opCode code, _DevId dev, bool bACK) { try { byte[] sendBytes = new byte[8]; byte[] headBytes = new byte[] { 0x02, 0xFD, (byte)dev, 0x11, 0xAA, 0x00 }; byte[] tailBytes = new byte[] { 0x00, 0x03 }; byte chk = GetChecksum(ref headBytes); tailBytes[0] = chk; headBytes.CopyTo(sendBytes, 0); tailBytes.CopyTo(sendBytes, 6); SendCommand(sendBytes); } catch (Exception) { //throw; } }
/// <summary> /// RTU로부터의 요청에 대한 응답 /// </summary> /// <param name="reqDevId"></param> /// <param name="cmd"></param> private void ReplyRTURequest(_DevId reqDevId, _opCode cmd) { //!< 시간요청 값이 이해가 안됨 }
/// <summary> /// 실제 바이트들에 대한 기본처리 및 파싱 콜 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Rev1_RTUReceived(object sender, EventArgs e) { //byte[] test = new byte[8]; byte[] test = Enumerable.Repeat <byte>(0x41, 8).ToArray(); ParseMessage(ref test); byte _trash; if (_port.IsOpen) { try { waitCmdBusy.WaitOne(); byte[] header = new byte[6]; if (rxFIFO.Count > 8) { //!< check header rxFIFO.CopyTo(header, 0); if (header[0] == 0x02 && header[1] == 0xFD) { //!< get needed body byte bLen = header[5]; int dLen = 8 + (int)bLen; if (header[2] == _bitDevId) { //!< Make Copyed Message if (rxFIFO.Count >= 8 + (int)bLen) { byte[] msg = new byte[dLen]; rxFIFO.CopyTo(msg, 0); //!< check tail if (ValidateChecksum(ref msg)) { //!< waiter clear _DevId sendDev = (_DevId)Enum.Parse(typeof(_DevId), msg[3].ToString()); if (sendDev != _DevId.UNKNOWN) { var matched = _waitCmd.Where(z => z.Value == sendDev).ToList(); foreach (var item in matched) { _waitCmd.Remove(item.Key); } } ParseMessage(ref msg); } } } else { //!< can not be processed for bit } //!< Dequeue to etx while (dLen > 0) { rxFIFO.TryDequeue(out _trash); dLen--; } } else { //!< Dequeue to stx byte[] _stx = new byte[2]; while (rxFIFO.Count >= 2) { rxFIFO.CopyTo(_stx, 0); if (_stx[0] == 0x02 && _stx[1] == 0xFD) { break; } rxFIFO.TryDequeue(out _trash); rxFIFO.TryDequeue(out _trash); } } } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); //MessageBox.Show(ex.StackTrace); } finally { waitCmdBusy.ReleaseMutex(); } } }