-- | This model holds a complete set status of the program. It has some
-- additional invariants that must always be respected.
module Model.Model where
import Data.ExtraVersion
import Hails.MVC.Model.ProtectedModel.VersionedModel
import Hails.MVC.Model.ProtectedModel.UpdatableModel
import Audio
-- | Model invariants
--
-- Condition: At least one notification method must be enabled at all times
--
-- INV: x == notificationMethods
-- /\ ( x.notificationIconEnabled
-- \/ x.notificationBubbleEnabled
-- \/ x.notificationSoundEnabled
-- \/ x.notificationOverlayEnabled
-- )
--
-- Condition: At least one detection method must be enabled at all times
--
-- INV: x == detectionMethods
-- /\ ( x.detectionSlouchingEnabled
-- \/ x.detectionHunchingEnabled
-- )
--
-- INV: notificationDelay >= 1
--
-- INV: camera == Nothing || camera == (Just (x,_)) && x >= 0
--
-- INV: calibrationParams == Nothing
-- || calibrationParams == (Just (x,y,w,h)) && x >= 0 && y >= 0 && w >= 0 && h >= 0
--
-- INV: correctionFactor in [0,10]
--
-- INV: not (notificationEnabled /\ status == Callibrating)
--
-- INV: not (not notificationEnabled /\ status == Notifying)
data Model = Model
{
-- General settings
language :: Maybe Language
, checkUpdates :: Bool
, sendReports :: Bool
-- Notification params
, notificationEnabled :: Bool
, notificationMethods :: NotificationMethods
, notificationDelay :: Int
-- Algorithm params
, detectionMethods :: DetectionMethods
, camera :: Int
, cameraStatus :: Maybe Bool
-- , cameraList :: [(Int, String)]
, calibrationParams :: Maybe (Int, Int, Int, Int)
, correctionFactor :: Int
-- Current status
, status :: Status
, detectorRunning :: Bool
-- Sound related
, sound :: Maybe Music
, soundFilename :: Maybe FilePath
, playing :: Bool
-- Program updates
, programName :: String
, programVersion :: Version
, programMaxVersion :: Maybe Version
, programUpdateURI :: String
, firstRun :: Maybe Bool -- Unknown, Yes, No
}
deriving (Eq)
-- | Possible notification methods to be used
data NotificationMethods = NotificationMethods
{ notificationIconEnabled :: Bool
-- , notificationBubbleEnabled :: Bool
, notificationSoundEnabled :: Bool
, notificationOverlayEnabled :: Bool
}
deriving (Eq)
-- | Possible detection methods to be used
data DetectionMethods = DetectionMethods
{ detectionSlouchingEnabled :: Bool
, detectionHunchingEnabled :: Bool
}
deriving (Eq)
-- | System status
data Status = StatusIdle
| StatusFinding
| StatusNotifying
| StatusCallibrating
| StatusDisabled
deriving (Eq, Ord)
isCalibrating :: Status -> Bool
isCalibrating StatusCallibrating = True
isCalibrating _ = False
isDisabled :: Status -> Bool
isDisabled StatusDisabled = True
isDisabled _ = False
isEnabled :: Status -> Bool
isEnabled StatusIdle = True
isEnabled StatusFinding = True
isEnabled StatusNotifying = True
isEnabled _ = False
-- | Languages supported by this program
data Language = English
| Galician
| Spanish
deriving (Eq, Show)
-- | Initial (default) model definition
emptyBM :: Model
emptyBM = Model
{
-- General settings
language = Just English
, checkUpdates = True
, sendReports = True
-- Notification params
, notificationEnabled = False
, notificationMethods = NotificationMethods { notificationIconEnabled = True
-- , notificationBubbleEnabled = True
, notificationSoundEnabled = True
, notificationOverlayEnabled = True
}
, notificationDelay = 8
-- Algorithm params
, detectionMethods = DetectionMethods { detectionSlouchingEnabled = True
, detectionHunchingEnabled = True
}
, camera = 0
, cameraStatus = Nothing
-- , cameraList = []
, calibrationParams = Nothing -- Just (287, 122, 232, 232)
, correctionFactor = 0
-- Current status
, status = StatusIdle
, detectorRunning = False
-- Sound
, sound = Nothing
, soundFilename = Nothing
, playing = False
-- Update check
, programName = "Keera Posture"
, programVersion = Version 0 1 ReleaseCandidate 0
, programMaxVersion = Nothing
, programUpdateURI = "http://www.keera.es/projects/keera-posture/newest-version"
, firstRun = Nothing
}
-- | This model contains information about the version of this program
instance VersionedBasicModel Model where
getBMVersion = programVersion
-- | Enable automatic update discovery
instance UpdatableBasicModel Model where
getBMUpdateURI = programUpdateURI
getBMMaxVersionAvail = programMaxVersion
setBMMaxVersionAvail bm x = bm { programMaxVersion = Just x }