private void Session_ServiceExecutionCompleted(object sender, ServiceExecutionEventArgs e)
        {
            handshakeInitializingCount = 0;

            var currentMeterSessionItemTask = GetMeterSessionItemTask(e.Service);
            var currentSessionTask          = currentMeterSessionItemTask.SessionTask;

            currentMeterSessionItemTask.Success = true;
            currentMeterSessionItemTask.EndDate = DateTime.UtcNow;

            // verificamos si todos los items de la tarea están completos...
            if (currentSessionTask.Items.Count(x => !x.Value.Success) == 0)
            {
                currentSessionTask.Completed = true;
                currentSessionTask.EndDate   = DateTime.UtcNow;
                SessionProgressChanged?.Invoke(this, new SessionProgressEventArgs()
                {
                    SessionTask = currentSessionTask, ElapsedTime = e.ElapsedTime, PercentAdvance = e.ProgressPercent
                });
            }

            if (e.Service is ReadService readService)
            {
                byte[] rawData = readService.TableData.ToArray();
                currentMeterSessionItemTask.TaskResult = rawData;
                RaiseSessionStatusChangedAndTrace(MeterSessionStatus.MeterSessionItemTaskSuccess, $"#Lectura satisfactoria de Tabla {readService.Table.Name}. Tiempo Requerido: {e.ElapsedTime.ToString()}. Porcentaje de Avance: {e.ProgressPercent}");

                switch (readService.Table.Name)
                {
                case TableName.GeneralManufacturerIdentification:
                    if (!OnConfigurationTablesCompleted(rawData))
                    {
                        OnFatalError("No se puede determinar las caractarísticas técnicas del Medidor. Intente la lectura nuevamente.");
                    }
                    break;

                case TableName.ActualLoadProfileTable:
                    if (!OnLoadProfileConfigurationCompleted(rawData))
                    {
                        OnFatalError("No se puede determinar la configuración del Perfil de Carga del Medidor. Intente la Lectura nuevamente.");
                    }
                    break;

                default:
                    break;
                }
            }
            else if (e.Service is WriteService writeService)
            {
                //if (writeService.Table.Name == TableName.HistoryLogControlTable)
                //{
                //    _sessionTracer.AppendLine("#AutoReset: Realizado");
                //    DemandResetStatus = OpticalDemandResetStatus.Performed;
                //}
                //else if (writeService.Table.Name == TableName.EventLogControlTable)
                //{
                //    _sessionTracer.AppendLine("#Fecha del Medidor: Actualizada");
                //}
            }
        }
        private void Session_ServiceExecutionStarted(object sender, ServiceExecutionEventArgs e)
        {
            var currentMeterSessionItemTask = GetMeterSessionItemTask(e.Service);

            currentMeterSessionItemTask.StartDate = DateTime.UtcNow;
            if (e.Service is ReadService readService)
            {
                RaiseSessionStatusChangedAndTrace(MeterSessionStatus.ExecutingDataSetComponent, $"#Iniciando Lectura de Tabla {readService.Table.Name}. Fecha y Hora (UTC): {currentMeterSessionItemTask.StartDate.ToString("dd-MM-yy HH:mm:ss fff")}");
            }
        }
 private void Session_ServiceExecutionCanceled(object sender, ServiceExecutionEventArgs e)
 {
     if (e.Service is ReadService readService)
     {
         RaiseSessionStatusChangedAndTrace(MeterSessionStatus.MeterSessionItemTaskAborted, $"#Lectura Cancelada de Tabla {readService.Table.Name}. Fecha y Hora (UTC): {DateTime.UtcNow.ToString("dd-MM-yy HH:mm:ss fff")}");
     }
     if (e.Service is WriteService writeService)
     {
         //if (writeService.Table.Name == TableName.HistoryLogControlTable)
         //{
         //    AddSessionTrace("#Fecha Medidor: Lectura cancelada durante el cambio de fecha y hora");
         //}
         //else if (writeService.Table.Name == TableName.EventLogControlTable)
         //{
         //    AddSessionTrace("#AutoReset: Lectura cancelada durante el Reseteo de Demanda");
         //    DemandResetStatus = OpticalDemandResetStatus.Unknow;
         //}
     }
 }
 private void Session_ServiceExecutionError(object sender, ServiceExecutionEventArgs e)
 {
     if (e.Service is ReadService readService)
     {
         RaiseSessionStatusChangedAndTrace(MeterSessionStatus.MeterSessionItemTaskFailed, $"#Error durante Lectura de Tabla {readService.Table.Name}. Código de Resultado: {readService.ResponseCode}. Fecha y Hora (UTC): {DateTime.UtcNow.ToString("dd-MM-yy HH:mm:ss fff")}");
     }
     else if (e.Service is WriteService writeService)
     {
         //if (writeService.Table.Name == TableName.EventLogControlTable)
         //{
         //    AddSessionTrace("#Fecha Medidor: No actualizada. Error al intentar corregir");
         //}
         //else if (writeService.Table.Name == TableName.HistoryLogControlTable)
         //{
         //    AddSessionTrace("#AutoReset: No realizado. Error al intentar un Reseteo de Demanda Automático.");
         //    DemandResetStatus = OpticalDemandResetStatus.NotPerformed;
         //}
     }
 }