module Arduino.Uno
( module Arduino.DSL
, module Arduino.Library
, module Arduino.Uno
) where
import Arduino.DSL
import Arduino.Library
import Data.Bits (shiftR, (.&.))
data GPIO = GPIO
{ name :: String
, directionRegister :: String
, portRegister :: String
, pinRegister :: String
, bitName :: String
}
pin3GPIO = GPIO "pin3" "DDRD" "PORTD" "PIND" "PD3"
pin4GPIO = GPIO "pin4" "DDRD" "PORTD" "PIND" "PD4"
pin5GPIO = GPIO "pin5" "DDRD" "PORTD" "PIND" "PD5"
pin6GPIO = GPIO "pin6" "DDRD" "PORTD" "PIND" "PD6"
pin7GPIO = GPIO "pin7" "DDRD" "PORTD" "PIND" "PD7"
pin8GPIO = GPIO "pin8" "DDRB" "PORTB" "PINB" "PB0"
pin10GPIO = GPIO "pin10" "DDRB" "PORTB" "PINB" "PB2"
pin11GPIO = GPIO "pin11" "DDRB" "PORTB" "PINB" "PB3"
pin12GPIO = GPIO "pin12" "DDRB" "PORTB" "PINB" "PB4"
pin13GPIO = GPIO "pin13" "DDRB" "PORTB" "PINB" "PB5"
pin3 :: Output Bit
pin3 = gpioOutput pin3GPIO
pin4 :: Output Bit
pin4 = gpioOutput pin4GPIO
pin5 :: Output Bit
pin5 = gpioOutput pin5GPIO
pin6 :: Output Bit
pin6 = gpioOutput pin6GPIO
pin7 :: Output Bit
pin7 = gpioOutput pin7GPIO
pin8 :: Output Bit
pin8 = gpioOutput pin8GPIO
pin13 :: Output Bit
pin13 = gpioOutput pin13GPIO
pin12 :: Output Bit
pin12 = gpioOutput pin12GPIO
pin11 :: Output Bit
pin11 = gpioOutput pin11GPIO
pin10 :: Output Bit
pin10 = gpioOutput pin10GPIO
pin12in :: Stream Bit
pin12in = gpioInput pin12GPIO
clock :: Stream Word
clock = every 10000
every :: Expression Word -> Stream Word
every limit = timerDelta ~> accumulate ~> keepOverflowing ~> count
where
accumulate = foldpS (\delta total -> if_ (greater total limit)
(total limit + delta)
(total + delta))
0
keepOverflowing = filterS (\value -> greater value limit)
uart :: Output Byte
uart =
let ubrr = floor ((16000000 / (16 * 9600)) 1)
ubrrlValue = ubrr .&. 0xFF
ubrrhValue = shiftR ubrr 8 .&. 0xFF
in
createOutput
"uart"
(writeByte "UBRR0H" (byteConstant ubrrhValue) $
writeByte "UBRR0L" (byteConstant ubrrlValue) $
setBit "UCSR0C" "UCSZ01" $
setBit "UCSR0C" "UCSZ00" $
setBit "UCSR0B" "RXEN0" $
setBit "UCSR0B" "TXEN0" $
end)
(\byte ->
waitBitSet "UCSR0A" "UDRE0" $
writeByte "UDR0" byte $
end)
gpioOutput :: GPIO -> Output Bit
gpioOutput gpio =
createOutput
(name gpio)
(setBit (directionRegister gpio) (bitName gpio) $
end)
(\bit ->
writeBit (portRegister gpio) (bitName gpio) bit $
end)
gpioInput :: GPIO -> Stream Bit
gpioInput gpio = createInput
(name gpio)
(clearBit (directionRegister gpio) (bitName gpio) $
setBit (portRegister gpio) (bitName gpio) $
end)
(readBit (pinRegister gpio) (bitName gpio))
timerDelta :: Stream Word
timerDelta = createInput
"timer"
(setBit "TCCR1B" "CS12" $
setBit "TCCR1B" "CS10" $
end)
(readWord "TCNT1" $
writeWord "TCNT1" (wordConstant 0) $
end)