public void Add(ICanBusMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            _messageTypesCount[message.MessageTypeId].IncrementCount();
        }
        private static bool?IsChargingActive(ICanBusMessage message)
        {
            if (message is IModel3BatteryInfoMessage batteryInfoMessage)
            {
                return(batteryInfoMessage.BmsState % 2 > 0);
            }

            return(null);
        }
        private static DateTime?TryGetTimestamp(CanBusLogLine parsedLine, ICanBusMessage message)
        {
            if (parsedLine.UnixTimestamp > 0)
            {
                var seconds   = (long)parsedLine.UnixTimestamp;
                var timestamp = DateTimeOffset.FromUnixTimeSeconds(seconds);
                timestamp = timestamp.AddSeconds((double)(parsedLine.UnixTimestamp - seconds));
                return(timestamp.UtcDateTime);
            }

            if (message is TimestampMessage timestampMessage && timestampMessage.IsValid)
            {
                return(timestampMessage.Timestamp);
            }

            return(null);
        }
        private static void ParseMessage(ICanBusMessage message, ChargingSessionRow row)
        {
            switch (message)
            {
            case BatteryInfoMessage m:
                row.BmsChargeStatus = m.BmsChargeStatus;
                row.BmsState        = m.BmsState;
                row.CellTemperature = m.MinBatteryTemperature;
                row.MaxChargePower  = m.BmsChargePowerAvailable;
                return;

            case BatteryPowerMessage m:
                row.BatteryCurrent = m.BatteryCurrentRaw;
                row.BatteryVoltage = m.BatteryVoltage;
                return;

            case StateOfChargeMessage m:
                row.StateOfCharge = m.StateOfChargeMin;
                return;
            }
        }
Example #5
0
        private static void ParseMessage(ICanBusMessage message, CsvRow row)
        {
            switch (message)
            {
            case BatteryCapacityMessage m:
                row.FullBatteryCapacity       = m.FullBatteryCapacity;
                row.ExpectedRemainingCapacity = m.ExpectedRemainingCapacity;
                return;

            case BatteryInfoMessage m:
                row.BmsState        = m.BmsState;
                row.BmsChargeStatus = m.BmsChargeStatus;
                return;

            case BatteryPowerMessage m:
                row.BatteryCurrent = m.BatteryCurrentRaw;
                row.BatteryVoltage = m.BatteryVoltage;
                return;

            case ChargeDischargeMessage m:
                row.TotalCharge    = m.TotalCharge;
                row.TotalDischarge = m.TotalDischarge;
                return;

            case OdometerMessage m:
                row.Odometer = m.Odometer;
                return;

            case SpeedMessage m:
                row.Speed = m.SignedSpeed;
                return;

            case StateOfChargeMessage m:
                row.StateOfCharge = m.StateOfChargeMin;
                return;
            }
        }
        private static void AssignMessageType(MessageInfo[] messageInfo, Type messageType, ICanBusMessage model)
        {
            var existing = messageInfo[model.MessageTypeId];

            if (existing != null)
            {
                throw new InvalidOperationException($"Colliding message type IDs: {model.MessageTypeId:X}");
            }

            messageInfo[model.MessageTypeId] = new MessageInfo
            {
                Constructor  = GetPayloadConstructor(messageType),
                RequireBytes = model.RequireBytes
            };
        }