+ toByteCode (OnInterrupt i) = {toChar $ i/256 bitor 127, toChar $ i rem 256}
+instance fromByteCode MTaskInterval
+ where
+ fromByteCode s
+ //Interval
+ | (toInt s.[0]) bitand 128 == 0 = case fromByteCode s of
+ 0 = OneShot
+ i = OnInterval i
+ = OnInterrupt $ fromByteCode s bitand 127
+instance fromByteCode MTaskDeviceSpec where
+ fromByteCode s = let c = toInt s.[0] in
+ {MTaskDeviceSpec
+ |haveLed=c bitand 1 > 0
+ ,haveAio=c bitand 2 > 0
+ ,haveDio=c bitand 4 > 0
+ ,maxTask=from16bit $ s % (1,3)
+ ,maxSDS=from16bit $ s % (3,5)
+ }
+
+derive gPrint Long, UserLED, Button, AnalogPin, DigitalPin, PinMode, Pin, BC, MTaskDeviceSpec
+derive class gCons BC
+
+consIndex{|BCValue|} _ = 0
+consName{|BCValue|} _ = "BCValue"
+conses{|BCValue|} = [BCValue 0]
+consNum{|BCValue|} _ = 1
+gPrint{|BCValue|} v ps = gPrint{|*|} (readable $ BCPush v) ps
+
+gEditor{|BCValue|} = {Editor|genUI=genUI`,onEdit=onEdit`,onRefresh=onRefresh`}
+ where
+ genUI` dp (BCValue a) vst = (castEditor a).Editor.genUI dp a vst
+ onEdit` dp jsn (BCValue a) em vst = appSnd3 BCValue $ (castEditor a).Editor.onEdit dp jsn a em vst
+ onRefresh` dp (BCValue a) (BCValue a`) em vst = appSnd3 BCValue $ (castEditor a).Editor.onRefresh dp a (fromByteCode $ toByteCode a`) em vst
+
+ castEditor :: a -> (Editor a) | mTaskType a
+ castEditor _ = gEditor{|*|}
+
+gText{|BCValue|} fm Nothing = []
+gText{|BCValue|} fm (Just (BCValue e)) = gText{|*|} fm (Just e)
+JSONEncode{|BCValue|} b (BCValue e) = JSONEncode{|*|} b (toByteCode e)
+JSONDecode{|BCValue|} b n = appFst (fmap fromByteCode) $ JSS b n
+ where
+ JSS :: (Bool [JSONNode] -> (Maybe String, [JSONNode]))
+ JSS = JSONDecode{|*|}
+gDefault{|BCValue|} = BCValue 0
+gEq{|BCValue|} (BCValue e) (BCValue f) = toByteCode e == toByteCode f
+
+derive class gCons Long, UserLED, Button, AnalogPin, DigitalPin, PinMode, Pin
+derive class iTask UserLED, Long, Pin, Button, AnalogPin, DigitalPin, PinMode, MTaskDeviceSpec