Skip to content
This repository has been archived by the owner on May 4, 2023. It is now read-only.

Tirsdag d. 5. maj 2009

reenberg edited this page Sep 13, 2010 · 10 revisions

Dagsorden

  • Håndtering af race-conditions. Vi skal finde ud af om vi vil gøre noget ved de mulige race conditions i eventkøen. Ind til videre er det bedste vi har fundet ud af at gøre, at disable interrupts globalt når en mutex tilgås.
  • I hvor høj grad skal vi beskrive transformeringsmodulerne fra Red til F og fra F til C? Vi har i praksis ikke modificeret dem, og kommer næppe til at lave ændringer af betydning, og samtidigt er deres implementering yderst teknisk kompliceret, dog uden at være konceptuelt interessant (bortset fra deres fantastiske brug af monader).
  • Event og Device-abstraktionerne begynder at virke som de konceptuelt mest avancerede ting vi har konstrueret fra bunden. Måske er det værd at overveje at finpudse dem og så beskrive dem relativt dybdegående i rapporten? Her tænker jeg på automatisk (og korrekt) kontrol af at man ikke benytter på hinanden inkompatible events og devices i samme program, hvilket for tiden er et ansvar der ligger på programmørens skuldre. Det lugter lidt i betragtning af hvor meget energi der ellers bruges på at sikre typesikkerhed på objektkodeniveau (Reify/LiftN). En idé kunne være at events og devices (eller måske kun sidstnævnte) tilføjer constraints til en eller anden “platform setup” værdi, som så i sidste ende bruges til at generere C-kode der initialiserer Arduino-systemet som forventet.

Rigtigt levende kodeeksempel på hvordan det pt. fungerer når man implementerer understøttelse for en ny hardwareenhed med et par events tilknyttet:

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE MultiParamTypeClasses #-}

import Prelude hiding (exp)

import Data.Loc
import Data.Name
import qualified Language.Hs.Syntax as H
import Language.Hs.Syntax
import Language.Hs.Quote
import Language.C.Syntax
import Language.C.Quote
import Control.Monad.CGen
import Text.PrettyPrint.Mainland

import Fladuino
import Fladuino.Device

data PushButton = PushButton Integer
                  deriving (Eq, Show)

instance Device PushButton where
    setup d@(PushButton pin) = do addCInitStm [$cstm|pinMode($int:pin, INPUT);|]
    deviceClass _ = "pushbutton" 
    uniqueId d@(PushButton pin) = deviceClass d ++ (show pin)

data PushButtonPressEvent = PushButtonPressEvent PushButton
                            deriving (Eq, Show)

instance Event PushButtonPressEvent () where
    setupEvent e@(PushButtonPressEvent (d@(PushButton pin))) = 
                                            do addDevice d
                                               pv <- statevar d "press_predicate" 
                                               let v = H.Var (mkName pv)
                                               addCImport pv [$ty|() -> Bool|] [$cexp|$id:pv|]
                                               addCFundef [$cedecl|int $id:pv () {
                                                                     return (digitalRead($int:pin) == HIGH);
                                                                   }|]
                                               return $ mkEvent e Nothing (Just v)
    interruptPins (PushButtonPressEvent (PushButton pin)) = [pin]

data PushButtonReleaseEvent = PushButtonReleaseEvent PushButton
                              deriving (Eq, Show)

instance Event PushButtonReleaseEvent () where
    setupEvent e@(PushButtonReleaseEvent (d@(PushButton pin))) = 
                                              do addDevice d 
                                                 pv <- statevar d "rel_predicate" 
                                                 let v = H.Var (mkName pv)
                                                 addCImport pv [$ty|() -> Bool|] [$cexp|$id:pv|]
                                                 addCFundef [$cedecl|int $id:pv () {
                                                                       return (digitalRead($int:pin) == LOW);
                                                                     }|]
                                                 return $ mkEvent e Nothing (Just v)
    interruptPins (PushButtonReleaseEvent (PushButton pin)) = [pin]


main :: IO ()
main =
    defaultMain $ 
    genStreams (map unS [onEvent (PushButtonPressEvent $ PushButton 2) >>> turnOn (DigitalOutputPin 8 False),
                                          onEvent (PushButtonReleaseEvent $ PushButton 2) >>> turnOff (DigitalOutputPin 8 False)])

Referart

  • I teorien kan vi lave evaluering. Dog mangler et program + hardware som ikke er trivielt. Her kunne 3pi robotten være et godt eksempel.
  • Ken mener vi bør gå i gang med at forberede understøttelse + program af 3pi robotten da programmeren snart kommer til denne.
  • Evaluering: Hvor meget skal flask ændres for at programmerer robotter. Kan det lade sig gøre? Er det smart? Gerne mere.
  • Ken mener umildbart deet tydeligvis er blevet nemmere at programmere (Hvis der ses bort fra alle imports i toppen af koden) sammenlignet med processing.
  • Eksperiment: 1 stiller en opgave. De 2 andre skriver koden. Virker koden på hardwaren? Hvor lang tid tog det at tilpasse koden til at virke?
  • Ang interrupt problemet så skal der afsættes meget kort tid og hvis det ikke løses så nævn det som en ting der bør fikses til fremtidig brug.
  • Den del af Flask som vi ikke har ændret behøves egentlig ikke beskrives. Så længe vi blot har ting til rapport der er “Komplekse” nok. Dog må særligt snedige ting i Flask gerne medtages i rapporten.
  • Interessant eksempler må gerne finpudses og medtages. Behøves ikke være komplicerede.
  • Næste møde er kl 11.00