-- | Programming the adafruit_feather_m0_basic_proto board with Copilot.

{-# LANGUAGE DataKinds #-}

module Copilot.Zephyr.Board.Adafruit_feather_m0_basic_proto (
	module Copilot.Zephyr
	, sw0
	, led0
	-- * Pins
	, pin0
	, pin1
	, pin5
	, pin6
	, pin9
	, pin10
	, pin11
	, pin12
	, pin13
	, pin20
	, pin21
) where

import Copilot.Zephyr
import Copilot.Zephyr.Internals
import Copilot.Zephyr.Board.Generic (sw0, led0)

-- TODO: a0, a1-a5
-- TODO: several other pins can be analog input
-- TODO: several pins support pwm

-- The GPIO addresses were found by reading the schematic at
-- https://learn.adafruit.com/adafruit-feather-m0-basic-proto/downloads
-- eg, pin13 is labeled as "D13" and connects to "PA17".

pin0, pin1, pin5, pin6, pin9, pin10, pin11 :: Pin '[ 'DigitalIO ]
pin12, pin13, pin20, pin21 :: Pin '[ 'DigitalIO ]

pin0 :: Pin '[ 'DigitalIO]
pin0 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_0") (Int -> GPIOAddress
porta Int
11))
pin1 :: Pin '[ 'DigitalIO]
pin1 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_1") (Int -> GPIOAddress
porta Int
10))
pin5 :: Pin '[ 'DigitalIO]
pin5 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_5") (Int -> GPIOAddress
porta Int
15))
pin6 :: Pin '[ 'DigitalIO]
pin6 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_6") (Int -> GPIOAddress
porta Int
20))
pin9 :: Pin '[ 'DigitalIO]
pin9 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_9") (Int -> GPIOAddress
porta Int
7))
pin10 :: Pin '[ 'DigitalIO]
pin10 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_10") (Int -> GPIOAddress
porta Int
18))
pin11 :: Pin '[ 'DigitalIO]
pin11 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_11") (Int -> GPIOAddress
porta Int
16))
pin12 :: Pin '[ 'DigitalIO]
pin12 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_12") (Int -> GPIOAddress
porta Int
19))
-- | same as led0
pin13 :: Pin '[ 'DigitalIO]
pin13 = Pin '[ 'DigitalIO]
led0
-- | SDA
pin20 :: Pin '[ 'DigitalIO]
pin20 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_20") (Int -> GPIOAddress
porta Int
22))
-- | SCL
pin21 :: Pin '[ 'DigitalIO]
pin21 = forall {k} (t :: k). Zephyr -> Pin t
Pin (GPIOAlias -> GPIOAddress -> Zephyr
Zephyr (String -> GPIOAlias
GPIOAlias String
"gpio_pin_21") (Int -> GPIOAddress
porta Int
23))

porta :: Int -> GPIOAddress
porta :: Int -> GPIOAddress
porta Int
n = String -> GPIOAddress
GPIOAddress (String
"porta " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
n)