buttplug-hs-core-0.1.0.0: Client library for buttplug.io
Copyright(c) James Sully 2020-2021
LicenseBSD 3-Clause
Maintainersullyj3@gmail.com
Stabilityexperimental
Portabilityuntested
Safe HaskellNone
LanguageHaskell2010

Buttplug.Core.Message

Description

Contains the Message type, representing Buttplug protocol messages (https://buttplug-spec.docs.buttplug.io/messages.html)

Synopsis

Documentation

clientMessageVersion :: Word Source #

The version of the Buttplug message protocol that the client speaks. (currently version 2)

data ErrorCode Source #

Errors from the server, used in the Error message.

(https://buttplug-spec.docs.buttplug.io/status.html#error)

Constructors

ERROR_UNKNOWN

An unknown error occurred.

ERROR_INIT

Handshake did not succeed.

ERROR_PING

A ping was not sent in the expected time.

ERROR_MSG

A message parsing or permission error occurred.

ERROR_DEVICE

A command sent to a device returned an error.

Instances

Instances details
Enum ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

Eq ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

Show ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

Generic ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

Associated Types

type Rep ErrorCode :: Type -> Type #

FromJSON ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

parseJSON :: Value -> Parser ErrorCode

parseJSONList :: Value -> Parser [ErrorCode]

ToJSON ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

toJSON :: ErrorCode -> Value

toEncoding :: ErrorCode -> Encoding

toJSONList :: [ErrorCode] -> Value

toEncodingList :: [ErrorCode] -> Encoding

type Rep ErrorCode Source # 
Instance details

Defined in Buttplug.Core.Message

type Rep ErrorCode = D1 ('MetaData "ErrorCode" "Buttplug.Core.Message" "buttplug-hs-core-0.1.0.0-inplace" 'False) ((C1 ('MetaCons "ERROR_UNKNOWN" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ERROR_INIT" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "ERROR_PING" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "ERROR_MSG" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ERROR_DEVICE" 'PrefixI 'False) (U1 :: Type -> Type))))

fromErrCode :: ErrorCode -> Int Source #

Convert an ErrorCode to an Int

newtype RawData Source #

Used for the Raw* messages.

Constructors

RawData ByteString 

Instances

Instances details
Eq RawData Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

(==) :: RawData -> RawData -> Bool #

(/=) :: RawData -> RawData -> Bool #

Show RawData Source # 
Instance details

Defined in Buttplug.Core.Message

Generic RawData Source # 
Instance details

Defined in Buttplug.Core.Message

Associated Types

type Rep RawData :: Type -> Type #

Methods

from :: RawData -> Rep RawData x #

to :: Rep RawData x -> RawData #

FromJSON RawData Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

parseJSON :: Value -> Parser RawData

parseJSONList :: Value -> Parser [RawData]

ToJSON RawData Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

toJSON :: RawData -> Value

toEncoding :: RawData -> Encoding

toJSONList :: [RawData] -> Value

toEncodingList :: [RawData] -> Encoding

type Rep RawData Source # 
Instance details

Defined in Buttplug.Core.Message

type Rep RawData = D1 ('MetaData "RawData" "Buttplug.Core.Message" "buttplug-hs-core-0.1.0.0-inplace" 'True) (C1 ('MetaCons "RawData" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString)))

data Vibrate Source #

Used in VibrateCmd to specify the speed of the motor at the given index

Constructors

Vibrate 

Instances

Instances details
Eq Vibrate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

(==) :: Vibrate -> Vibrate -> Bool #

(/=) :: Vibrate -> Vibrate -> Bool #

Show Vibrate Source # 
Instance details

Defined in Buttplug.Core.Message

Generic Vibrate Source # 
Instance details

Defined in Buttplug.Core.Message

Associated Types

type Rep Vibrate :: Type -> Type #

Methods

from :: Vibrate -> Rep Vibrate x #

to :: Rep Vibrate x -> Vibrate #

FromJSON Vibrate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

parseJSON :: Value -> Parser Vibrate

parseJSONList :: Value -> Parser [Vibrate]

ToJSON Vibrate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

toJSON :: Vibrate -> Value

toEncoding :: Vibrate -> Encoding

toJSONList :: [Vibrate] -> Value

toEncodingList :: [Vibrate] -> Encoding

type Rep Vibrate Source # 
Instance details

Defined in Buttplug.Core.Message

type Rep Vibrate = D1 ('MetaData "Vibrate" "Buttplug.Core.Message" "buttplug-hs-core-0.1.0.0-inplace" 'False) (C1 ('MetaCons "Vibrate" 'PrefixI 'True) (S1 ('MetaSel ('Just "vibrateIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "vibrateSpeed") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Double)))

data Rotate Source #

Used in RotateCmd to specify the speed and direction of rotation of the motor at the given index

Constructors

Rotate 

Instances

Instances details
Eq Rotate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

(==) :: Rotate -> Rotate -> Bool #

(/=) :: Rotate -> Rotate -> Bool #

Show Rotate Source # 
Instance details

Defined in Buttplug.Core.Message

Generic Rotate Source # 
Instance details

Defined in Buttplug.Core.Message

Associated Types

type Rep Rotate :: Type -> Type #

Methods

from :: Rotate -> Rep Rotate x #

to :: Rep Rotate x -> Rotate #

FromJSON Rotate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

parseJSON :: Value -> Parser Rotate

parseJSONList :: Value -> Parser [Rotate]

ToJSON Rotate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

toJSON :: Rotate -> Value

toEncoding :: Rotate -> Encoding

toJSONList :: [Rotate] -> Value

toEncodingList :: [Rotate] -> Encoding

type Rep Rotate Source # 
Instance details

Defined in Buttplug.Core.Message

type Rep Rotate = D1 ('MetaData "Rotate" "Buttplug.Core.Message" "buttplug-hs-core-0.1.0.0-inplace" 'False) (C1 ('MetaCons "Rotate" 'PrefixI 'True) (S1 ('MetaSel ('Just "rotateIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "rotateSpeed") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Double) :*: S1 ('MetaSel ('Just "rotateClockwise") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Bool))))

data LinearActuate Source #

Used in LinearCmd to specify how to move the linear actuator at the given index

Instances

Instances details
Eq LinearActuate Source # 
Instance details

Defined in Buttplug.Core.Message

Show LinearActuate Source # 
Instance details

Defined in Buttplug.Core.Message

Generic LinearActuate Source # 
Instance details

Defined in Buttplug.Core.Message

Associated Types

type Rep LinearActuate :: Type -> Type #

FromJSON LinearActuate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

parseJSON :: Value -> Parser LinearActuate

parseJSONList :: Value -> Parser [LinearActuate]

ToJSON LinearActuate Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

toJSON :: LinearActuate -> Value

toEncoding :: LinearActuate -> Encoding

toJSONList :: [LinearActuate] -> Value

toEncodingList :: [LinearActuate] -> Encoding

type Rep LinearActuate Source # 
Instance details

Defined in Buttplug.Core.Message

type Rep LinearActuate = D1 ('MetaData "LinearActuate" "Buttplug.Core.Message" "buttplug-hs-core-0.1.0.0-inplace" 'False) (C1 ('MetaCons "LinearActuate" 'PrefixI 'True) (S1 ('MetaSel ('Just "linActIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "linActDuration") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "linActPosition") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Double))))

data Message Source #

The type of Buttplug protocol messages. See (https://buttplug-spec.docs.buttplug.io/messages.html) for the protocol specification and an explanation of the purpose of each message.

Constructors

MsgOk 

Fields

MsgError 
MsgPing 

Fields

MsgRequestServerInfo 
MsgServerInfo 
MsgStartScanning 

Fields

MsgStopScanning 

Fields

MsgScanningFinished 

Fields

MsgRequestDeviceList 

Fields

MsgDeviceList 

Fields

MsgDeviceAdded 
MsgDeviceRemoved 

Fields

MsgRawWriteCmd 
MsgRawReadCmd 
MsgRawReading 
MsgRawSubscribeCmd 
MsgRawUnsubscribeCmd 
MsgStopDeviceCmd 

Fields

MsgStopAllDevices 

Fields

MsgVibrateCmd 
MsgLinearCmd 
MsgRotateCmd 
MsgBatteryLevelCmd 

Fields

MsgBatteryLevelReading 
MsgRSSILevelCmd 

Fields

MsgRSSILevelReading 

Instances

Instances details
Eq Message Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

(==) :: Message -> Message -> Bool #

(/=) :: Message -> Message -> Bool #

Show Message Source # 
Instance details

Defined in Buttplug.Core.Message

Generic Message Source # 
Instance details

Defined in Buttplug.Core.Message

Associated Types

type Rep Message :: Type -> Type #

Methods

from :: Message -> Rep Message x #

to :: Rep Message x -> Message #

FromJSON Message Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

parseJSON :: Value -> Parser Message

parseJSONList :: Value -> Parser [Message]

ToJSON Message Source # 
Instance details

Defined in Buttplug.Core.Message

Methods

toJSON :: Message -> Value

toEncoding :: Message -> Encoding

toJSONList :: [Message] -> Value

toEncodingList :: [Message] -> Encoding

type Rep Message Source # 
Instance details

Defined in Buttplug.Core.Message

type Rep Message = D1 ('MetaData "Message" "Buttplug.Core.Message" "buttplug-hs-core-0.1.0.0-inplace" 'False) ((((C1 ('MetaCons "MsgOk" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: (C1 ('MetaCons "MsgError" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgErrorMessage") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text) :*: S1 ('MetaSel ('Just "msgErrorCode") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ErrorCode))) :+: C1 ('MetaCons "MsgPing" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)))) :+: (C1 ('MetaCons "MsgRequestServerInfo" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgClientName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text) :*: S1 ('MetaSel ('Just "msgMessageVersion") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word))) :+: (C1 ('MetaCons "MsgServerInfo" 'PrefixI 'True) ((S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgServerName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text)) :*: (S1 ('MetaSel ('Just "msgMessageVersion") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgMaxPingTime") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word))) :+: C1 ('MetaCons "MsgStartScanning" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word))))) :+: ((C1 ('MetaCons "MsgStopScanning" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: (C1 ('MetaCons "MsgScanningFinished" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: C1 ('MetaCons "MsgRequestDeviceList" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)))) :+: ((C1 ('MetaCons "MsgDeviceList" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDevices") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Device])) :+: C1 ('MetaCons "MsgDeviceAdded" 'PrefixI 'True) ((S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text)) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceMessages") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Map DeviceMessageType MessageAttributes))))) :+: (C1 ('MetaCons "MsgDeviceRemoved" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: C1 ('MetaCons "MsgRawWriteCmd" 'PrefixI 'True) ((S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :*: (S1 ('MetaSel ('Just "msgEndpoint") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text) :*: (S1 ('MetaSel ('Just "msgData") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 RawData) :*: S1 ('MetaSel ('Just "msgWriteWithResponse") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Bool)))))))) :+: (((C1 ('MetaCons "MsgRawReadCmd" 'PrefixI 'True) ((S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :*: (S1 ('MetaSel ('Just "msgEndpoint") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text) :*: (S1 ('MetaSel ('Just "msgExpectedLength") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgWaitForData") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Bool)))) :+: (C1 ('MetaCons "MsgRawReading" 'PrefixI 'True) ((S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :*: (S1 ('MetaSel ('Just "msgEndpoint") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text) :*: S1 ('MetaSel ('Just "msgData") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 RawData))) :+: C1 ('MetaCons "MsgRawSubscribeCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgEndpoint") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text))))) :+: (C1 ('MetaCons "MsgRawUnsubscribeCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgEndpoint") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text))) :+: (C1 ('MetaCons "MsgStopDeviceCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: C1 ('MetaCons "MsgStopAllDevices" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word))))) :+: ((C1 ('MetaCons "MsgVibrateCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgSpeeds") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Vibrate]))) :+: (C1 ('MetaCons "MsgLinearCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgVectors") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [LinearActuate]))) :+: C1 ('MetaCons "MsgRotateCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgRotations") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Rotate]))))) :+: ((C1 ('MetaCons "MsgBatteryLevelCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: C1 ('MetaCons "MsgBatteryLevelReading" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgBatteryLevel") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Double)))) :+: (C1 ('MetaCons "MsgRSSILevelCmd" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: C1 ('MetaCons "MsgRSSILevelReading" 'PrefixI 'True) (S1 ('MetaSel ('Just "msgId") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: (S1 ('MetaSel ('Just "msgDeviceIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word) :*: S1 ('MetaSel ('Just "msgRSSILevel") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int))))))))