Files
charger/charger-gui/UpdateWorker.cs
T

104 lines
2.4 KiB
C#

using Modbus.Device;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
namespace charger_gui
{
class UpdateWorker
{
const int SLAVE_ADDRESS = 1;
const int CHARGE_REGISTER = 4;
const int LAMP_REGISTER = 5;
private MainWindowViewModel model;
private Thread workingThread;
public UpdateWorker(MainWindowViewModel model)
{
this.model = model;
isWorking = false;
shouldRestart = false;
workingThread = new Thread(Work);
model.IsConnected = false;
}
private bool isWorking;
private bool shouldRestart;
private string portName;
public void SetPort(string name)
{
if (portName != name)
{
portName = name;
if (!isWorking)
{
isWorking = true;
workingThread.Start();
}
else
{
shouldRestart = true;
}
}
}
private void Work()
{
while (true)
{
try
{
using (var serialPort = new SerialPort(portName))
{
serialPort.BaudRate = 115200;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.ReadTimeout = 50;
serialPort.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);
while (!shouldRestart)
{
var r1 = master.ReadHoldingRegisters(SLAVE_ADDRESS, 0, 2);
model.IRaw = ToFloat(r1[0], r1[1]);
var r2 = master.ReadHoldingRegisters(SLAVE_ADDRESS, 6, 8);
model.U2 = ToFloat(r2[0], r2[1]);
model.U3 = ToFloat(r2[2], r2[3]);
model.U4 = ToFloat(r2[4], r2[5]);
model.U5 = ToFloat(r2[6], r2[7]);
master.WriteSingleRegister(SLAVE_ADDRESS, CHARGE_REGISTER, (ushort)(model.IsCharging ? 1 : 0));
master.WriteSingleRegister(SLAVE_ADDRESS, LAMP_REGISTER, (ushort)(model.IsLampOn ? 1 : 0));
// ничего не упало, коннект есть значит
model.IsConnected = true;
}
}
}
catch (Exception e)
{
model.IsConnected = false;
Thread.Sleep(100);
// will continue
}
}
}
private float ToFloat(ushort v1, ushort v2)
{
byte[] t = new byte[4];
t[0] = (byte)(v1 & 0xFF);
t[1] = (byte)((v1 >> 8) & 0xFF);
t[2] = (byte)(v2 & 0xFF);
t[3] = (byte)((v2 >> 8) & 0xFF);
return System.BitConverter.ToSingle(t, 0);
}
}
}