agrobot_base/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs

3305 lines
147 KiB
C#
Raw Normal View History

using AgroBase.Services;
2023-11-30 00:41:22 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
2024-07-26 19:54:25 +00:00
using static AgroBase.Models.Enums;
2025-04-09 21:11:40 +00:00
using System.Globalization;
2025-04-16 16:44:06 +00:00
using System.Data;
2025-05-09 20:17:28 +00:00
using static AgroBase.Services.LoRaEspService;
using System.Windows.Forms;
2025-07-11 16:38:08 +00:00
using AgroBase.Services.Operadores;
2025-07-16 16:47:56 +00:00
using AgroBase.Models.Operadores;
2023-11-30 00:41:22 +00:00
namespace AgroBase.Models.Modules
{
public class SensoriamentoModel : DispositivoBaseModel
2023-11-30 00:41:22 +00:00
{
2025-04-09 21:11:40 +00:00
public T_Code Dispositivo { get; set; } = T_Code.Sen;
public string Modulo_ID { get; set; } = T_Code.Sen.ToString();
2025-05-01 18:27:01 +00:00
public byte _EnderecoCAN_Tx { get; set; } = 0x11;
public byte _EnderecoCAN_Rx { get; set; } = 0x12;
2025-04-09 21:11:40 +00:00
public int _TaxaAmostragem { get; set; } = 1000;
2025-07-17 11:19:42 +00:00
public double FrequenciaBase
{
get
{
return 1.0 / (_TaxaAmostragem / 1000.0);
}
}
2025-04-09 21:11:40 +00:00
public bool RequisitarDados { get; set; } = true;
public static int PingsConsiderarConexao { get; set; } = 5;
public static int TempoLimiteConexao
{
2025-04-09 21:11:40 +00:00
get
{
2025-04-09 21:11:40 +00:00
return PingsConsiderarConexao * (Variaveis.OperacaoEmAndamento?.DispSen?._TaxaAmostragem ?? 1000);
}
}
public bool Conectado
{
get
{
return DadosLeitura.UltimoComandoRespondido.AddMilliseconds(PingsConsiderarConexao * _TaxaAmostragem) > DateTime.Now;
}
}
public bool ConexaoAtiva
{
get
{
2025-07-11 16:38:08 +00:00
return HealthWorkerService.ModulosSaude.Any(x => x.modulo == Dispositivo && x.status == StatusModulo.Operante);
}
}
public SensoriamentoMensagemJsonModel DadosLeitura { get; set; } = new SensoriamentoMensagemJsonModel();
2024-04-15 10:57:37 +00:00
public static PinoutDataModel Pinout { get; set; }
2024-04-01 11:03:25 +00:00
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>()
{
FuncoesPinout.SDA,
FuncoesPinout.SCL,
};
2023-11-30 00:41:22 +00:00
public List<SensorModel> Sensores { get; set; }
2024-07-12 19:44:56 +00:00
public List<SensorSinaleiroModel> Sinaleiros { get; set; }
2024-07-18 18:00:14 +00:00
public List<SensorReleModel> Reles { get; set; }
2024-07-24 20:04:55 +00:00
public List<SensorServoModel> Servos { get; set; }
public OAKCameraModel CameraCaminho { get; set; } = new OAKCameraModel();
public List<OAKCameraModel> CamerasSolo { get; set; } = new List<OAKCameraModel>();
2024-10-29 19:53:27 +00:00
public UltrasonicA05Configuracoes ConfiguracaoSensorUltrassom { get; set; }
2025-04-09 21:11:40 +00:00
private SenHandler _SenHandler = new SenHandler();
2025-04-30 21:49:17 +00:00
public LoRaEspService loRaService { get; set; } = new LoRaEspService();
public LoRaParametrosModel LoRaParametrosBase { get; set; } = new LoRaParametrosModel()
{
address = 0x01,
channel = 0x17,
2025-07-18 20:03:37 +00:00
tranMode = LoRaBaseService.CodigosTipoTransmissao["Fixed"],
baudRate = LoRaBaseService.CodigosBaudRates[9600],
airRate = LoRaBaseService.CodigosAirRates[2.4],
packetSize = LoRaBaseService.CodigosPacketSizes[200],
worCycle = LoRaBaseService.CodigosWorCycles[4000],
power = LoRaBaseService.CodigosPowers[22],
};
public CoulombCounterService ContadorCarga = new CoulombCounterService(VariaveisEquipamento.CorrenteMaximaBateria);
public AsyncTaskTimerModel tmrRegistrador;
2024-12-05 12:52:28 +00:00
private int _TempoReconexaoComponentes = 5;
private int _VezesLeituraReconexao = 0;
2023-11-30 00:41:22 +00:00
public static SensoriamentoModel CarregarParametrosIniciais()
{
var obj = new SensoriamentoModel()
2023-11-30 00:41:22 +00:00
{
2025-05-01 18:27:01 +00:00
_EnderecoCAN_Tx = 0x11,
_EnderecoCAN_Rx = 0x11,
2025-04-09 21:11:40 +00:00
_TaxaAmostragem = 1000,
RequisitarDados = true,
CameraCaminho = new OAKCameraModel(),
CamerasSolo = new List<OAKCameraModel>(),
Sinaleiros = new List<SensorSinaleiroModel>()
{
new SensorSinaleiroModel()
{
ID = "LEDMN",
2025-04-09 21:11:40 +00:00
ID_Num = 21,
Descricao = "Sinaleiro indicação de modo Manual ativo",
Componente = S_Code.sLED,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.Sinaleiro,
},
Comportamento = VariaveisEquipamento.ComportamentoPorStatus(StatusOperacao.NaoIniciado),
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.StatusLEDLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.StatusLEDComando,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
},
}
},
new SensorSinaleiroModel()
{
ID = "LEDAT",
2025-04-09 21:11:40 +00:00
ID_Num = 22,
Descricao = "Sinaleiro indicação de modo Automático ativo",
Componente = S_Code.sLED,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.Sinaleiro,
2024-04-26 19:34:58 +00:00
},
Comportamento = VariaveisEquipamento.ComportamentoPorStatus(StatusOperacao.NaoIniciado),
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.StatusLEDLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.StatusLEDComando,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
},
}
},
new SensorSinaleiroModel()
{
ID = "LEDOP",
2025-04-09 21:11:40 +00:00
ID_Num = 23,
Descricao = "Sinaleiro indicação do status da operação ativa",
Componente = S_Code.sLED,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.Sinaleiro,
2024-04-26 19:34:58 +00:00
},
Comportamento = VariaveisEquipamento.ComportamentoPorStatus(StatusOperacao.NaoIniciado),
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.StatusLEDLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.StatusLEDComando,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
},
}
},
},
2023-11-30 00:41:22 +00:00
Sensores = new List<SensorModel>()
{
new SensorModel()
{
2024-01-18 19:22:28 +00:00
ID = "TMVET",
Descricao = "Temperatura Motor Esquerdo Trás",
2025-04-09 21:11:40 +00:00
ID_Num = 1,
2025-05-15 20:20:46 +00:00
Componente = S_Code.sNTC,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-01-18 19:22:28 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.TMP,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-05-15 20:20:46 +00:00
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 80,
minimo = 5,
nominal = 25,
unidade_medida = "ºC"
}
2025-04-09 21:11:40 +00:00
}
2024-01-18 19:22:28 +00:00
},
new SensorModel()
{
ID = "TMVEF",
Descricao = "Temperatura Motor Esquerdo Frente",
2025-04-09 21:11:40 +00:00
ID_Num = 2,
2025-05-15 20:20:46 +00:00
Componente = S_Code.sNTC,
2024-01-18 19:22:28 +00:00
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-01-18 19:22:28 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.TMP,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-05-15 20:20:46 +00:00
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 80,
minimo = 5,
nominal = 25,
unidade_medida = "ºC"
}
2025-04-09 21:11:40 +00:00
}
2024-01-18 19:22:28 +00:00
},
new SensorModel()
{
ID = "TMVDT",
Descricao = "Temperatura Motor Direito Trás",
2025-04-09 21:11:40 +00:00
ID_Num = 3,
2025-05-15 20:20:46 +00:00
Componente = S_Code.sNTC,
2024-01-18 19:22:28 +00:00
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-01-18 19:22:28 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.TMP,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-05-15 20:20:46 +00:00
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 80,
minimo = 5,
nominal = 25,
unidade_medida = "ºC"
}
2025-04-09 21:11:40 +00:00
}
2024-01-18 19:22:28 +00:00
},
new SensorModel()
{
ID = "TMVDF",
Descricao = "Temperatura Motor Direito Frente",
2025-04-09 21:11:40 +00:00
ID_Num = 4,
2025-05-15 20:20:46 +00:00
Componente = S_Code.sNTC,
2024-01-18 19:22:28 +00:00
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-01-18 19:22:28 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.TMP,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-05-15 20:20:46 +00:00
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 80,
minimo = 5,
nominal = 25,
unidade_medida = "ºC"
}
2025-04-09 21:11:40 +00:00
}
},
new SensorModel()
{
ID = "TBAT",
Descricao = "Temperatura da bateria",
ID_Num = 5,
2025-05-15 20:20:46 +00:00
Componente = S_Code.sNTC,
2025-04-09 21:11:40 +00:00
Aferir = false,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2025-04-09 21:11:40 +00:00
Funcoes = new List<FuncoesPinout>()
{
2025-04-09 21:11:40 +00:00
FuncoesPinout.TMP,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-05-15 20:20:46 +00:00
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 50,
minimo = 5,
nominal = 25,
unidade_medida = "ºC"
}
2025-04-09 21:11:40 +00:00
}
2024-01-18 19:22:28 +00:00
},
2025-04-09 21:11:40 +00:00
new SensorModel()
2024-01-18 19:22:28 +00:00
{
2024-04-15 10:57:37 +00:00
ID = "AB3V",
Descricao = "Corrente no Barramento 3V",
2025-04-09 21:11:40 +00:00
ID_Num = 11,
2023-11-30 00:41:22 +00:00
Componente = S_Code.sCOR,
2025-05-15 20:20:46 +00:00
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2023-11-30 00:41:22 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
2024-01-23 17:10:34 +00:00
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
2024-01-23 17:10:34 +00:00
{
2025-04-09 21:11:40 +00:00
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
2025-04-09 21:11:40 +00:00
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA219_3A2).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "5",
QtdBytes = 1,
Escalar = false,
2025-04-09 21:11:40 +00:00
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 3.4,
minimo = 3.0,
nominal = 3.3,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 500,
minimo = 50,
nominal = 100,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
maximo = 60,
minimo = 0,
nominal = 25,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
2025-04-09 21:11:40 +00:00
}
},
new SensorModel()
{
2024-04-15 10:57:37 +00:00
ID = "AB5V",
Descricao = "Corrente no Barramento 5V",
2025-04-09 21:11:40 +00:00
ID_Num = 12,
Componente = S_Code.sCOR,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-04-09 21:11:40 +00:00
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
2025-04-09 21:11:40 +00:00
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA219_3A2).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "4",
QtdBytes = 1,
Escalar = false,
2025-04-09 21:11:40 +00:00
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 5.2,
minimo = 4.9,
nominal = 5.0,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 1000,
minimo = 50,
nominal = 300,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
maximo = 60,
minimo = 0,
nominal = 25,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
2025-04-09 21:11:40 +00:00
}
},
new SensorModel()
{
2024-04-15 10:57:37 +00:00
ID = "AB7V2",
Descricao = "Corrente no Barramento 7,2V",
2025-04-09 21:11:40 +00:00
ID_Num = 13,
Componente = S_Code.sCOR,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-04-09 21:11:40 +00:00
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
2025-04-09 21:11:40 +00:00
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA219_3A2).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "2",
QtdBytes = 1,
Escalar = false,
2025-04-09 21:11:40 +00:00
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 7.4,
minimo = 7.0,
nominal = 7.2,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 3000,
minimo = 0,
nominal = 10,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
maximo = 60,
minimo = 0,
nominal = 25,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
2025-04-09 21:11:40 +00:00
}
},
new SensorModel()
{
2024-04-15 10:57:37 +00:00
ID = "AB12V",
Descricao = "Corrente no Barramento 12V",
2025-04-09 21:11:40 +00:00
ID_Num = 14,
Componente = S_Code.sCOR,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
2025-04-09 21:11:40 +00:00
Parametros = new List<SensorParametroModel>()
{
2025-04-09 21:11:40 +00:00
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA228_50A).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "3",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 12.5,
minimo = 11.5,
nominal = 12.0,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 10000,
minimo = 50,
nominal = 500,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
analise_health = true,
maximo = 60,
minimo = 0,
nominal = 25,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
}
},
new SensorModel()
{
ID = "AB19V",
Descricao = "Corrente no Barramento 19V",
ID_Num = 15,
Componente = S_Code.sCOR,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA228_10A).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 19.2,
minimo = 18.8,
nominal = 19.0,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 4000,
minimo = 500,
nominal = 1500,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
analise_health = true,
maximo = 60,
minimo = 0,
nominal = 25,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
}
},
new SensorModel()
{
ID = "AB24V",
Descricao = "Corrente no Barramento 24V",
ID_Num = 16,
Componente = S_Code.sCOR,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA228_50A).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "6",
QtdBytes = 1,
Escalar = false,
2025-04-09 21:11:40 +00:00
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 24.3,
minimo = 23.8,
nominal = 24.0,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 20000,
minimo = 100,
nominal = 700,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
analise_health = true,
maximo = 60,
minimo = 0,
nominal = 25,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
2025-04-09 21:11:40 +00:00
}
2024-01-24 12:53:39 +00:00
},
2025-04-14 16:37:53 +00:00
new SensorModel()
2025-04-24 11:49:04 +00:00
{
ID = "AB36V",
Descricao = "Corrente no Barramento 36V",
ID_Num = 17,
2025-04-24 11:49:04 +00:00
Componente = S_Code.sCOR,
Aferir = true,
2025-05-07 16:54:45 +00:00
Mandatorio = true,
2025-04-24 11:49:04 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x40",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Shunt",
Valor = ((int)TiposShuntCorrente.INA228_100A).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "7",
QtdBytes = 1,
Escalar = false,
2025-04-24 11:49:04 +00:00
Enviar = true
},
2025-04-14 16:37:53 +00:00
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
2025-04-14 16:37:53 +00:00
{
new SensorValoresLeituraModel()
2025-04-14 16:37:53 +00:00
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
2025-04-14 16:37:53 +00:00
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Tensao,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 42.5,
minimo = 31.0,
nominal = 37.5,
unidade_medida = "V"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Corrente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 75000,
minimo = 200,
nominal = 2500,
unidade_medida = "mA"
},
new SensorValoresLeituraModel()
2025-04-14 16:37:53 +00:00
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
unidade_medida = "mW"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Energia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
unidade_medida = "mW/h"
2025-04-14 16:37:53 +00:00
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
analise_health = true,
maximo = 60,
minimo = 0,
nominal = 35,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.CodAlarme,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
}
2025-04-14 16:37:53 +00:00
}
},
2025-05-15 20:20:46 +00:00
new SensorModel()
{
ID = "LUZABT",
Descricao = "Luminosidade Ambiente",
ID_Num = 31,
Componente = S_Code.sLUZ,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x29",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.LuzAmbiente,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 80000,
minimo = 50,
nominal = 10000,
unidade_medida = "Lux"
}
2025-05-15 20:20:46 +00:00
}
},
new SensorModel()
{
ID = "IUVABT",
Descricao = "Indice de radiacao UV Ambiente",
ID_Num = 32,
Componente = S_Code.sIUV,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.LuzUV,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.LuzUV,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 11.0,
minimo = 0.0,
nominal = 5.0,
unidade_medida = "IUV"
}
2025-05-15 20:20:46 +00:00
}
},
new SensorModel()
{
ID = "MQ2",
Descricao = "Gas e Fumaca",
ID_Num = 33,
Componente = S_Code.sGAS,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.Gas,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Tipo",
Valor = ((int)TipoSensorGas.MQ2).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true,
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Gas,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 600.0,
minimo = 0.0,
nominal = 50.0,
unidade_medida = "PPM"
}
2025-05-15 20:20:46 +00:00
}
},
new SensorModel()
{
ID = "MQ7",
Descricao = "Monoxido de carbono",
ID_Num = 34,
Componente = S_Code.sGAS,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.Gas,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Tipo",
Valor = ((int)TipoSensorGas.MQ7).ToString(),
QtdBytes = 1,
Escalar = false,
Enviar = true,
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Gas,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 400.0,
minimo = 0.0,
nominal = 25.0,
unidade_medida = "PPM"
}
2025-05-15 20:20:46 +00:00
}
},
new SensorModel()
{
ID = "QLDABT",
Descricao = "Qualidade do ar",
ID_Num = 35,
Componente = S_Code.sQAR,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.TVOC,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 1000.0,
minimo = 0.0,
nominal = 150.0,
unidade_medida = "PPB"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.ECO2,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 2000.0,
minimo = 400.0,
nominal = 600.0,
unidade_medida = "PPM"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.AQI,
posicao = CanMessagePosicaoDados.Dados1,
indice = 2,
analise_health = true,
maximo = 3.0,
minimo = 1.0,
nominal = 1.5,
unidade_medida = "AQI"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
analise_health = true,
maximo = 50.0,
minimo = 0.0,
nominal = 25.0,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Umidade,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
analise_health = true,
maximo = 90.0,
minimo = 20.0,
nominal = 60.0,
unidade_medida = "%"
},
2025-05-15 20:20:46 +00:00
}
},
new SensorModel()
{
ID = "SHTABT",
Descricao = "Temperatura e Umidade Ambiente",
ID_Num = 36,
Componente = S_Code.sSHT,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Endereço I2C",
Valor = "0x44",
QtdBytes = 1,
Escalar = false,
Enviar = false
},
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Temperatura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 50.0,
minimo = 0.0,
nominal = 25.0,
unidade_medida = "ºC"
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Umidade,
posicao = CanMessagePosicaoDados.Dados1,
indice = 1,
analise_health = true,
maximo = 90.0,
minimo = 20.0,
nominal = 60.0,
unidade_medida = "%"
},
2025-05-15 20:20:46 +00:00
}
},
new SensorModel()
{
ID = "CHVABT",
Descricao = "Chuva",
ID_Num = 37,
Componente = S_Code.sCHV,
Aferir = true,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.Chuva,
},
Parametros = new List<SensorParametroModel>()
{
new SensorParametroModel()
{
Descricao = "Canal MUX",
Valor = "-1",
QtdBytes = 1,
Escalar = false,
Enviar = true
},
},
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Chuva,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true,
maximo = 100.0,
minimo = 0.0,
nominal = 10.0,
unidade_medida = "%"
}
2025-05-15 20:20:46 +00:00
}
},
2024-07-24 20:04:55 +00:00
},
Servos = new List<SensorServoModel>()
{
new SensorServoModel()
{
ID = "FRO_ET",
2025-04-09 21:11:40 +00:00
ID_Num = 41,
Descricao = "Freio Motor ET",
Componente = S_Code.sFRO,
Controlar = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-07-24 20:04:55 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.ServoFreio,
},
_AnguloControle = 0,
2025-05-06 18:47:59 +00:00
Incremental = true,
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.ServoAnguloLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true
},
}
2024-07-24 20:04:55 +00:00
},
new SensorServoModel()
{
ID = "FRO_EF",
2025-04-09 21:11:40 +00:00
ID_Num = 42,
2024-07-24 20:04:55 +00:00
Descricao = "Freio Motor EF",
Componente = S_Code.sFRO,
Controlar = false,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-07-24 20:04:55 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.ServoFreio,
},
_AnguloControle = 0,
2025-05-06 18:47:59 +00:00
Incremental = true,
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.ServoAnguloLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true
},
}
2024-07-24 20:04:55 +00:00
},
new SensorServoModel()
{
ID = "FRO_DT",
2025-04-09 21:11:40 +00:00
ID_Num = 43,
2024-07-24 20:04:55 +00:00
Descricao = "Freio Motor DT",
Componente = S_Code.sFRO,
Controlar = true,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-07-24 20:04:55 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.ServoFreio,
},
2025-04-15 13:16:27 +00:00
_AnguloControle = 180,
2025-05-06 18:47:59 +00:00
Incremental = false,
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.ServoAnguloLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true
},
}
2024-07-24 20:04:55 +00:00
},
new SensorServoModel()
{
ID = "FRO_DF",
2025-04-09 21:11:40 +00:00
ID_Num = 44,
2024-07-24 20:04:55 +00:00
Descricao = "Freio Motor DF",
Componente = S_Code.sFRO,
Controlar = false,
2025-05-07 16:54:45 +00:00
Mandatorio = false,
2024-07-24 20:04:55 +00:00
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.ServoFreio,
},
2025-04-15 13:16:27 +00:00
_AnguloControle = 180,
2025-05-06 18:47:59 +00:00
Incremental = false,
ValoresLeituras = new List<SensorValoresLeituraModel>()
{
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Iniciado,
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.ServoAnguloLeitura,
posicao = CanMessagePosicaoDados.Dados1,
indice = 0,
analise_health = true
},
}
2024-07-24 20:04:55 +00:00
},
2025-04-30 21:49:17 +00:00
},
Reles = new List<SensorReleModel>(),
2025-04-30 21:49:17 +00:00
loRaService = new LoRaEspService()
{
ID = "LoRa",
ID_Num = Variaveis.ID_Num_sLRA,
Componente = S_Code.sLRA,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.M0,
FuncoesPinout.M1,
FuncoesPinout.Aux,
FuncoesPinout.RX,
FuncoesPinout.TX
},
Conectado = false,
Configurado = false,
2025-05-19 10:35:58 +00:00
ParametrosSet = new LoRaParametrosModel()
{
address = 2,
airRate = 0,
baudRate = 96,
parity = 0,
packetSize = 192,
power = 0,
tranMode = 64,
worCycle = 3,
channelRssi = 0,
lbt = 0,
packetRssi = 0,
channel = 23,
key = 0
},
ParametrosGet = new LoRaParametrosModel()
2025-04-30 21:49:17 +00:00
},
2023-11-30 00:41:22 +00:00
};
for (int i = 0; i < Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo; i++)
{
obj.CamerasSolo.Add(new OAKCameraModel());
}
return obj;
2023-11-30 00:41:22 +00:00
}
2024-12-02 19:12:39 +00:00
public void LimparDados<T>(T _dados)
2024-07-18 18:00:14 +00:00
{
2024-12-02 19:12:39 +00:00
var Dados = _dados as SensoriamentoModel;
Dados.DadosLeitura = new SensoriamentoMensagemJsonModel();
2024-07-24 20:04:55 +00:00
Dados.Reles.ForEach(x =>
{
x.StatusControle = Estado.Desligado;
2024-10-29 19:53:27 +00:00
});
Dados.Servos.ForEach(x =>
{
2025-04-15 19:30:39 +00:00
x._AnguloControle = x.Incremental ? 0 : 180;
2024-10-29 19:53:27 +00:00
});
2025-04-30 21:49:17 +00:00
loRaService.Conectado = false;
loRaService.Configurado = false;
2025-05-19 10:35:58 +00:00
loRaService.ParametrosGet.UltimaLeitura = DateTime.MinValue;
2024-10-29 19:53:27 +00:00
ReiniciarLeituras(Dados);
}
2024-12-02 19:12:39 +00:00
public void ReiniciarLeituras(SensoriamentoModel Dados)
2024-10-29 19:53:27 +00:00
{
Dados.Reles.ForEach(x =>
{
x.ValoresLeituras.ForEach(l =>
{
l.atual = new CanCommandFreqModel<dynamic>();
});
2024-07-24 20:04:55 +00:00
});
Dados.Sinaleiros.ForEach(x =>
{
x.ValoresLeituras.ForEach(l =>
{
l.atual = new CanCommandFreqModel<dynamic>();
});
2024-07-24 20:04:55 +00:00
});
2024-07-18 18:00:14 +00:00
Dados.Sensores.ForEach(x =>
{
x.ValoresLeituras.ForEach(l =>
{
l.atual = new CanCommandFreqModel<dynamic>();
});
2024-07-18 18:00:14 +00:00
});
2024-07-24 20:04:55 +00:00
Dados.Servos.ForEach(x =>
{
x.ValoresLeituras.ForEach(l =>
{
l.atual = new CanCommandFreqModel<dynamic>();
});
2024-07-24 20:04:55 +00:00
});
2024-07-18 18:00:14 +00:00
}
2025-05-06 18:47:59 +00:00
public async Task<bool> VerificaDispositivoConectado()
2023-11-30 00:41:22 +00:00
{
2025-07-17 17:53:42 +00:00
if (!CanManager.CanService.IsConnected) return false;
2025-05-06 18:47:59 +00:00
if (Variaveis.OperacaoEmAndamento.DispSen == null) return false;
2025-07-17 17:53:42 +00:00
CanManager.CanService.RegistrarHandler(_EnderecoCAN_Rx, _SenHandler);
2025-05-06 18:47:59 +00:00
RequisitarDadosModulo(Variaveis.ID_Num_sMOD, CanMessagePosicaoDados.Status, CanMessagePosicaoDados.Status, true);
2025-05-06 18:47:59 +00:00
DateTime Inicio = DateTime.Now;
bool Respondido() => Variaveis.OperacaoEmAndamento.DispSen.Dados.DadosLeitura.UltimoComandoRespondido > Inicio;
await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 500, 50);
2024-07-24 20:04:55 +00:00
if (Conectado)
2024-12-02 19:12:39 +00:00
{
2025-05-06 18:47:59 +00:00
DefinirDispositivo();
Variaveis.OperacaoEmAndamento.DispSen?.EnviarProtocolosConfiguracao();
2024-12-02 19:12:39 +00:00
}
return Conectado;
}
2025-04-09 21:11:40 +00:00
private void DefinirDispositivo()
{
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == DadosLeitura.Dispositivo && x.Mod_ID == Modulo_ID))
2025-04-09 21:11:40 +00:00
{
SerialService.DispositivosMapeados.Add(new DispositivoDetalhesModel()
{
2025-07-17 17:53:42 +00:00
Endereco = CanManager.CanService._portName,
2025-04-09 21:11:40 +00:00
Dispositivo = DadosLeitura.Dispositivo,
Versao = DadosLeitura.Versao.ToString(),
Mod_ID = Modulo_ID,
});
}
}
2025-05-01 18:27:01 +00:00
public void RequisitarDadosModulo(int ID_Num, CanMessagePosicaoDados posicaoTx, CanMessagePosicaoDados posicaoRx, bool aguardaResposta)
2025-04-09 21:11:40 +00:00
{
2025-05-01 18:27:01 +00:00
Variaveis.OperacaoEmAndamento.DispSen?.AdicionarMensagemFila(ID_Num, posicaoTx, posicaoRx, null, aguardaResposta);
}
2025-05-01 18:27:01 +00:00
public List<(int, CanMessagePosicaoDados, byte[])> ProtocoloConfiguracao(bool Conectar)
{
2025-04-09 21:11:40 +00:00
// Inicializar o dicionário
2025-05-01 18:27:01 +00:00
List<(int, CanMessagePosicaoDados, byte[])> config = new List<(int, CanMessagePosicaoDados, byte[])>();
2024-12-05 17:11:38 +00:00
2025-04-09 21:11:40 +00:00
if (!DadosLeitura.Conectado)
{
// Adicionar configuração do ProtocoloMOD
var protocoloMOD = ModConfig(Conectar);
config.AddRange(protocoloMOD);
2025-04-09 21:11:40 +00:00
}
bool configurarTodos = !DadosLeitura.Conectado && Conectar;
2025-04-09 21:11:40 +00:00
// Adicionar configurações dos Sinaleiros
2025-05-01 18:27:01 +00:00
var sinaleirosConfig = SinaleirosConfig(Conectar, configurarTodos);
2025-04-09 21:11:40 +00:00
config.AddRange(sinaleirosConfig);
// Adicionar configurações dos Servos
2025-05-01 18:27:01 +00:00
var servosConfig = ServosConfig(Conectar, configurarTodos);
2025-04-09 21:11:40 +00:00
config.AddRange(servosConfig);
// Adicionar configurações dos Reles
2025-05-01 18:27:01 +00:00
var relesConfig = RelesConfig(Conectar, configurarTodos);
2025-04-09 21:11:40 +00:00
config.AddRange(relesConfig);
// Adicionar configurações dos Sensores que devem ser aferidos
2025-05-01 18:27:01 +00:00
var sensoresConfig = SensoresConfig(Conectar, configurarTodos);
2025-04-09 21:11:40 +00:00
config.AddRange(sensoresConfig);
2025-04-30 21:49:17 +00:00
// Adicionar configurações do LoRa
if (!loRaService.Conectado || !loRaService.Configurado || configurarTodos)
{
2025-05-01 18:27:01 +00:00
var loraConfig = loRaService.ProtocoloConfiguracao(Pinout, Conectar);
config.AddRange(loraConfig);
2025-04-30 21:49:17 +00:00
}
2025-04-09 21:11:40 +00:00
return config;
}
2025-05-01 18:27:01 +00:00
private List<(int, CanMessagePosicaoDados, byte[])> ModConfig(bool Conectar)
{
var config1 = new List<byte>
2025-04-09 21:11:40 +00:00
{
(byte)(Conectar ? 1 : 0),
(byte)(_TaxaAmostragem / 10),
(byte)(RequisitarDados ? 1 : 0),
2025-04-30 21:49:17 +00:00
LoRaParametrosBase.address
2025-04-09 21:11:40 +00:00
};
2025-05-01 18:27:01 +00:00
config1.AddRange(PinoutModel.PinoProtocolo(Pinout, Funcoes, false));
2025-05-01 18:27:01 +00:00
return new List<(int, CanMessagePosicaoDados, byte[])>()
{
2025-05-01 18:27:01 +00:00
(Variaveis.ID_Num_sMOD, CanMessagePosicaoDados.Config1, config1.ToArray()),
};
}
2025-05-01 18:27:01 +00:00
public List<(int, CanMessagePosicaoDados, byte[])> SensoresConfig(bool Conectar, bool ConfigurarTodos)
{
2025-05-01 18:27:01 +00:00
var config = new List<(int, CanMessagePosicaoDados, byte[])>();
2024-12-05 17:11:38 +00:00
foreach (var sensor in Sensores.Where(x => (x.Aferir && (ConfigurarTodos ? true : x.Inicializado != Conectar)) || (!x.Aferir && x.Inicializado)))
2025-04-09 21:11:40 +00:00
{
if (!sensor.Aferir && sensor.Inicializado)
{
Conectar = false;
}
2025-05-01 18:27:01 +00:00
(CanMessagePosicaoDados posicao, byte[] payload) = sensor.ProtocoloConfiguracao(Pinout, Conectar, Dispositivo);
2025-04-09 21:11:40 +00:00
if (payload != null)
{
2025-05-01 18:27:01 +00:00
config.Add((sensor.ID_Num, posicao, payload));
2025-04-09 21:11:40 +00:00
}
}
2025-04-09 21:11:40 +00:00
return config;
}
2025-05-01 18:27:01 +00:00
private List<(int, CanMessagePosicaoDados, byte[])> SinaleirosConfig(bool Conectar, bool ConfigurarTodos)
{
2025-05-01 18:27:01 +00:00
var config = new List<(int, CanMessagePosicaoDados, byte[])>();
2024-12-05 17:11:38 +00:00
foreach (var sinaleiro in Sinaleiros.Where(x => (ConfigurarTodos ? true : x.Inicializado != Conectar)))
2025-04-09 21:11:40 +00:00
{
2025-05-01 18:27:01 +00:00
(CanMessagePosicaoDados posicao, var payload) = sinaleiro.ProtocoloConfiguracao(Pinout, Conectar);
2025-04-09 21:11:40 +00:00
if (payload != null)
{
2025-05-01 18:27:01 +00:00
config.Add((sinaleiro.ID_Num, posicao, payload));
2025-04-09 21:11:40 +00:00
}
}
2025-04-09 21:11:40 +00:00
return config;
2023-11-30 00:41:22 +00:00
}
2025-05-01 18:27:01 +00:00
private List<(int, CanMessagePosicaoDados, byte[])> RelesConfig(bool Conectar, bool ConfigurarTodos)
{
2025-05-01 18:27:01 +00:00
var config = new List<(int, CanMessagePosicaoDados, byte[])>();
foreach (var rele in Reles.Where(x => (x.Controlar && (ConfigurarTodos ? true : x.Inicializado != Conectar)) || (!x.Controlar && x.Inicializado)))
{
if (!rele.Controlar && rele.Inicializado)
{
Conectar = false;
}
2025-05-01 18:27:01 +00:00
(CanMessagePosicaoDados posicao, var payload) = rele.ProtocoloConfiguracao(Pinout, Conectar);
2025-04-09 21:11:40 +00:00
if (payload != null)
{
2025-05-01 18:27:01 +00:00
config.Add((rele.ID_Num, posicao, payload));
2025-04-09 21:11:40 +00:00
}
}
2025-04-09 21:11:40 +00:00
return config;
}
2025-05-01 18:27:01 +00:00
private List<(int, CanMessagePosicaoDados, byte[])> ServosConfig(bool Conectar, bool ConfigurarTodos)
2024-07-18 18:00:14 +00:00
{
2025-05-01 18:27:01 +00:00
var config = new List<(int, CanMessagePosicaoDados, byte[])>();
2025-04-09 21:11:40 +00:00
foreach (var servo in Servos.Where(x => (x.Controlar && (ConfigurarTodos ? true : x.Inicializado != Conectar)) || (!x.Controlar && x.Inicializado)))
2025-04-09 21:11:40 +00:00
{
if (!servo.Controlar && servo.Inicializado)
{
Conectar = false;
}
2025-05-01 18:27:01 +00:00
(CanMessagePosicaoDados posicao, var payload) = servo.ProtocoloConfiguracao(Pinout, Conectar);
2025-04-09 21:11:40 +00:00
if (payload != null)
{
2025-05-01 18:27:01 +00:00
config.Add((servo.ID_Num, posicao, payload));
2025-04-09 21:11:40 +00:00
}
}
return config;
2024-07-18 18:00:14 +00:00
}
2024-01-03 10:52:37 +00:00
public void IniciarRegistrador()
{
if (!(tmrRegistrador?.IsRunning ?? false))
{
LimparDados(this);
PararRegistrador();
tmrRegistrador = new AsyncTaskTimerModel("tmrRegistrador_" + T_Code.Sen.ToString(), tmrRegistrador_Tick, _TaxaAmostragem);
tmrRegistrador.Start();
}
}
2024-01-03 10:52:37 +00:00
public void PararRegistrador()
{
tmrRegistrador?.Dispose();
2024-01-03 10:52:37 +00:00
}
public async Task tmrRegistrador_Tick()
{
if (Variaveis.Fechando)
{
return;
}
tmrRegistrador.SetInterval(_TaxaAmostragem);
if (SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Sen) && (_VezesLeituraReconexao >= _TempoReconexaoComponentes))
{
Variaveis.OperacaoEmAndamento.DispSen?.EnviarProtocolosConfiguracao();
_VezesLeituraReconexao = 0;
}
else
{
_VezesLeituraReconexao++;
}
2025-04-09 21:11:40 +00:00
if (DadosLeitura.Conectado)
{
2024-12-03 20:55:25 +00:00
if (RequisitarDados)
{
2025-05-01 18:27:01 +00:00
RequisitarDadosModulo(Variaveis.ID_Num_sTOD, CanMessagePosicaoDados.DadosAll, CanMessagePosicaoDados.DadosAll, true);
2024-12-03 20:55:25 +00:00
}
2025-07-18 20:03:37 +00:00
VerificaControleLeitura();
}
2025-04-16 16:44:06 +00:00
AtualizaComponentesIniciados();
}
2024-10-03 18:21:30 +00:00
public (bool, List<string>) StatusModulosSEN()
{
var _Sensores = Sensores?.Where(x => x.Aferir).ToList();
2025-05-07 16:54:45 +00:00
var _SensoresComFalha = _Sensores?.Where(x => !x.Liberado).ToList();
bool _sensoresOperantes = (_SensoresComFalha?.Count() ?? 0) < (_Sensores?.Count() ?? 0);
2024-10-03 18:21:30 +00:00
var _Sinaleiros = Sinaleiros?.ToList();
var _SinaleirosComFalha = _Sinaleiros?.Where(x => !x.Inicializado).ToList();
bool _sinaleirosOperantes = !(_SinaleirosComFalha?.Any() ?? false);
2024-10-03 18:21:30 +00:00
var _Reles = Reles?.Where(x => x.Controlar).ToList();
2025-05-07 16:54:45 +00:00
var _RelesComFalha = _Reles?.Where(x => !x.Liberado).ToList();
bool _relesOperantes = !(_RelesComFalha?.Any() ?? false);
2024-10-03 18:21:30 +00:00
var _Servos = Servos?.Where(x => x.Controlar).ToList();
2025-05-07 16:54:45 +00:00
var _ServosComFalha = _Servos?.Where(x => !x.Liberado).ToList();
bool _servosOperantes = !(_ServosComFalha?.Any() ?? false);
2024-10-03 18:21:30 +00:00
2025-05-07 16:54:45 +00:00
bool _sensoriamentoOperante = _sinaleirosOperantes && _sensoresOperantes && _relesOperantes && _servosOperantes;
2024-10-03 18:21:30 +00:00
List<string> ModsComFalha =
(_SensoresComFalha?.Select(x => x.ID) ?? new List<string>())
.Union(_SinaleirosComFalha?.Select(x => x.ID) ?? new List<string>())
.Union(_RelesComFalha?.Select(x => x.ID) ?? new List<string>())
.Union(_ServosComFalha?.Select(x => x.ID) ?? new List<string>())
2024-10-03 18:21:30 +00:00
.ToList();
return (_sensoriamentoOperante, ModsComFalha);
}
2025-07-18 20:03:37 +00:00
private void VerificaControleLeitura()
{
if (true) // !frmDiagnosticos.Diagnosticando
{
var ledOP = Sinaleiros.FirstOrDefault(x => x.ID == "LEDOP" && x.Inicializado);
var ledAT = Sinaleiros.FirstOrDefault(x => x.ID == "LEDAT" && x.Inicializado);
var ledMN = Sinaleiros.FirstOrDefault(x => x.ID == "LEDMN" && x.Inicializado);
var comportamento = VariaveisEquipamento.ComportamentoPorStatus();
var valOp = (int?)(ledOP?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0;
if (ledOP != null && (!ledOP.Comportamento.Equals(comportamento) || valOp != (int)comportamento.statusLED))
{
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sLED, ledOP.ID, comportamento);
}
var statusLedAt = Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico ? StatusLED.Aceso : StatusLED.Apagado;
2025-07-18 20:03:37 +00:00
var valAt = (int?)(ledAT?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0;
if (ledAT != null && (!ledAT.Comportamento.statusLED.Equals(statusLedAt) || (valAt != (int)statusLedAt)))
{
ledAT.Comportamento.statusLED = statusLedAt;
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sLED, ledAT.ID, ledAT.Comportamento);
}
var statusLedMn = Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual ? StatusLED.Aceso : StatusLED.Apagado;
var valMn = (int?)(ledMN?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0;
if (ledMN != null && (!ledMN.Comportamento.statusLED.Equals(statusLedMn) || (valMn != (int)statusLedMn)))
{
ledMN.Comportamento.statusLED = statusLedMn;
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sLED, ledMN.ID, ledMN.Comportamento);
}
foreach (var rele in Reles.Where(x => x.Controlar && x.Inicializado && !x.ControleExterno))
{
int leituraEstado = (int?)(rele.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor) ?? 0;
if (leituraEstado != (int)rele.StatusControle)
{
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sRLE, rele.ID, rele.StatusControle);
}
}
foreach (var servo in Servos.Where(x => x.Controlar && x.Inicializado))
{
int leituraAngulo = (int?)(servo.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual?.valor) ?? 0;
if (leituraAngulo != servo._AnguloControle)
{
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sFRO, servo.ID, servo._AnguloControle);
}
}
}
}
2025-04-16 16:44:06 +00:00
private void AtualizaComponentesIniciados()
{
2025-07-17 11:19:42 +00:00
//AtualizarStatusComponentes();
//return;
2025-07-16 16:47:56 +00:00
2025-04-16 16:44:06 +00:00
DateTime Agora = DateTime.Now;
bool modConectado = DadosLeitura.UltimoComandoRespondido.AddMilliseconds(TempoLimiteConexao) > Agora;
if (!modConectado && DadosLeitura.Conectado)
{
DadosLeitura.Conectado = false;
}
foreach (var led in Sinaleiros.Where(x => x.Inicializado && x.UltimaLeitura.AddMilliseconds(TempoLimiteConexao) < Agora))
2025-04-16 16:44:06 +00:00
{
led.Inicializado = false;
2025-04-16 16:44:06 +00:00
}
foreach (var rele in Reles.Where(x => x.Inicializado && x.UltimaLeitura.AddMilliseconds(TempoLimiteConexao) < Agora))
2025-04-16 16:44:06 +00:00
{
rele.Inicializado = false;
2025-04-16 16:44:06 +00:00
}
foreach (var servo in Servos.Where(x => x.Inicializado && x.UltimaLeitura.AddMilliseconds(TempoLimiteConexao) < Agora))
2025-04-16 16:44:06 +00:00
{
servo.Inicializado = false;
2025-04-16 16:44:06 +00:00
}
foreach (var sensor in Sensores.Where(x => x.Inicializado && x.UltimaLeitura.AddMilliseconds(TempoLimiteConexao) < Agora))
2025-04-16 16:44:06 +00:00
{
sensor.Inicializado = false;
2025-04-16 16:44:06 +00:00
}
}
2025-07-16 16:47:56 +00:00
public void AtualizarStatusComponentes()
{
var StatusSaudaveis = new List<StatusModulo>() { StatusModulo.Desconectado, StatusModulo.Falha };
var saudeSen = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesSaudeModel>(RedisService.ModKey(T_Code.Sen), "saude");
DadosLeitura.Conectado = !StatusSaudaveis.Contains(saudeSen?.status ?? StatusModulo.Desconectado);
if (DadosLeitura.Conectado)
{
var objetos =
Sensores
.Select(x => new
{
Chave = "sensores",
Componente = x.Componente,
ID_Num = x.ID_Num
})
.Union(Servos
.Select(x => new
{
Chave = "servos",
Componente = x.Componente,
ID_Num = x.ID_Num
}))
.ToList();
foreach (var sensor in objetos)
{
string chave = sensor.Chave;
int tipo = (int)sensor.Componente;
int id = sensor.ID_Num;
string basePath = $"{chave}.{tipo}.{id}";
var saude = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesSaudeModel>(RedisService.ModKey(T_Code.Sen), $"{basePath}.saude");
bool inicializado = !StatusSaudaveis.Contains(saude?.status ?? StatusModulo.Desconectado);
switch (chave)
{
case "sensores":
Sensores.FirstOrDefault(x => x.ID_Num == sensor.ID_Num).Inicializado = inicializado;
break;
case "servos":
Servos.FirstOrDefault(x => x.ID_Num == sensor.ID_Num).Inicializado = inicializado;
break;
}
}
}
else
{
foreach (var led in Sinaleiros.Where(x => x.Inicializado))
{
led.Inicializado = false;
}
foreach (var rele in Reles.Where(x => x.Inicializado))
{
rele.Inicializado = false;
}
foreach (var servo in Servos.Where(x => x.Inicializado))
{
servo.Inicializado = false;
}
foreach (var sensor in Sensores.Where(x => x.Inicializado))
{
sensor.Inicializado = false;
}
}
}
2023-11-30 00:41:22 +00:00
}
public class SensorModel
{
public string ID { get; set; }
2025-04-09 21:11:40 +00:00
public int ID_Num { get; set; }
2023-11-30 00:41:22 +00:00
public string Descricao { get; set; }
public S_Code Componente { get; set; }
public bool Aferir { get; set; } = false;
2025-05-07 16:54:45 +00:00
public bool Mandatorio { get; set; }
public bool Liberado
{
get
{
return !Mandatorio || (Aferir && Inicializado);
}
}
public bool Inicializado { get; set; }
public DateTime UltimaLeitura
{
get
{
return ValoresLeituras.OrderByDescending(x => x.atual.lidoEm).FirstOrDefault()?.atual?.lidoEm ?? DateTime.MinValue;
}
}
2023-11-30 00:41:22 +00:00
public List<FuncoesPinout> Funcoes { get; set; }
2025-04-09 21:11:40 +00:00
public List<SensorParametroModel> Parametros { get; set;} = new List<SensorParametroModel>();
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; } = new List<SensorValoresLeituraModel>();
2023-11-30 00:41:22 +00:00
2025-05-01 18:27:01 +00:00
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel Pinout, bool conectar, T_Code Dispositivo)
2023-11-30 00:41:22 +00:00
{
2025-04-09 21:11:40 +00:00
List<byte> config = new List<byte>
{
(byte)Componente,
2025-04-09 21:11:40 +00:00
(byte)(conectar ? 1 : 0),
};
var _pinout = Pinout.Clone();
2024-04-15 10:57:37 +00:00
_pinout.Pinos = _pinout.Pinos.Where(x => x.ComponenteID == ID).ToList();
2025-04-09 21:11:40 +00:00
if (_pinout.Pinos.Count > 0)
2024-01-23 17:10:34 +00:00
{
bool enviaBarramento = Dispositivo == T_Code.Sen;
byte[] pinos = PinoutModel.PinoProtocolo(_pinout, Funcoes, enviaBarramento);
2025-04-09 21:11:40 +00:00
config.AddRange(pinos);
2024-01-23 17:10:34 +00:00
}
2025-04-09 21:11:40 +00:00
foreach (var parametro in Parametros)
{
if (parametro.Enviar)
{
byte[] paramBytes = parametro.InterpretarParametro();
config.AddRange(paramBytes);
}
}
2025-05-01 18:27:01 +00:00
return (CanMessagePosicaoDados.Config1, config.ToArray());
}
2025-04-09 21:11:40 +00:00
2023-11-30 00:41:22 +00:00
}
public class SensorSinaleiroModel
{
public string ID { get; set; }
2025-04-09 21:11:40 +00:00
public int ID_Num { get; set; }
public string Descricao { get; set; }
public S_Code Componente { get; set; }
public List<FuncoesPinout> Funcoes { get; set; }
public SensorSinaleiroComportamentoModel Comportamento { get; set; }
public bool Inicializado { get; set; }
public DateTime UltimaLeitura
2024-12-03 20:55:25 +00:00
{
get
{
return ValoresLeituras.OrderByDescending(x => x.atual.lidoEm).FirstOrDefault()?.atual?.lidoEm ?? DateTime.MinValue;
2024-12-03 20:55:25 +00:00
}
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; } = new List<SensorValoresLeituraModel>();
2025-05-01 18:27:01 +00:00
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar)
{
2025-04-09 21:11:40 +00:00
var pino = pinout.Pinos.FirstOrDefault(p => p.ComponenteID == ID);
List<byte> config = new List<byte>
2024-04-15 10:57:37 +00:00
{
(byte)Componente,
2025-04-09 21:11:40 +00:00
(byte)(conectar ? 1 : 0),
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
(byte)(pino?.Pino ?? PinoutUtils.PINO_INVALIDO)
2024-04-15 10:57:37 +00:00
};
2025-04-09 21:11:40 +00:00
2025-05-01 18:27:01 +00:00
return (CanMessagePosicaoDados.Config1, config.ToArray());
}
2025-05-01 18:27:01 +00:00
public (int, CanMessagePosicaoDados, byte[]) ProtocoloComando()
{
2025-04-09 21:11:40 +00:00
List<byte> frame = new List<byte>
{
(byte)Comportamento.statusLED,
(byte)Comportamento.QtdPiscadas,
(byte)(Comportamento.TempoMs / 10),
(byte)(Comportamento.PausaMs / 10)
};
2025-05-01 18:27:01 +00:00
return (ID_Num, CanMessagePosicaoDados.Command1, frame.ToArray());
}
2024-07-18 18:00:14 +00:00
}
public class SensorReleModel
{
public string ID { get; set; }
2025-04-09 21:11:40 +00:00
public int ID_Num { get; set; }
2024-07-18 18:00:14 +00:00
public string Descricao { get; set; }
public S_Code Componente { get; set; }
public List<FuncoesPinout> Funcoes { get; set; }
public bool ControleExterno { get; set; }
2024-07-24 20:04:55 +00:00
public bool Controlar { get; set; }
2025-05-07 16:54:45 +00:00
public bool Mandatorio { get; set; }
public bool Liberado
{
get
{
return !Mandatorio || (Controlar && Inicializado);
}
}
public bool AtuacaoNivelAlto { get; set; }
2024-07-18 18:00:14 +00:00
public Estado StatusControle { get; set; }
public bool Inicializado { get; set; }
public DateTime UltimaLeitura
2024-12-03 20:55:25 +00:00
{
get
{
return ValoresLeituras.OrderByDescending(x => x.atual.lidoEm).FirstOrDefault()?.atual?.lidoEm ?? DateTime.MinValue;
2024-12-03 20:55:25 +00:00
}
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; } = new List<SensorValoresLeituraModel>();
2024-07-18 18:00:14 +00:00
2025-05-01 18:27:01 +00:00
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar)
2024-07-18 18:00:14 +00:00
{
2025-04-09 21:11:40 +00:00
var pino = pinout.Pinos.FirstOrDefault(p => p.ComponenteID == ID);
List<byte> config = new List<byte>
2024-07-18 18:00:14 +00:00
{
(byte)Componente,
2025-04-09 21:11:40 +00:00
(byte)(conectar ? 1 : 0),
(byte)(AtuacaoNivelAlto ? 1 : 0),
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
(byte)(pino?.Pino ?? PinoutUtils.PINO_INVALIDO)
2024-07-18 18:00:14 +00:00
};
2025-04-09 21:11:40 +00:00
2025-05-01 18:27:01 +00:00
return (CanMessagePosicaoDados.Config1, config.ToArray());
2024-07-18 18:00:14 +00:00
}
2025-05-01 18:27:01 +00:00
public (int, CanMessagePosicaoDados, byte[]) ProtocoloComando()
2024-07-18 18:00:14 +00:00
{
2025-04-09 21:11:40 +00:00
return (
2025-05-01 18:27:01 +00:00
ID_Num,
CanMessagePosicaoDados.Command1,
2025-04-09 21:11:40 +00:00
new byte[]
{
(byte)StatusControle
}
);
2024-07-24 20:04:55 +00:00
}
}
public class SensorServoModel
{
public string ID { get; set; }
2025-04-09 21:11:40 +00:00
public int ID_Num { get; set; }
2024-07-24 20:04:55 +00:00
public string Descricao { get; set; }
public S_Code Componente { get; set; }
public List<FuncoesPinout> Funcoes { get; set; }
2025-04-15 19:30:39 +00:00
public bool Incremental { get; set; }
2024-07-24 20:04:55 +00:00
public bool Controlar { get; set; }
2025-05-07 16:54:45 +00:00
public bool Mandatorio { get; set; }
public bool Liberado
{
get
{
return !Mandatorio || (Controlar && Inicializado);
}
}
2024-07-24 20:04:55 +00:00
public int _AnguloControle { get; set; }
public bool Inicializado { get; set; }
public DateTime UltimaLeitura
2024-12-03 20:55:25 +00:00
{
get
{
return ValoresLeituras.OrderByDescending(x => x.atual.lidoEm).FirstOrDefault()?.atual?.lidoEm ?? DateTime.MinValue;
2024-12-03 20:55:25 +00:00
}
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; } = new List<SensorValoresLeituraModel>();
2024-07-24 20:04:55 +00:00
2025-05-01 18:27:01 +00:00
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar)
2024-07-24 20:04:55 +00:00
{
2025-04-09 21:11:40 +00:00
var pino = pinout.Pinos.FirstOrDefault(p => p.ComponenteID == ID);
2024-11-25 12:14:59 +00:00
2025-04-09 21:11:40 +00:00
List<byte> config = new List<byte>
{
(byte)Componente,
2025-04-09 21:11:40 +00:00
(byte)(conectar ? 1 : 0),
2025-04-15 19:30:39 +00:00
(byte)(Incremental ? 1 : 0),
2025-04-09 21:11:40 +00:00
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
(byte)(pino?.Pino ?? PinoutUtils.PINO_INVALIDO)
};
2025-05-01 18:27:01 +00:00
return (CanMessagePosicaoDados.Config1, config.ToArray());
2024-07-24 20:04:55 +00:00
}
2025-05-01 18:27:01 +00:00
public (int, CanMessagePosicaoDados, byte[]) ProtocoloComando()
2024-07-24 20:04:55 +00:00
{
2025-04-09 21:11:40 +00:00
return (
2025-05-01 18:27:01 +00:00
ID_Num,
CanMessagePosicaoDados.Command1,
2025-04-09 21:11:40 +00:00
new byte[]
{
(byte)_AnguloControle
}
);
2024-07-18 18:00:14 +00:00
}
}
2024-07-18 18:00:14 +00:00
public class SensorSinaleiroComportamentoModel
{
public StatusLED statusLED { get; set; }
public int QtdPiscadas { get; set; } = 0;
public int TempoMs { get; set; } = 0;
public int PausaMs { get; set; } = 0;
2024-07-18 18:00:14 +00:00
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
SensorSinaleiroComportamentoModel other = (SensorSinaleiroComportamentoModel)obj;
return statusLED == other.statusLED &&
QtdPiscadas == other.QtdPiscadas &&
TempoMs == other.TempoMs &&
PausaMs == other.PausaMs;
}
public override int GetHashCode()
{
unchecked // Permite overflow de inteiros
{
int hash = 17;
hash = hash * 23 + statusLED.GetHashCode();
hash = hash * 23 + QtdPiscadas.GetHashCode();
hash = hash * 23 + TempoMs.GetHashCode();
hash = hash * 23 + PausaMs.GetHashCode();
return hash;
}
}
public static bool operator ==(SensorSinaleiroComportamentoModel left, SensorSinaleiroComportamentoModel right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if ((object)left == null || (object)right == null)
{
return false;
}
return left.Equals(right);
}
public static bool operator !=(SensorSinaleiroComportamentoModel left, SensorSinaleiroComportamentoModel right)
{
return !(left == right);
}
}
2023-11-30 00:41:22 +00:00
public class SenSensorimanetoGrafico
{
public DateTime Momento { get; set; }
public string ComponenteID { get; set; }
public S_Code Componente { get; set; }
public double Leitura1 { get; set; }
public double Leitura2 { get; set; }
public double Leitura3 { get; set; }
public double Leitura4 { get; set; }
public bool AlarmeMaxima { get; set; }
public bool AlarmeMinima { get; set; }
}
2024-04-15 10:57:37 +00:00
2025-04-09 21:11:40 +00:00
public class SensorParametroModel
{
public string Descricao { get; set; }
public string Valor { get; set; }
public int QtdBytes { get; set; }
public bool Escalar { get; set; }
public bool Enviar { get; set; }
public byte[] InterpretarParametro()
{
string valor = Valor.Replace(",", ".").Trim();
2025-04-09 21:11:40 +00:00
// HEX direto
if (valor.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
{
byte parsedHex = Convert.ToByte(valor, 16);
return QtdBytes == 2 ? new byte[] { 0x00, parsedHex } : new byte[] { parsedHex };
}
// FLOAT com ou sem ponto
float f = float.Parse(valor, CultureInfo.InvariantCulture);
ushort final = (ushort)(Escalar ? f * 100 : f);
if (QtdBytes == 1)
return new byte[] { (byte)(final & 0xFF) };
return new byte[] {
(byte)(final >> 8),
(byte)(final & 0xFF)
};
}
}
public class SensorValoresLeituraModel
{
public FuncoesPinout funcao { get; set; }
public CanMessagePosicaoDados posicao { get; set; }
public int indice { get; set; }
public double minimo { get; set; }
public double maximo { get; set; }
public double nominal { get; set; }
public double offset { get; set; } = 0.0;
public CanCommandFreqModel<dynamic> atual { get; set; } = new CanCommandFreqModel<dynamic>();
public bool analise_health { get; set; } = false;
public string unidade_medida { get; set; }
}
2025-05-15 20:20:46 +00:00
public class FirmwareSensorTemperaturaNTC : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Temperatura { get; set; } = new CanCommandFreqModel<double>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareSensorCorrente : IFirmwareSensorBase
{
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> BusVoltage { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> ShuntVoltage { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Current { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Power { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Energy { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Temperature { get; set; } = new CanCommandFreqModel<double>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareSinaleiro : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<StatusLED> Leitura { get; set; } = new CanCommandFreqModel<StatusLED>();
public CanCommandFreqModel<StatusLED> Comando { get; set; } = new CanCommandFreqModel<StatusLED>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareRele : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<Estado> Leitura { get; set; } = new CanCommandFreqModel<Estado>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareServoFreio : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Angulo { get; set; } = new CanCommandFreqModel<double>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareSensorFluxo : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Vazao { get; set; } = new CanCommandFreqModel<double>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareSensorMassa : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Massa { get; set; } = new CanCommandFreqModel<double>();
}
2025-04-09 21:11:40 +00:00
public class FirmwareSensorPressao : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-03-06 20:15:56 +00:00
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Pressao { get; set; } = new CanCommandFreqModel<double>();
}
2025-04-14 16:37:53 +00:00
public class FirmwareSensorIMU : IFirmwareSensorBase
{
2025-04-16 16:44:06 +00:00
public DateTime Momento { get; set; }
2025-04-14 16:37:53 +00:00
public string ID { get; set; }
2025-04-16 16:44:06 +00:00
public int ID_Num { get; set; }
2025-04-14 16:37:53 +00:00
public bool Iniciado { get; set; }
public double AccX { get; set; }
public double AccY { get; set; }
public double AccZ { get; set; }
public double GyrX { get; set; }
public double GyrY { get; set; }
public double GyrZ { get; set; }
public double MagX { get; set; }
public double MagY { get; set; }
public double MagZ { get; set; }
public double Temperatura { get; set; }
public double Pressao { get; set; }
public double Altitude { get; set; }
public double Roll { get; set; }
public double Pitch { get; set; }
public double Yaw { get; set; }
2025-04-15 18:18:04 +00:00
public double YawFixed
{
get
{
double angulo = Yaw;
// ✅ Aplica o offset armazenado
return GPSUtils.NormalizarAngulo(GPSUtils.NormalizarAngulo(angulo) + Offset);
}
}
public double Offset { get; set; } = 0.0;
private DateTime ultimaAtualizacaoOffset = DateTime.MinValue;
public void AtualizarOffset(GPSModel UltimaLeitura)
{
// Verifica se a qualidade do GPS é boa
if (UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFixo || UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFlutuante)
{
// Só atualiza o offset se a última atualização foi há pelo menos 2 segundos (evita variações rápidas)
if ((DateTime.Now - ultimaAtualizacaoOffset).TotalSeconds > 2)
{
// Suaviza a mudança do offset para evitar grandes variações
double novoOffset = UltimaLeitura.OrientacaoReal - YawFixed;
Offset = (Offset * 0.8) + (novoOffset * 0.2); // Filtro exponencial
// Atualiza o tempo da última atualização
ultimaAtualizacaoOffset = DateTime.Now;
}
}
}
public FirmwareSensorIMU Clone()
{
return new FirmwareSensorIMU()
{
2025-04-16 16:44:06 +00:00
ID_Num = ID_Num,
2025-04-15 18:18:04 +00:00
Iniciado = Iniciado,
Pitch = Pitch,
Roll = Roll,
Yaw = Yaw,
Temperatura = Temperatura,
Altitude = Altitude,
Pressao = Pressao,
AccX = AccX,
AccY = AccY,
AccZ = AccZ,
MagX = MagX,
MagY = MagY,
MagZ = MagZ,
GyrX = GyrX,
GyrY = GyrY,
GyrZ = GyrZ,
Offset = Offset,
};
}
2025-05-15 20:20:46 +00:00
public string DadosToString()
{
return
$"[IMU] " +
$"Iniciado: {Iniciado}, " +
$"AccX: {AccX}, " +
$"AccY: {AccY}, " +
$"AccZ: {AccZ}, " +
$"GyrX: {GyrX}, " +
$"GyrY: {GyrY}, " +
$"GyrZ: {GyrZ}, " +
$"MagX: {MagX}, " +
$"MagY: {MagY}, " +
$"MagZ: {MagZ}, " +
$"Temperatura: {Temperatura}, " +
$"Pressao: {Pressao}, " +
$"Altitude: {Altitude}, " +
$"Roll: {Roll}, " +
$"Pitch: {Pitch}, " +
$"Yaw: {Yaw}, " +
$"Yaw Corrigido: {YawFixed}";
}
}
2025-05-15 20:20:46 +00:00
public class FirmwareSensorGas : IFirmwareSensorBase
2025-04-09 21:11:40 +00:00
{
2025-05-15 20:20:46 +00:00
public DateTime Momento { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> PPM { get; set; } = new CanCommandFreqModel<double>();
2025-05-15 20:20:46 +00:00
}
public class FirmwareSensorTemperaturaSHT : IFirmwareSensorBase
{
public DateTime Momento { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Temperatura { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Umidade { get; set; } = new CanCommandFreqModel<double>();
2025-05-15 20:20:46 +00:00
}
public class FirmwareSensorLuminosidade : IFirmwareSensorBase
{
public DateTime Momento { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Lux { get; set; } = new CanCommandFreqModel<double>();
2025-05-15 20:20:46 +00:00
}
public class FirmwareSensorLuzUV : IFirmwareSensorBase
{
public DateTime Momento { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> IndiceUV { get; set; } = new CanCommandFreqModel<double>();
2025-05-15 20:20:46 +00:00
}
public class FirmwareSensorQualidadeAr : IFirmwareSensorBase
{
public DateTime Momento { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> TVOC { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> ECO2 { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> AQI { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Temperatura { get; set; } = new CanCommandFreqModel<double>();
public CanCommandFreqModel<double> Umidade { get; set; } = new CanCommandFreqModel<double>();
2025-05-15 20:20:46 +00:00
}
public class FirmwareSensorChuva : IFirmwareSensorBase
{
public DateTime Momento { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Iniciado { get; set; }
public CanCommandFreqModel<double> Percentual { get; set; } = new CanCommandFreqModel<double>();
2025-05-15 20:20:46 +00:00
}
public class SensoriamentoMensagemJsonModel
{
public DateTime Momento { get; set; }
public bool Conectado { get; set; }
public T_Code Dispositivo { get; set; }
public int Versao { get; set; }
public string Mod_ID { get; set; }
public int QualidadeWifi { get; set; }
public int LatenciaLoop { get; set; }
public DateTime UltimoComandoRespondido { get; set; } = DateTime.MinValue;
public List<SensorModel> Sensores { get; set; }
public List<SensorSinaleiroModel> Sinaleiros { get; set; }
public List<SensorReleModel> Reles { get; set; }
public List<SensorServoModel> Servos { get; set; }
2025-05-15 20:20:46 +00:00
}
public class SenHandler : ICanMessageHandler
{
public T_Code Dispositivo { get; set; } = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Dispositivo ?? T_Code.Sen;
private double ConverterByteParaDouble(byte[] data, int idx)
{
int raw = (data[idx] << 8) | data[idx + 1];
short _short = (short)raw;
double _value = _short / 100.0;
return _value;
}
private double ConverterBytesParaDouble32(byte[] data, int idx)
{
int valor = (data[idx] << 24) | (data[idx + 1] << 16) | (data[idx + 2] << 8) | data[idx + 3];
return valor / 100.0;
}
private double ConverterValorEscala(byte[] data, int idx, double escala)
{
int raw = (data[idx] << 8) | data[idx + 1];
return raw * escala;
2025-04-15 18:18:04 +00:00
}
private S_Code DetectarComponenteDoID_Num(int ID_Num)
{
if (ID_Num == Variaveis.ID_Num_sMOD) return S_Code.sMOD;
2025-05-01 18:27:01 +00:00
if (ID_Num == Variaveis.ID_Num_sTOD) return S_Code.sTOD;
2025-04-30 21:49:17 +00:00
if (ID_Num == Variaveis.ID_Num_sLRA) return S_Code.sLRA;
var Disp = Variaveis.OperacaoEmAndamento.DispSen.Dados;
var sensor = Disp.Sensores.FirstOrDefault(x => x.ID_Num == ID_Num);
var rele = Disp.Reles.FirstOrDefault(x => x.ID_Num == ID_Num);
var sinaleiro = Disp.Sinaleiros.FirstOrDefault(x => x.ID_Num == ID_Num);
var servo = Disp.Servos.FirstOrDefault(x => x.ID_Num == ID_Num);
return sensor?.Componente ?? rele?.Componente ?? sinaleiro?.Componente ?? servo?.Componente ?? S_Code.sVZO;
}
private void AtualizarDados(int CompID_Num, CanMessagePosicaoDados Posicao, S_Code componente, List<dynamic> Parametros)
{
var Dados = Variaveis.OperacaoEmAndamento.DispSen.Dados;
var sensor = Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
var rele = Dados.Reles.FirstOrDefault(x => x.ID_Num == CompID_Num);
var sinaleiro = Dados.Sinaleiros.FirstOrDefault(x => x.ID_Num == CompID_Num);
var servo = Dados.Servos.FirstOrDefault(x => x.ID_Num == CompID_Num);
List<SensorValoresLeituraModel> valoresLeituras = new List<SensorValoresLeituraModel>();
2025-04-14 16:37:53 +00:00
if (sensor != null) valoresLeituras = sensor.ValoresLeituras;
else if (rele != null) valoresLeituras = rele.ValoresLeituras;
else if (sinaleiro != null) valoresLeituras = sinaleiro.ValoresLeituras;
else if (servo != null) valoresLeituras = servo.ValoresLeituras;
2025-05-15 20:20:46 +00:00
for (int i = 0; i < valoresLeituras.Where(x => x.posicao == Posicao).Count(); i++)
{
try
{
var valor = valoresLeituras.FirstOrDefault(x => x.posicao == Posicao && x.indice == i);
if (valor != null)
{
var v = Parametros.Count > i ? (Parametros[i]) : -1;
if (v is sbyte || v is byte || v is short || v is ushort || v is int || v is uint || v is long || v is ulong || v is float || v is double || v is decimal)
{
v += valor.offset;
valor.atual.valor = v;
}
else
{
valor.atual.valor = v;
}
if (Posicao == CanMessagePosicaoDados.Status)
{
if (sensor != null)
sensor.Inicializado = v;
if (rele != null)
rele.Inicializado = v;
if (sinaleiro != null)
sinaleiro.Inicializado = v;
if (servo != null)
servo.Inicializado = v;
}
}
}
catch (Exception ex)
{
}
}
}
2025-04-09 21:11:40 +00:00
public void ProcessarMensagem(CanMessage mensagem)
{
2025-05-01 18:27:01 +00:00
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)mensagem.DataRx[0];
byte ID_Num = mensagem.DataRx[1];
2025-04-09 21:11:40 +00:00
var data = mensagem.DataRx;
S_Code componente = DetectarComponenteDoID_Num(ID_Num);
var Dados = Variaveis.OperacaoEmAndamento.DispSen.Dados;
2025-07-17 17:53:42 +00:00
//Console.WriteLine($"[SEN] Componente={componente.ToString()}, ID_Num={ID_Num}, Posicao={posicao.ToString()}, Data={FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
2025-05-09 20:17:28 +00:00
switch (componente)
2025-04-09 21:11:40 +00:00
{
2025-05-09 20:17:28 +00:00
case S_Code.sMOD:
2025-04-09 21:11:40 +00:00
{
2025-05-09 20:17:28 +00:00
switch (posicao)
{
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Status:
2025-04-30 21:49:17 +00:00
{
T_Code tipoModulo = (T_Code)data[2];
bool conectado = data[3] == 1;
int versao = data[4];
2025-04-09 21:11:40 +00:00
2025-07-17 17:53:42 +00:00
//Console.WriteLine($"[SEN] Resposta {ID_Num} recebida. Tipo={tipoModulo}, Conectado={conectado}, Versão={versao}");
2025-04-09 21:11:40 +00:00
Dados.DadosLeitura.Conectado = conectado;
Dados.DadosLeitura.Dispositivo = tipoModulo;
Dados.DadosLeitura.Versao = versao;
2025-04-30 21:49:17 +00:00
break;
}
2025-05-09 20:17:28 +00:00
}
break;
}
case S_Code.sLRA:
{
var loraService = Dados.loRaService;
2025-05-09 20:17:28 +00:00
switch (posicao)
{
case CanMessagePosicaoDados.Status:
2025-04-30 21:49:17 +00:00
{
bool Conectado = data[2] == 1;
bool Configurado = data[3] == 1;
Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Conectado={Conectado}, Configurado={Configurado}");
loraService.Conectado = Conectado;
loraService.Configurado = Configurado;
break;
}
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Dados1:
2025-04-30 21:49:17 +00:00
{
byte address = data[2];
byte baudAndAirRate = data[3];
byte baud = (byte)(baudAndAirRate & 0b11100000);
byte airRate = (byte)((baudAndAirRate & 0b00011100) >> 2);
byte packetSizeAndPower = data[4];
byte packetSize = (byte)((packetSizeAndPower & 0b11000000));
byte power = (byte)(packetSizeAndPower & 0b00000011);
byte channel = data[5];
byte tranModeAndWorCycle = data[6];
byte tranMode = (byte)(tranModeAndWorCycle & 0b01000000);
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")}");
2025-05-19 10:35:58 +00:00
loraService.ParametrosGet.address = address;
loraService.ParametrosGet.baudRate = baud;
loraService.ParametrosGet.airRate = airRate;
loraService.ParametrosGet.packetSize = packetSize;
loraService.ParametrosGet.power = power;
loraService.ParametrosGet.channel = channel;
loraService.ParametrosGet.worCycle = worCycle;
loraService.ParametrosGet.tranMode = tranMode;
2025-04-30 21:49:17 +00:00
break;
}
2025-04-14 16:37:53 +00:00
default:
{
2025-05-09 20:17:28 +00:00
DadosLoRaParse tipoDado = (DadosLoRaParse)posicao;
switch (tipoDado)
{
case DadosLoRaParse.ComandoControle:
{
Keys tecla = (Keys)data[2];
int percentualVelocidadeSp = data[3];
TipoMovimentoDirecional tipoMovimentoDirecional = (TipoMovimentoDirecional)data[4];
int anguloMp = data[5];
//int velocidadeMp = data[6];
T_Code dispositivo = (T_Code)data[6];
bool emergencia = data[7] == 1;
OperacaoControleBaseModel Controle = new OperacaoControleBaseModel()
{
Momento = DateTime.Now,
Tecla = tecla,
AnguloMP = anguloMp,
Emergencia = emergencia,
PercentualVelocidadeSP = percentualVelocidadeSp,
TipoMovimento = tipoMovimentoDirecional,
//VelocidadeMP = velocidadeMp,
Dispositivo = dispositivo
};
Variaveis.OperacaoEmAndamento.ExecutaComandoDaBase(Controle);
break;
}
case DadosLoRaParse.DadosLivre:
{
Console.WriteLine("[LRA] Dados livres LORA recebidos da base: " + FuncoesGlobais.ConverterComandoBytesParaTexto(data));
break;
}
case DadosLoRaParse.GpsQualidade:
{
bool iniciado = data[2] == 1;
TiposCorrecaoGPS qualidadeFix = (TiposCorrecaoGPS)data[3];
int numeroSatelites = data[4];
double precisao = LoRaSerializer.DescompactarDecimal(data, 5);
VariaveisOperacao.PosicaoBase.Inicializado = iniciado;
VariaveisOperacao.PosicaoBase.QualidadeFix = qualidadeFix;
VariaveisOperacao.PosicaoBase.NumeroSatelites.valor = numeroSatelites;
2025-05-09 20:17:28 +00:00
VariaveisOperacao.PosicaoBase.PrecisaoHorizontal = precisao;
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
break;
}
case DadosLoRaParse.GpsLatitude:
{
double _lat = LoRaSerializer.DescompactarCoordenada(data.Skip(2).ToArray());
VariaveisOperacao.PosicaoBase.Latitude = _lat;
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
break;
}
case DadosLoRaParse.GpsLongitude:
{
double _long = LoRaSerializer.DescompactarCoordenada(data.Skip(2).ToArray());
VariaveisOperacao.PosicaoBase.Longitude = _long;
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
break;
}
case DadosLoRaParse.GpsGerais:
{
double _altitude = LoRaSerializer.DescompactarDecimal(data, 2);
double _velocidade = LoRaSerializer.DescompactarDecimal(data, 4);
double _orientacao = LoRaSerializer.DescompactarDecimal(data, 6);
VariaveisOperacao.PosicaoBase.Altitude = _altitude;
VariaveisOperacao.PosicaoBase.Velocidade = _velocidade;
VariaveisOperacao.PosicaoBase.OrientacaoReal = _orientacao;
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
break;
}
}
2025-04-14 16:37:53 +00:00
break;
}
}
2025-05-19 10:35:58 +00:00
loraService.ParametrosGet.UltimaLeitura = DateTime.Now;
2025-04-14 16:37:53 +00:00
break;
}
2025-05-09 20:17:28 +00:00
case S_Code.sTOD:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
switch (posicao)
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.DadosAll:
2025-04-24 11:49:04 +00:00
{
2025-05-15 20:20:46 +00:00
double latenciaLoop = ConverterByteParaDouble(data, 2) * 100;
Dados.DadosLeitura.LatenciaLoop = Convert.ToInt32(latenciaLoop);
2025-07-17 17:53:42 +00:00
//Console.WriteLine($"[SEN] Ciclo concluido. Latencia de loop: {latenciaLoop} ms");
2025-04-24 11:49:04 +00:00
break;
}
2025-05-09 20:17:28 +00:00
}
break;
}
2025-05-15 20:20:46 +00:00
case S_Code.sNTC:
2025-05-09 20:17:28 +00:00
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
2025-04-14 16:37:53 +00:00
{
double temperatura = ConverterByteParaDouble(data, 2);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { temperatura });
2025-04-14 16:37:53 +00:00
break;
}
2025-05-09 20:17:28 +00:00
}
break;
}
case S_Code.sCOR:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
2025-04-30 21:49:17 +00:00
{
2025-05-09 20:17:28 +00:00
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-04-30 21:49:17 +00:00
break;
}
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Dados1:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
double busVoltage = ConverterByteParaDouble(data, 2); // continua igual
double current = ConverterByteParaDouble(data, 4) * 1000.0; // volts / 100, amps * 10 (volta para mA)
double power = ConverterByteParaDouble(data, 6) * 1000.0; // volta para mW
//Console.WriteLine($"[AB36V] Tensao {busVoltage}, Corrente: {current}, Power: {power}");
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { busVoltage, current, power });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados2:
{
double energia = ConverterByteParaDouble(data, 2) * 1000.0; // volta para mWh
double temperatura = ConverterByteParaDouble(data, 4); // volta para °C
double codAlarme = ConverterByteParaDouble(data, 6) * 100; // volta para °C
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { energia, temperatura, codAlarme });
2025-04-14 16:37:53 +00:00
break;
}
}
break;
}
2025-05-09 20:17:28 +00:00
case S_Code.sLED:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
switch (posicao)
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Status:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-04-14 16:37:53 +00:00
break;
}
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Dados1:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
StatusLED statusLeitura = (StatusLED)data[2];
StatusLED statusComando = (StatusLED)data[3];
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { statusLeitura, statusComando });
2025-04-14 16:37:53 +00:00
break;
}
}
break;
}
2025-05-09 20:17:28 +00:00
case S_Code.sRLE:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
switch (posicao)
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Status:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-04-14 16:37:53 +00:00
break;
}
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Dados1:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
Estado estado = (Estado)data[2];
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { estado });
2025-05-09 20:17:28 +00:00
break;
}
}
break;
}
case S_Code.sFRO:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
int angulo = data[2];
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { angulo });
2025-04-14 16:37:53 +00:00
break;
}
}
break;
}
2025-05-09 20:17:28 +00:00
case S_Code.sIMU:
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
switch (posicao)
2025-04-14 16:37:53 +00:00
{
2025-05-09 20:17:28 +00:00
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double roll = ConverterByteParaDouble(data, 2);
double pitch = ConverterByteParaDouble(data, 4);
double yaw = ConverterByteParaDouble(data, 6);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { roll, pitch, yaw });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados2:
{
double temperatura = ConverterByteParaDouble(data, 2);
double pressao = ConverterValorEscala(data, 4, 10);
double altitude = ConverterValorEscala(data, 6, 10);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { temperatura, pressao, altitude });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados3:
{
double accX = ConverterByteParaDouble(data, 2);
double accY = ConverterByteParaDouble(data, 4);
double accZ = ConverterByteParaDouble(data, 6);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { accX, accY, accZ });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados4:
{
double gyrX = ConverterByteParaDouble(data, 2);
double gyrY = ConverterByteParaDouble(data, 4);
double gyrZ = ConverterByteParaDouble(data, 6);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { gyrX, gyrY, gyrZ });
2025-05-09 20:17:28 +00:00
break;
}
case CanMessagePosicaoDados.Dados5:
2025-04-14 16:37:53 +00:00
{
double magX = ConverterByteParaDouble(data, 2);
double magY = ConverterByteParaDouble(data, 4);
double magZ = ConverterByteParaDouble(data, 6);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { magX, magY, magZ });
2025-04-09 21:11:40 +00:00
break;
}
}
break;
}
2025-05-15 20:20:46 +00:00
case S_Code.sGAS:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double ppm = ConverterBytesParaDouble32(data, 2);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { ppm });
2025-05-15 20:20:46 +00:00
break;
}
}
break;
}
case S_Code.sSHT:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double temperatura = ConverterByteParaDouble(data, 2);
double umidade = ConverterByteParaDouble(data, 4);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { temperatura, umidade });
2025-05-15 20:20:46 +00:00
break;
}
}
break;
}
case S_Code.sLUZ:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double lux = ConverterBytesParaDouble32(data, 2);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { lux });
2025-05-15 20:20:46 +00:00
break;
}
}
break;
}
case S_Code.sIUV:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double iuv = ConverterByteParaDouble(data, 2);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { iuv });
2025-05-15 20:20:46 +00:00
break;
}
}
break;
}
case S_Code.sQAR:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double tvoc = ConverterByteParaDouble(data, 2);
double eco2 = ConverterByteParaDouble(data, 4);
int aqi = data[6];
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { tvoc, eco2, aqi });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados2:
{
double temperatura = ConverterByteParaDouble(data, 2);
double umidade = ConverterByteParaDouble(data, 4);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { temperatura, umidade });
2025-05-15 20:20:46 +00:00
break;
}
}
break;
}
case S_Code.sCHV:
{
switch (posicao)
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
2025-05-15 20:20:46 +00:00
break;
}
case CanMessagePosicaoDados.Dados1:
{
double percentual = ConverterByteParaDouble(data, 2);
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { percentual });
2025-05-15 20:20:46 +00:00
break;
}
}
break;
}
2025-04-09 21:11:40 +00:00
}
Dados.DadosLeitura.UltimoComandoRespondido = DateTime.Now;
2025-04-09 21:11:40 +00:00
}
}
2023-11-30 00:41:22 +00:00
}