ajustado fluxo can
This commit is contained in:
parent
20378a9fd1
commit
19aa3ed2e6
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -3125,7 +3125,7 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
bool Conectado = data[2] == 1;
|
bool Conectado = data[2] == 1;
|
||||||
bool Configurado = data[3] == 1;
|
bool Configurado = data[3] == 1;
|
||||||
Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Conectado={Conectado}, Configurado={Configurado}");
|
//Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Conectado={Conectado}, Configurado={Configurado}");
|
||||||
loraService.Conectado = Conectado;
|
loraService.Conectado = Conectado;
|
||||||
loraService.Configurado = Configurado;
|
loraService.Configurado = Configurado;
|
||||||
break;
|
break;
|
||||||
|
|
@ -3143,7 +3143,7 @@ namespace AgroBase.Models.Modules
|
||||||
byte tranModeAndWorCycle = data[6];
|
byte tranModeAndWorCycle = data[6];
|
||||||
byte tranMode = (byte)(tranModeAndWorCycle & 0b01000000);
|
byte tranMode = (byte)(tranModeAndWorCycle & 0b01000000);
|
||||||
byte worCycle = (byte)(tranModeAndWorCycle & 0b00000111);
|
byte worCycle = (byte)(tranModeAndWorCycle & 0b00000111);
|
||||||
Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Address={address.ToString("X")}, BaudRate={baud.ToString("X")}, AirRate={airRate.ToString("X")}, PacketSize={packetSize.ToString("X")}, Power={power.ToString("X")}, Channel={channel.ToString("X")}, transMode={tranMode.ToString("X")}, WorCycle={worCycle.ToString("X")}");
|
//Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Address={address.ToString("X")}, BaudRate={baud.ToString("X")}, AirRate={airRate.ToString("X")}, PacketSize={packetSize.ToString("X")}, Power={power.ToString("X")}, Channel={channel.ToString("X")}, transMode={tranMode.ToString("X")}, WorCycle={worCycle.ToString("X")}");
|
||||||
loraService.ParametrosGet.address = address;
|
loraService.ParametrosGet.address = address;
|
||||||
loraService.ParametrosGet.baudRate = baud;
|
loraService.ParametrosGet.baudRate = baud;
|
||||||
loraService.ParametrosGet.airRate = airRate;
|
loraService.ParametrosGet.airRate = airRate;
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,6 @@ namespace AgroBase.Models
|
||||||
Variaveis.OperacaoEmAndamento.OperacaoConfigurada = RedisService.GetField(CtxKey.DadosOperacao, "configurado", false);
|
Variaveis.OperacaoEmAndamento.OperacaoConfigurada = RedisService.GetField(CtxKey.DadosOperacao, "configurado", false);
|
||||||
var tempoAguardando = RedisService.GetField<long>(CtxKey.DadosOperacao, "tempo_aguardando", 0);
|
var tempoAguardando = RedisService.GetField<long>(CtxKey.DadosOperacao, "tempo_aguardando", 0);
|
||||||
Variaveis.OperacaoEmAndamento.TempoAguardando = DateTimeOffset.FromUnixTimeSeconds(tempoAguardando).UtcDateTime.AddSeconds(tempoAguardando % 1).ToLocalTime();
|
Variaveis.OperacaoEmAndamento.TempoAguardando = DateTimeOffset.FromUnixTimeSeconds(tempoAguardando).UtcDateTime.AddSeconds(tempoAguardando % 1).ToLocalTime();
|
||||||
HealthWorkerService.ModulosSaude = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesModel[]>(CtxKey.DadosOperacao, "status_modulos").ToList();
|
|
||||||
Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada = RedisService.GetField<string>(CtxKey.DadosOperacao, "motivo_nao_liberado");
|
Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada = RedisService.GetField<string>(CtxKey.DadosOperacao, "motivo_nao_liberado");
|
||||||
GPSService.CorrecaoRTK_Ntrip = RedisService.GetField<bool>(RedisService.ModKey(T_Code.Gps), "correcao_ntrip", false);
|
GPSService.CorrecaoRTK_Ntrip = RedisService.GetField<bool>(RedisService.ModKey(T_Code.Gps), "correcao_ntrip", false);
|
||||||
|
|
||||||
|
|
@ -104,6 +103,29 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.StatusAnterior = Variaveis.OperacaoEmAndamento.StatusAtual;
|
Variaveis.OperacaoEmAndamento.StatusAnterior = Variaveis.OperacaoEmAndamento.StatusAtual;
|
||||||
|
|
||||||
|
List<ManagerWorkerMessageResponseModulosPendentesModel> saudeAnterior = new List<ManagerWorkerMessageResponseModulosPendentesModel>(HealthWorkerService.ModulosSaude ?? new List<ManagerWorkerMessageResponseModulosPendentesModel>());
|
||||||
|
HealthWorkerService.ModulosSaude = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesModel[]>(CtxKey.DadosOperacao, "status_modulos").ToList();
|
||||||
|
|
||||||
|
foreach (var mod in HealthWorkerService.ModulosSaude)
|
||||||
|
{
|
||||||
|
var mod_ant = saudeAnterior.FirstOrDefault(x => x.modulo == mod.modulo);
|
||||||
|
if (mod.status != mod_ant?.status)
|
||||||
|
{
|
||||||
|
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.InserirLog(mod.modulo, mod.status, mod.saude, string.Join("; ", mod.motivos), condicoes: string.Join("; ", mod.condicoes_operacionais.Select(x => x.descricao)));
|
||||||
|
}
|
||||||
|
if (mod.saude_individual.Any())
|
||||||
|
{
|
||||||
|
foreach (var ind in mod.saude_individual)
|
||||||
|
{
|
||||||
|
var ind_ant = saudeAnterior.FirstOrDefault(x => x.saude_individual.Any(y => y.id == ind.id))?.saude_individual?.FirstOrDefault(x => x.id == ind.id);
|
||||||
|
if (ind.status != ind_ant?.status)
|
||||||
|
{
|
||||||
|
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.InserirLog(mod.modulo, ind.status, ind.saude, string.Join("; ", ind.motivos), condicoes: string.Join("; ", ind.condicoes_operacionais.Select(x => x.descricao)), id: ind.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
double saude_geral = HealthWorkerService.ModulosSaude.DefaultIfEmpty().Average(x => x?.saude ?? 0);
|
double saude_geral = HealthWorkerService.ModulosSaude.DefaultIfEmpty().Average(x => x?.saude ?? 0);
|
||||||
Variaveis.OperacaoEmAndamento.Status =
|
Variaveis.OperacaoEmAndamento.Status =
|
||||||
!Variaveis.OperacaoEmAndamento.OperacaoLiberada ? StatusModulo.Falha :
|
!Variaveis.OperacaoEmAndamento.OperacaoLiberada ? StatusModulo.Falha :
|
||||||
|
|
@ -2252,7 +2274,24 @@ namespace AgroBase.Models
|
||||||
public Dictionary<T_Code, Dictionary<string, bool>> ModsCalibragem { get; set; }
|
public Dictionary<T_Code, Dictionary<string, bool>> ModsCalibragem { get; set; }
|
||||||
public bool CanSerialAtivado { get; set; }
|
public bool CanSerialAtivado { get; set; }
|
||||||
public Dictionary<string, bool> Iniciados { get; set; }
|
public Dictionary<string, bool> Iniciados { get; set; }
|
||||||
|
public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; }
|
||||||
|
|
||||||
|
public void InserirLog(T_Code dispositivo, StatusModulo status, double saude, string mensagem, string id = null, string condicoes = null)
|
||||||
|
{
|
||||||
|
if (Logs == null)
|
||||||
|
Logs = new List<OperacaoSensoriamentoLogErrosModel>();
|
||||||
|
|
||||||
|
Logs.Add(new OperacaoSensoriamentoLogErrosModel()
|
||||||
|
{
|
||||||
|
Momento = DateTime.Now,
|
||||||
|
Dispositivo = dispositivo,
|
||||||
|
ID = id,
|
||||||
|
Status = status,
|
||||||
|
Saude = saude,
|
||||||
|
Mensagem = mensagem,
|
||||||
|
Condicoes = condicoes
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void AtualizarDados()
|
public void AtualizarDados()
|
||||||
|
|
@ -2479,7 +2518,8 @@ namespace AgroBase.Models
|
||||||
DispositivosMapeados = new List<DispositivoDetalhesModel>(SerialService.DispositivosMapeados),
|
DispositivosMapeados = new List<DispositivoDetalhesModel>(SerialService.DispositivosMapeados),
|
||||||
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>(Variaveis.OperacaoEmAndamento.ModsCalibragem),
|
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>(Variaveis.OperacaoEmAndamento.ModsCalibragem),
|
||||||
Temperaturas = _DispSen?.Dados?.Sensores?.Where(x => x.Componente == S_Code.sNTC)?.ToDictionary(x => x.ID, y => (double?)(y.ValoresLeituras?.FirstOrDefault(v => v.funcao == FuncoesPinout.Temperatura)?.atual?.valor) ?? -1),
|
Temperaturas = _DispSen?.Dados?.Sensores?.Where(x => x.Componente == S_Code.sNTC)?.ToDictionary(x => x.ID, y => (double?)(y.ValoresLeituras?.FirstOrDefault(v => v.funcao == FuncoesPinout.Temperatura)?.atual?.valor) ?? -1),
|
||||||
Iniciados = _DispSen?.Dados?.Servos?.Select(s => new { s.ID, s.Inicializado }).Union(_DispSen?.Dados?.Reles?.Select(r => new { r.ID, r.Inicializado })).Union(_DispSen?.Dados?.Sinaleiros?.Select(s => new { s.ID, s.Inicializado })).Union(_DispSen?.Dados?.Sensores?.Select(s => new { s.ID, s.Inicializado })).ToDictionary(s => s.ID, s => s.Inicializado)
|
Iniciados = _DispSen?.Dados?.Servos?.Select(s => new { s.ID, s.Inicializado }).Union(_DispSen?.Dados?.Reles?.Select(r => new { r.ID, r.Inicializado })).Union(_DispSen?.Dados?.Sinaleiros?.Select(s => new { s.ID, s.Inicializado })).Union(_DispSen?.Dados?.Sensores?.Select(s => new { s.ID, s.Inicializado })).ToDictionary(s => s.ID, s => s.Inicializado),
|
||||||
|
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>())
|
||||||
};
|
};
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = dadosAtualizados;
|
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = dadosAtualizados;
|
||||||
|
|
@ -2528,7 +2568,8 @@ namespace AgroBase.Models
|
||||||
DispositivosMapeados = new List<DispositivoDetalhesModel>(DispositivosMapeados),
|
DispositivosMapeados = new List<DispositivoDetalhesModel>(DispositivosMapeados),
|
||||||
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>(ModsCalibragem),
|
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>(ModsCalibragem),
|
||||||
Temperaturas = new Dictionary<string, double>(Temperaturas ?? new Dictionary<string, double>()),
|
Temperaturas = new Dictionary<string, double>(Temperaturas ?? new Dictionary<string, double>()),
|
||||||
Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>())
|
Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>()),
|
||||||
|
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2929,4 +2970,15 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class OperacaoSensoriamentoLogErrosModel
|
||||||
|
{
|
||||||
|
public DateTime Momento { get; set; }
|
||||||
|
public T_Code Dispositivo { get; set; }
|
||||||
|
public string ID { get; set; }
|
||||||
|
public StatusModulo Status { get; set; }
|
||||||
|
public double Saude { get; set; }
|
||||||
|
public string Mensagem { get; set; }
|
||||||
|
public string Condicoes { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -155,8 +155,9 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public interface ICanService : IDisposable
|
public interface ICanService : IDisposable
|
||||||
{
|
{
|
||||||
|
bool PortaIsCan(SerialPort Porta = null);
|
||||||
void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler);
|
void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler);
|
||||||
bool Inicializar(SerialPort Porta = null, int BitRate = 250);
|
bool Inicializar(int BitRate = 250);
|
||||||
void AdicionarMensagemNaFila(T_Code Dispositivo, byte idTx, byte idRx, byte funcCodeTx, byte funcCodeRx, byte[] payload = null, bool get = true);
|
void AdicionarMensagemNaFila(T_Code Dispositivo, byte idTx, byte idRx, byte funcCodeTx, byte funcCodeRx, byte[] payload = null, bool get = true);
|
||||||
void Fechar();
|
void Fechar();
|
||||||
string _portName { get; set; }
|
string _portName { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -17,16 +17,11 @@ namespace AgroBase.Services
|
||||||
public string _portName { get; set; }
|
public string _portName { get; set; }
|
||||||
private int _baudRate;
|
private int _baudRate;
|
||||||
private int _bitRate;
|
private int _bitRate;
|
||||||
|
private string _canVersion;
|
||||||
private object _lock = new object();
|
private object _lock = new object();
|
||||||
public bool IsConnected { get; private set; }
|
public bool IsConnected { get; private set; }
|
||||||
private volatile bool _precisaReabrir;
|
private volatile bool _precisaReabrir;
|
||||||
public bool Iniciado
|
public bool Iniciado { get; private set; }
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return SerialService.DispositivosMapeados.Any(x => /*x.Status != StatusModulo.Desconectado &&*/ SerialService.DispositivosCan.Contains(x.Dispositivo));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private AsyncTaskTimerModel tmrEnviarCAN;
|
private AsyncTaskTimerModel tmrEnviarCAN;
|
||||||
private AsyncTaskTimerModel tmrOuvirCAN;
|
private AsyncTaskTimerModel tmrOuvirCAN;
|
||||||
private AsyncTaskTimerModel tmrProcessarCAN;
|
private AsyncTaskTimerModel tmrProcessarCAN;
|
||||||
|
|
@ -51,6 +46,108 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool PortaIsCan(SerialPort Porta)
|
||||||
|
{
|
||||||
|
if (Porta == null && _PortaCAN != null)
|
||||||
|
{
|
||||||
|
bool portaAberta = _PortaCAN?.IsOpen ?? false;
|
||||||
|
if (!portaAberta)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_PortaCAN?.Open();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Iniciado = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var portas = SerialPort.GetPortNames();
|
||||||
|
var portaExiste = !string.IsNullOrEmpty(_portName) && portas.Contains(_portName, StringComparer.OrdinalIgnoreCase);
|
||||||
|
if (!portaExiste)
|
||||||
|
{
|
||||||
|
Iniciado = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Porta != null)
|
||||||
|
{
|
||||||
|
Iniciado = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Porta.Close();
|
||||||
|
|
||||||
|
_portName = Porta.PortName;
|
||||||
|
_baudRate = 115200;
|
||||||
|
|
||||||
|
lock (_lock)
|
||||||
|
{
|
||||||
|
_PortaCAN = new SerialPort(_portName, _baudRate, Parity.None, 8, StopBits.One)
|
||||||
|
{
|
||||||
|
NewLine = "\r",
|
||||||
|
ReadTimeout = 500,
|
||||||
|
WriteTimeout = 500,
|
||||||
|
DtrEnable = true, // alguns adaptadores pedem
|
||||||
|
RtsEnable = true
|
||||||
|
};
|
||||||
|
_PortaCAN.ErrorReceived += (s, e) =>
|
||||||
|
{
|
||||||
|
IsConnected = false;
|
||||||
|
_precisaReabrir = true;
|
||||||
|
};
|
||||||
|
_PortaCAN.PinChanged += (s, e) =>
|
||||||
|
{
|
||||||
|
// Se perder DSR/CD ou receber BREAK, considere desconexão
|
||||||
|
if (e.EventType == SerialPinChange.Break || e.EventType == SerialPinChange.CDChanged || e.EventType == SerialPinChange.DsrChanged)
|
||||||
|
{
|
||||||
|
IsConnected = false;
|
||||||
|
_precisaReabrir = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
_PortaCAN.Open();
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
EnviarComando("V\r");
|
||||||
|
Thread.Sleep(50);
|
||||||
|
byte[] res = SerialService.LerDadosDaPortaSerial(_PortaCAN, 20);
|
||||||
|
_canVersion = Encoding.ASCII.GetString(res);
|
||||||
|
if (_canVersion.Contains("canable") || _canVersion.Contains("normaldotcom") || _canVersion.Contains("github"))
|
||||||
|
{
|
||||||
|
Iniciado = true;
|
||||||
|
SerialService.DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
||||||
|
{
|
||||||
|
Dispositivo = T_Code.Vzo,
|
||||||
|
Endereco = _portName,
|
||||||
|
Mod_ID = "CAN"
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Iniciado = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Iniciado && !string.IsNullOrEmpty(_portName))
|
||||||
|
{
|
||||||
|
Fechar();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Iniciado;
|
||||||
|
}
|
||||||
|
|
||||||
public void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler)
|
public void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler)
|
||||||
{
|
{
|
||||||
_roteadoresRegistrados.TryGetValue(endereco_rx, out bool registrado);
|
_roteadoresRegistrados.TryGetValue(endereco_rx, out bool registrado);
|
||||||
|
|
@ -62,48 +159,29 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Inicializar(SerialPort Porta = null, int BitRate = 250)
|
public bool Inicializar(int BitRate)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_bitRate = BitRate;
|
if (_PortaCAN == null)
|
||||||
if (Porta == null && _PortaCAN == null)
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Porta?.Close();
|
_bitRate = BitRate;
|
||||||
|
|
||||||
if ((Porta != null && _PortaCAN == null) || !IsConnected)
|
if (!IsConnected)
|
||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
_portName = Porta.PortName;
|
if (!Iniciado)
|
||||||
_baudRate = 115200;
|
|
||||||
|
|
||||||
_PortaCAN = new SerialPort(_portName, _baudRate, Parity.None, 8, StopBits.One)
|
|
||||||
{
|
{
|
||||||
NewLine = "\r",
|
if (!PortaIsCan(_PortaCAN))
|
||||||
ReadTimeout = 500,
|
|
||||||
WriteTimeout = 500,
|
|
||||||
DtrEnable = true, // alguns adaptadores pedem
|
|
||||||
RtsEnable = true
|
|
||||||
};
|
|
||||||
_PortaCAN.Open();
|
|
||||||
_PortaCAN.ErrorReceived += (s, e) =>
|
|
||||||
{
|
|
||||||
IsConnected = false;
|
|
||||||
_precisaReabrir = true;
|
|
||||||
};
|
|
||||||
_PortaCAN.PinChanged += (s, e) =>
|
|
||||||
{
|
|
||||||
// Se perder DSR/CD ou receber BREAK, considere desconexão
|
|
||||||
if (e.EventType == SerialPinChange.Break || e.EventType == SerialPinChange.CDChanged || e.EventType == SerialPinChange.DsrChanged)
|
|
||||||
{
|
{
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
_precisaReabrir = true;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
EnviarComando("C\r"); // fecha CAN (estado conhecido)
|
EnviarComando("C\r"); // fecha CAN (estado conhecido)
|
||||||
Thread.Sleep(50);
|
Thread.Sleep(50);
|
||||||
|
|
@ -136,14 +214,6 @@ namespace AgroBase.Services
|
||||||
IsConnected = true;
|
IsConnected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock (_lock)
|
|
||||||
{
|
|
||||||
if (_PortaCAN != null && !_PortaCAN.IsOpen)
|
|
||||||
{
|
|
||||||
_PortaCAN.Open();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return IsConnected;
|
return IsConnected;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -151,6 +221,7 @@ namespace AgroBase.Services
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
_PortaCAN = null;
|
_PortaCAN = null;
|
||||||
|
IsConnected = false;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -530,13 +601,21 @@ namespace AgroBase.Services
|
||||||
//_roteadores.Clear();
|
//_roteadores.Clear();
|
||||||
_ultimoIdEnviado = null;
|
_ultimoIdEnviado = null;
|
||||||
|
|
||||||
if (_PortaCAN?.IsOpen == true)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
EnviarComando("C\r");
|
if ((_PortaCAN?.IsOpen ?? false) == true)
|
||||||
_PortaCAN.Close();
|
{
|
||||||
|
EnviarComando("C\r");
|
||||||
|
_PortaCAN.Close();
|
||||||
|
}
|
||||||
_PortaCAN = null;
|
_PortaCAN = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var d = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Endereco == _portName);
|
||||||
|
SerialService.DispositivosMapeados.Remove(d);
|
||||||
|
|
||||||
|
_portName = null;
|
||||||
|
_canVersion = null;
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,11 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool PortaIsCan(SerialPort Porta = null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler)
|
public void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler)
|
||||||
{
|
{
|
||||||
_roteadoresRegistrados.TryGetValue(endereco_rx, out bool registrado);
|
_roteadoresRegistrados.TryGetValue(endereco_rx, out bool registrado);
|
||||||
|
|
@ -56,7 +61,7 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Inicializar(SerialPort Porta = null, int BitRate = 250)
|
public bool Inicializar(int BitRate)
|
||||||
{
|
{
|
||||||
_bitRate = BitRate;
|
_bitRate = BitRate;
|
||||||
bool canIniciado = Connector.IsOpen;
|
bool canIniciado = Connector.IsOpen;
|
||||||
|
|
@ -408,7 +413,7 @@ namespace AgroBase.Services
|
||||||
try { Connector.Close(); } catch { }
|
try { Connector.Close(); } catch { }
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Inicializar();
|
Inicializar(250);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ namespace AgroBase.Services
|
||||||
public static List<T_Code> DispositivosConexaoInicial = new List<T_Code>() { T_Code.Mvd, T_Code.Atu, T_Code.Sen };
|
public static List<T_Code> DispositivosConexaoInicial = new List<T_Code>() { T_Code.Mvd, T_Code.Atu, T_Code.Sen };
|
||||||
public static List<T_Code> DispositivosProprios = new List<T_Code>() { T_Code.Atu, T_Code.Sen };
|
public static List<T_Code> DispositivosProprios = new List<T_Code>() { T_Code.Atu, T_Code.Sen };
|
||||||
public static List<T_Code> DispositivosModbus = new List<T_Code>() { T_Code.Pzm, T_Code.Wit, T_Code.A05 };
|
public static List<T_Code> DispositivosModbus = new List<T_Code>() { T_Code.Pzm, T_Code.Wit, T_Code.A05 };
|
||||||
public static List<T_Code> DispositivosCan = new List<T_Code>() { T_Code.Mov, T_Code.Oid, T_Code.Dir, T_Code.Mks, T_Code.Sen, T_Code.Atu };
|
public static List<T_Code> DispositivosCan = new List<T_Code>() { T_Code.Vzo, T_Code.Mov, T_Code.Oid, T_Code.Dir, T_Code.Mks, T_Code.Sen, T_Code.Atu };
|
||||||
public static List<T_Code> DispositivosMultiplos = new List<T_Code>() { T_Code.Bld, T_Code.Mks, T_Code.Mvd, T_Code.Oid, T_Code.Mov, T_Code.Dir };
|
public static List<T_Code> DispositivosMultiplos = new List<T_Code>() { T_Code.Bld, T_Code.Mks, T_Code.Mvd, T_Code.Oid, T_Code.Mov, T_Code.Dir };
|
||||||
|
|
||||||
public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>()
|
public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>()
|
||||||
|
|
@ -234,11 +234,10 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
if (CanManager.UseCanSerial && !CanManager.CanService.Iniciado)
|
if (CanManager.UseCanSerial && !CanManager.CanService.Iniciado)
|
||||||
{
|
{
|
||||||
AtualizarConsole($"{PortaCom} - Procurando dispositivos no barramento CAN");
|
|
||||||
bool dispositivoCan = await ProcurarDispositivosCAN(_Porta);
|
bool dispositivoCan = await ProcurarDispositivosCAN(_Porta);
|
||||||
if (dispositivoCan)
|
if (dispositivoCan)
|
||||||
{
|
{
|
||||||
AtualizarConsole("Barramento CAN encontrado");
|
AtualizarConsole("Dispositivo encontrado no barramento CAN");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -253,7 +252,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
await ProcurarDispositivosCAN();
|
await ProcurarDispositivosCAN();
|
||||||
|
|
||||||
var DispositivosRemovidos = dispositivosMapeados.Where(x => x.Tipo == TipoConexao.PortaCOM && (!Portas.Contains(x.Endereco))).ToList(); // || x.Status == StatusModulo.Desconectado
|
var DispositivosRemovidos = dispositivosMapeados.Where(x => x.Tipo == TipoConexao.PortaCOM && (!Portas.Contains(x.Endereco))).ToList();
|
||||||
foreach (var Dispositivo in DispositivosRemovidos)
|
foreach (var Dispositivo in DispositivosRemovidos)
|
||||||
{
|
{
|
||||||
DispositivosMapeados.Remove(Dispositivo);
|
DispositivosMapeados.Remove(Dispositivo);
|
||||||
|
|
@ -388,9 +387,13 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
private static async Task<bool> ProcurarDispositivosCAN(SerialPort Porta = null)
|
private static async Task<bool> ProcurarDispositivosCAN(SerialPort Porta = null)
|
||||||
{
|
{
|
||||||
if (!CanManager.CanService.Inicializar(Porta))
|
AtualizarConsole($"{Porta?.PortName ?? CanManager.CanService._portName ?? "CAN"} - Procurando dispositivos no barramento CAN");
|
||||||
|
|
||||||
|
bool porta_can = CanManager.CanService.PortaIsCan(Porta);
|
||||||
|
bool inicializou = !CanManager.CanService.Inicializar(250);
|
||||||
|
if (!porta_can || inicializou)
|
||||||
{
|
{
|
||||||
AtualizarConsole($"Adaptador {CanManager.CanService._portName} não conectado!");
|
AtualizarConsole($"Adaptador {CanManager.CanService._portName ?? "CAN"} não conectado!");
|
||||||
var dispositivosRemover = DispositivosMapeados.Where(x => DispositivosCan.Contains(x.Dispositivo)).ToList();
|
var dispositivosRemover = DispositivosMapeados.Where(x => DispositivosCan.Contains(x.Dispositivo)).ToList();
|
||||||
foreach (var d in dispositivosRemover)
|
foreach (var d in dispositivosRemover)
|
||||||
{
|
{
|
||||||
|
|
@ -439,11 +442,6 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CanManager.UseCanSerial && !CanManager.CanService.Iniciado)
|
|
||||||
{
|
|
||||||
CanManager.CanService.Fechar();
|
|
||||||
}
|
|
||||||
|
|
||||||
return CanManager.CanService.Iniciado;
|
return CanManager.CanService.Iniciado;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -522,6 +522,12 @@
|
||||||
</Grid>
|
</Grid>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
|
<TabItem x:Name="tabSaude_Logs" Header="Logs">
|
||||||
|
<Canvas>
|
||||||
|
<ListBox x:Name="lstSaude_Logs" Height="174" Width="430" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="9"/>
|
||||||
|
</Canvas>
|
||||||
|
</TabItem>
|
||||||
|
|
||||||
</TabControl>
|
</TabControl>
|
||||||
</Border>
|
</Border>
|
||||||
</Canvas>
|
</Canvas>
|
||||||
|
|
@ -572,7 +578,7 @@
|
||||||
|
|
||||||
<Border x:Name="brdMapa" BorderBrush="Black" BorderThickness="1" Margin="465,71,475,116">
|
<Border x:Name="brdMapa" BorderBrush="Black" BorderThickness="1" Margin="465,71,475,116">
|
||||||
<Canvas>
|
<Canvas>
|
||||||
<controls:MapViewControl x:Name="MAP" MarkerClicked="MAP_MarkerClicked" StreetMapClicked="MAP_StreetMapClicked" MbTilesPath="Data/basemap.mbtiles" Latitude="-22.1726572492617" Longitude="-47.3952163870556" Scale="5000" Height="842" Width="978" HorizontalAlignment="Center" VerticalAlignment="Top" />
|
<controls:MapViewControl x:Name="MAP" MarkerClicked="MAP_MarkerClicked" StreetMapClicked="MAP_StreetMapClicked" MbTilesPath="Data/basemap.mbtiles" Latitude="-22.1726572492617" Longitude="-47.3952163870556" Scale="5000" Height="820" Width="978" HorizontalAlignment="Center" VerticalAlignment="Top" />
|
||||||
<controls:HeadingIndicator x:Name="HDG" Width="130" Height="130" Canvas.Left="10" Canvas.Top="10" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
<controls:HeadingIndicator x:Name="HDG" Width="130" Height="130" Canvas.Left="10" Canvas.Top="10" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||||
<controls:AttitudeIndicator x:Name="IMU" Width="160" Height="180" Canvas.Left="10" Canvas.Bottom="10" CriticalLimit="20" WarningLimit="10" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
<controls:AttitudeIndicator x:Name="IMU" Width="160" Height="180" Canvas.Left="10" Canvas.Bottom="10" CriticalLimit="20" WarningLimit="10" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||||
</Canvas>
|
</Canvas>
|
||||||
|
|
|
||||||
|
|
@ -494,7 +494,7 @@ namespace OperationControl.Windows
|
||||||
iniciado = rover.DadosLeitura?.Movimentacao?.Dados?.FirstOrDefault(x => x.ID == mod_label)?.Iniciado ?? false;
|
iniciado = rover.DadosLeitura?.Movimentacao?.Dados?.FirstOrDefault(x => x.ID == mod_label)?.Iniciado ?? false;
|
||||||
break;
|
break;
|
||||||
case AgroBase.Models.Enums.T_Code.Dir:
|
case AgroBase.Models.Enums.T_Code.Dir:
|
||||||
iniciado = rover.DadosLeitura?.Direcional?.Dados?.FirstOrDefault(x => x.ID == mod_label)?.Iniciado ?? false;
|
iniciado = rover.DadosLeitura?.Direcional?.Dados?.FirstOrDefault(x => x.Modulo_ID == mod_label)?.Inicializado ?? false;
|
||||||
break;
|
break;
|
||||||
case AgroBase.Models.Enums.T_Code.Atu:
|
case AgroBase.Models.Enums.T_Code.Atu:
|
||||||
if (string.IsNullOrEmpty(mod_label))
|
if (string.IsNullOrEmpty(mod_label))
|
||||||
|
|
@ -601,6 +601,7 @@ namespace OperationControl.Windows
|
||||||
PreencherAbaCondicoesOperacionais(saude?.condicoes_operacionais);
|
PreencherAbaCondicoesOperacionais(saude?.condicoes_operacionais);
|
||||||
PreencherAbaAcompanhamento(true);
|
PreencherAbaAcompanhamento(true);
|
||||||
PreencherAbaOpcoes(true);
|
PreencherAbaOpcoes(true);
|
||||||
|
PreencherAbaLogs(rover.DadosLeitura?.Logs?.Where(x => x.Dispositivo == modulo));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PreencherAbaCondicoesOperacionais(List<ManagerWorkerMessageResponseModulosPendentesSaudeCondicoesModel> condicoes)
|
private void PreencherAbaCondicoesOperacionais(List<ManagerWorkerMessageResponseModulosPendentesSaudeCondicoesModel> condicoes)
|
||||||
|
|
@ -1008,8 +1009,8 @@ namespace OperationControl.Windows
|
||||||
{
|
{
|
||||||
panelOpcoes_Direcional.Visibility = Visibility.Visible;
|
panelOpcoes_Direcional.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
var mod = rover?.Direcional?.Dados?.FirstOrDefault(x => x.ID == label);
|
var mod = rover?.Direcional?.Dados?.FirstOrDefault(x => x.Modulo_ID == label);
|
||||||
AgroBase.Models.Enums.Sentido sentido_sp = mod?.SentidoSP ?? AgroBase.Models.Enums.Sentido.Parado;
|
AgroBase.Models.Enums.Sentido sentido_sp = mod?.Sentido_SP ?? AgroBase.Models.Enums.Sentido.Parado;
|
||||||
AgroBase.Models.Enums.Sentido sentido = mod?.SentidoReal ?? AgroBase.Models.Enums.Sentido.Parado;
|
AgroBase.Models.Enums.Sentido sentido = mod?.SentidoReal ?? AgroBase.Models.Enums.Sentido.Parado;
|
||||||
double angulo_sp = mod?.Angulo_SP ?? 0;
|
double angulo_sp = mod?.Angulo_SP ?? 0;
|
||||||
double angulo = mod?.AnguloDriver ?? 0;
|
double angulo = mod?.AnguloDriver ?? 0;
|
||||||
|
|
@ -1050,6 +1051,19 @@ namespace OperationControl.Windows
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void PreencherAbaLogs(IEnumerable<AgroBase.Models.OperacaoSensoriamentoLogErrosModel> logs)
|
||||||
|
{
|
||||||
|
lstSaude_Logs.Items.Clear();
|
||||||
|
|
||||||
|
if (logs != null)
|
||||||
|
{
|
||||||
|
foreach (var log in logs)
|
||||||
|
{
|
||||||
|
lstSaude_Logs.Items.Add(log.Momento.ToString("HH:mm:ss.fff") + " - " + log.Mensagem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#region Atuador
|
#region Atuador
|
||||||
|
|
||||||
private void sldBarra_Altura_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
private void sldBarra_Altura_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
||||||
|
|
|
||||||
|
|
@ -16,5 +16,5 @@ C:\ZendionInc\agrobot_base\AgroBase\OperationControl\App.xaml
|
||||||
269595801548
|
269595801548
|
||||||
Controls\AttitudeIndicator.xaml;Controls\Bbox3DViewer.xaml;Controls\GstVideoView.xaml;Controls\HeadingIndicator.xaml;Controls\LabeledBar.xaml;Controls\ManualControlPad.xaml;Controls\MapViewControl.xaml;Controls\ProgressBarText.xaml;Controls\Pulverizador\BicoLequeIndicator.xaml;Controls\Pulverizador\PulverizadorIndicator.xaml;Controls\RiskMeter.xaml;Controls\TemperatureIndicator.xaml;Windows\MainWindow.xaml;
|
Controls\AttitudeIndicator.xaml;Controls\Bbox3DViewer.xaml;Controls\GstVideoView.xaml;Controls\HeadingIndicator.xaml;Controls\LabeledBar.xaml;Controls\ManualControlPad.xaml;Controls\MapViewControl.xaml;Controls\ProgressBarText.xaml;Controls\Pulverizador\BicoLequeIndicator.xaml;Controls\Pulverizador\PulverizadorIndicator.xaml;Controls\RiskMeter.xaml;Controls\TemperatureIndicator.xaml;Windows\MainWindow.xaml;
|
||||||
|
|
||||||
True
|
False
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
C:\ZendionInc\agrobot_base\AgroBase\OperationControl\obj\Debug\net8.0-windows7.0\GeneratedInternalTypeHelper.g.i.cs
|
|
||||||
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\AttitudeIndicator.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\GstVideoView.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\HeadingIndicator.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\LabeledBar.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\ManualControlPad.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\Pulverizador\BicoLequeIndicator.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\Pulverizador\PulverizadorIndicator.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Controls\TemperatureIndicator.xaml;;
|
|
||||||
FC:\ZendionInc\agrobot_base\AgroBase\OperationControl\Windows\MainWindow.xaml;;
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue