|
|
@@ -0,0 +1,188 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IO.Ports;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
+namespace BatteryTabos
|
|
|
+{
|
|
|
+ public partial class Manager
|
|
|
+ {
|
|
|
+ #region Total Packet Data
|
|
|
+ readonly byte StartSentence1 = 0xAF;
|
|
|
+ readonly byte StartSentence2 = 0xFA;
|
|
|
+ readonly byte Address = 0x60;
|
|
|
+ readonly byte Length = 0x05;
|
|
|
+ readonly byte ReqCommand = 0x01;
|
|
|
+ readonly byte Order = 0x60;
|
|
|
+ readonly byte Kind1 = 0x7F;
|
|
|
+ readonly byte Kind2 = 0x07;
|
|
|
+ readonly byte _CheckSum = 0x4C;
|
|
|
+ readonly byte EndSentence1 = 0xAF;
|
|
|
+ readonly byte EndSentence2 = 0xA0;
|
|
|
+
|
|
|
+ readonly byte SendCommand = 0x02;
|
|
|
+ readonly byte BatteryCommand = 0x03;
|
|
|
+ readonly byte BatteryDataErrorCommand = 0x1F;
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ Rs232c battery;
|
|
|
+ Config _config { get; set; }
|
|
|
+
|
|
|
+ byte[] _allpacket;
|
|
|
+
|
|
|
+ Queue<QueObject> QQ = new Queue<QueObject>();
|
|
|
+
|
|
|
+ Thread QW;
|
|
|
+
|
|
|
+ public bool IsOpen
|
|
|
+ {
|
|
|
+ get { return battery.serial.IsOpen; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Manager()
|
|
|
+ {
|
|
|
+ this._config = new Config();
|
|
|
+
|
|
|
+ /*Test ComPort*/
|
|
|
+ this.battery = new Rs232c("COM1");
|
|
|
+ this._allpacket = new byte[] { StartSentence1, StartSentence2, Address, Length, ReqCommand, Order, Kind1, Kind2, _CheckSum, EndSentence1, EndSentence2 };
|
|
|
+
|
|
|
+ this.battery.serial.DataReceived += Receive;
|
|
|
+
|
|
|
+ /*event Thread Pull Start*/
|
|
|
+ QW = ThreadUitls.Invoke(QueWorker);
|
|
|
+
|
|
|
+ /*생성 후 Send ? Thread Send ?*/
|
|
|
+ //Thread.Sleep(10);
|
|
|
+ SendAllData();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Receive(object sender, SerialDataReceivedEventArgs e)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (this.battery.serial.IsOpen && this.battery.serial != null)
|
|
|
+ {
|
|
|
+ var recv = new byte[this.battery.serial.BytesToRead];
|
|
|
+ this.battery.serial.Read(recv, 0, recv.Length);
|
|
|
+ ByteParse(recv);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex) { }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void ByteParse(byte[] data)
|
|
|
+ {
|
|
|
+ //var rt = CheckSum(data);
|
|
|
+ //if(rt){}
|
|
|
+
|
|
|
+ var stvol = BitConverter.ToString(data, 6, 2);
|
|
|
+ var _voltage = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 0.01;
|
|
|
+
|
|
|
+ /*-32768 ~ +32767*/
|
|
|
+ var stcur = BitConverter.ToString(data, 8, 2);
|
|
|
+ var _current = Convert.ToInt16(stcur, 16) * 0.01;
|
|
|
+
|
|
|
+ var stsoc = BitConverter.ToString(data, 10, 2);
|
|
|
+ var _soc = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 1;
|
|
|
+
|
|
|
+ var stbr = BitConverter.ToString(data, 12, 2);
|
|
|
+ var _batteryStatus = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber);
|
|
|
+
|
|
|
+ var stct = BitConverter.ToString(data, 14, 2);
|
|
|
+ var _chargeTime = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 1;
|
|
|
+
|
|
|
+ var stdct = BitConverter.ToString(data, 16, 2);
|
|
|
+ var _disChargeTime = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 1;
|
|
|
+
|
|
|
+ /*-32768 ~ +32767*/
|
|
|
+ var sttp = BitConverter.ToString(data, 18, 2);
|
|
|
+ var _temperature = Convert.ToInt16(sttp, 16) * 0.01;
|
|
|
+
|
|
|
+ var stsoh = BitConverter.ToString(data, 20, 2);
|
|
|
+ var _soh = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 1;
|
|
|
+
|
|
|
+ var stps = BitConverter.ToString(data, 22, 2);
|
|
|
+ var _residualcapacity = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 0.01;
|
|
|
+
|
|
|
+ var stpe = BitConverter.ToString(data, 24, 2);
|
|
|
+ var _residualEnergy = Int32.Parse(stvol, System.Globalization.NumberStyles.HexNumber) * 0.1;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void QueWorker()
|
|
|
+ {
|
|
|
+ for(; ; )
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var qo = this.QQ.Dequeue();
|
|
|
+ if(qo is QoConnect) { DelegateUtils.Invoke(OnConnect, this.battery.serial.PortName); }
|
|
|
+ if (qo is QoVoltage) { DelegateUtils.Invoke(OnVoltage, _config.Voltage); }
|
|
|
+ else if (qo is QoCurrent) { DelegateUtils.Invoke(OnCurrent, _config.Current); }
|
|
|
+ else if (qo is QoSOC) { DelegateUtils.Invoke(OnSOC, _config.SOC); }
|
|
|
+ else if (qo is QoBattery) { DelegateUtils.Invoke(OnBattery, _config.BatteryStatus); }
|
|
|
+ else if (qo is QoCharge) { DelegateUtils.Invoke(OnCharge, _config.ChargeTime); }
|
|
|
+ else if (qo is QoDisCharge) { DelegateUtils.Invoke(OnDisCharge, _config.DisChargeTime); }
|
|
|
+ else if (qo is QoTemperature) { DelegateUtils.Invoke(OnTemperature, _config.Temperature); }
|
|
|
+ else if (qo is QoCapacity) { DelegateUtils.Invoke(OnCapacity, _config.Capacity); }
|
|
|
+ else if (qo is QoEnergy) { DelegateUtils.Invoke(OnEnergy, _config.Energy); }
|
|
|
+ else { /* null */ }
|
|
|
+ }
|
|
|
+ catch (Exception ex) { }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void SendAllData()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (this.IsOpen && this.battery.serial != null)
|
|
|
+ {
|
|
|
+ /*byte*/
|
|
|
+ this.battery.serial.Write(this._allpacket, 0, this._allpacket.Length);
|
|
|
+
|
|
|
+ /*ascii*/
|
|
|
+ //this.battery.serial.Write();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex) { }
|
|
|
+ }
|
|
|
+
|
|
|
+ private bool CheckSum(byte[] _data)
|
|
|
+ {
|
|
|
+ bool ret = false;
|
|
|
+
|
|
|
+ int size = _data.Length;
|
|
|
+ var cdLow = _data[size - 2];
|
|
|
+ var cdHigh = _data[size - 3];
|
|
|
+ var cdResult = cdHigh + cdLow;
|
|
|
+
|
|
|
+ var csData = _data[2] + _data[3] + _data[4] + _data[5] + _data[6] + _data[7] + _data[8] + _data[9];
|
|
|
+
|
|
|
+ if (cdResult == csData)
|
|
|
+ {
|
|
|
+ ret = true;
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ else ret = false;
|
|
|
+
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void BatteryState(byte _data)
|
|
|
+ {
|
|
|
+ var batteryState = BitConverter.GetBytes(_data);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 미처리 작업 내용
|
|
|
+ * Enque 시 값이 같으면 return 어떻게할?
|
|
|
+ * Deque 시 값이 같으면 return 어떻게할?
|
|
|
+ * Battery 상태 값 표기 어찌할? 2^7 = 조합가능 개수 2^7개 만큼
|
|
|
+ */
|
|
|
+ }
|
|
|
+}
|