ajustado fluxo can

This commit is contained in:
Diego Freitas 2025-12-08 14:32:23 -03:00
parent 20378a9fd1
commit 19aa3ed2e6
23 changed files with 2020 additions and 1866 deletions

Binary file not shown.

View File

@ -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;

View File

@ -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; }
}
} }

View File

@ -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; }

View File

@ -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,36 +46,45 @@ namespace AgroBase.Services
} }
} }
public void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler) public bool PortaIsCan(SerialPort Porta)
{ {
_roteadoresRegistrados.TryGetValue(endereco_rx, out bool registrado); if (Porta == null && _PortaCAN != null)
if (!registrado)
{ {
_roteadoresRegistrados.TryAdd(endereco_rx, true); bool portaAberta = _PortaCAN?.IsOpen ?? false;
_roteadores.TryAdd(endereco_rx, handler); if (!portaAberta)
MostrarLog($"Roteador registrado: {endereco_rx.ToString("X")}", endereco_rx);
}
}
public bool Inicializar(SerialPort Porta = null, int BitRate = 250)
{
try
{
_bitRate = BitRate;
if (Porta == null && _PortaCAN == null)
{ {
return false; try
{
_PortaCAN?.Open();
}
catch
{
Iniciado = false;
}
} }
else
Porta?.Close();
if ((Porta != null && _PortaCAN == null) || !IsConnected)
{ {
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) lock (_lock)
{ {
_portName = Porta.PortName;
_baudRate = 115200;
_PortaCAN = new SerialPort(_portName, _baudRate, Parity.None, 8, StopBits.One) _PortaCAN = new SerialPort(_portName, _baudRate, Parity.None, 8, StopBits.One)
{ {
NewLine = "\r", NewLine = "\r",
@ -89,7 +93,6 @@ namespace AgroBase.Services
DtrEnable = true, // alguns adaptadores pedem DtrEnable = true, // alguns adaptadores pedem
RtsEnable = true RtsEnable = true
}; };
_PortaCAN.Open();
_PortaCAN.ErrorReceived += (s, e) => _PortaCAN.ErrorReceived += (s, e) =>
{ {
IsConnected = false; IsConnected = false;
@ -105,6 +108,81 @@ namespace AgroBase.Services
} }
}; };
_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)
{
_roteadoresRegistrados.TryGetValue(endereco_rx, out bool registrado);
if (!registrado)
{
_roteadoresRegistrados.TryAdd(endereco_rx, true);
_roteadores.TryAdd(endereco_rx, handler);
MostrarLog($"Roteador registrado: {endereco_rx.ToString("X")}", endereco_rx);
}
}
public bool Inicializar(int BitRate)
{
try
{
if (_PortaCAN == null)
{
return false;
}
_bitRate = BitRate;
if (!IsConnected)
{
lock (_lock)
{
if (!Iniciado)
{
if (!PortaIsCan(_PortaCAN))
{
IsConnected = false;
return false;
}
}
EnviarComando("C\r"); // fecha CAN (estado conhecido) EnviarComando("C\r"); // fecha CAN (estado conhecido)
Thread.Sleep(50); Thread.Sleep(50);
EnviarComando("Z0\r"); // desabilita timestamp EnviarComando("Z0\r"); // desabilita timestamp
@ -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;
} }

View File

@ -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 { }
} }

View File

@ -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

View File

@ -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>

View File

@ -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)

View File

@ -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

View File

@ -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;;