packages feed

ecu-0.0.8: src/CANData.hs

module CANData
  ( Msg (..)
  , BusType (..)
  , toWord64
  , fromWord64
  , toWord32
  , fromWord32
  , CANDB (..)
  , CANMsg (..)
  , CANMsgAttr
  , CANEndian (..)
  , CANSign (..)
  , CANSignalType (..)
  , CANSignalMux (..)
  , CANSignal (..)
  ) where

import Data.Bits
import Data.Word
import Text.Printf

data Msg = Msg Word32 [Word8] deriving (Eq, Ord)

data BusType = Extended | Standard

instance Show Msg where
  show (Msg id payload) = printf "0x%08X  0x%s" id $ concatMap formatByte payload

formatByte :: Word8 -> String
formatByte b = printf "%02X" b

toWord64 :: [Word8] -> Word64
toWord64 a = foldl1 (.|.) [ shiftL (fromIntegral a) $ i * 8 | (a, i) <- zip (a ++ [0..]) $ reverse [0..7] ]

fromWord64 :: Word64 -> [Word8]
fromWord64 a = [ fromIntegral ((shiftR a $ i * 8) .&. 0xFF) | i <- reverse [0..7] ]

toWord32 :: [Word8] -> Word32
toWord32 a = foldl1 (.|.) [ shiftL (fromIntegral a) $ i * 8 | (a, i) <- zip (a ++ [0..]) $ reverse [0..3] ]

fromWord32 :: Word32 -> [Word8]
fromWord32 a = [ fromIntegral ((shiftR a $ i * 8) .&. 0xFF) | i <- reverse [0..3] ]

data CANDB = CANDB
  { canDbName :: String
  , canDbNodes :: [String]
  , canDbMsgs  :: [CANMsg]
  } deriving (Read, Show, Eq, Ord)

data CANMsg = CANMsg
  { canMsgId      :: Word32
  , canMsgName    :: String
  , canMsgDlc     :: Word8
  , canMsgTxNode  :: String
  , canMsgAttrs   :: [CANMsgAttr]
  , canMsgSignals :: [CANSignal]
  } deriving (Read, Show, Eq, Ord)

  -- CANMsgAttr = (Name,  Value )
type CANMsgAttr = (String,String)

data CANEndian = CANBigEndian | CANLittleEndian
  deriving (Read, Show, Eq, Ord)

data CANSign = CANSigned | CANUnsigned
  deriving (Read, Show, Eq, Ord)

data CANSignalType = CANSignalTypeNormal | CANSignalTypeFloat | CANSignalTypeDouble
  deriving (Read, Show, Eq, Ord)

data CANSignalMux = CANSignalMuxNone | CANSignalMuxer | CANSignalMuxed Word64
  deriving (Read, Show, Eq, Ord)

data CANSignal = CANSignal
  { canSignalName      :: String
  , canSignalStartBit  :: Word8
  , canSignalBitLength :: Word8
  , canSignalEndian    :: CANEndian
  , canSignalSign      :: CANSign
  , canSignalFactor    :: Float
  , canSignalOffset    :: Float
  , canSignalMin       :: Float
  , canSignalMax       :: Float
  , canSignalUnit      :: String
  , canSignalRxNodes   :: [String]
  , canSignalType      :: CANSignalType
  , canSignalMux       :: CANSignalMux
  } deriving (Read, Show, Eq, Ord)