badges/defs_nicebadge.go

150 lines
2.9 KiB
Go
Raw Normal View History

2026-04-15 21:11:30 +00:00
//go:build nicenano
// +build nicenano
package main
import (
"image/color"
"machine"
"tinygo.org/x/drivers/encoders"
"tinygo.org/x/drivers/st7789"
"tinygo.org/x/drivers/ws2812"
)
const (
hardwareName = "NICEBADGE"
2026-04-15 21:11:30 +00:00
displayWidth = 240
displayHeight = 135
hasAccel = false
2026-04-15 21:11:30 +00:00
)
// UI layout constants for nicebadge (240x135)
const (
// myNameIs layout
cornerRadius = 10
topBandHeight = 20
bottomBandHeight = 10
helloY = 20
myNameIsY = 21
2026-04-15 21:11:30 +00:00
gophersY = 110
gophersX = 48
// menu layout
menuItemSpace = 20
menuCircleR = 6
numLEDs = 2
buttonBack = buttonB
)
// snake
const (
snakeWidthBLOCKS = 24
snakeHeightBLOCKS = 13
)
2026-04-15 21:11:30 +00:00
var menuOptions = []int8{
modeBadge,
modeSchedule,
modeAdventure,
modeLEDs,
modeMusic,
modeGameSnake,
modeGameLife,
modeGameColors,
modeInfo,
}
// Font size thresholds for gopherbadge
const (
FontWidthThreshold = 300
)
var (
display st7789.Device
btnA machine.Pin
btnB machine.Pin
btnStart machine.Pin
ax machine.ADC
ay machine.ADC
enc *encoders.QuadratureDevice
)
func initHardware() {
machine.SPI0.Configure(machine.SPIConfig{
SCK: machine.P1_01,
SDO: machine.P1_02,
Frequency: 2.0 * machine.MHz,
Mode: 0,
})
machine.I2C1.Configure(machine.I2CConfig{
SDA: machine.P0_17,
SCL: machine.P0_20,
Frequency: 2.0 * machine.MHz,
})
display = st7789.New(machine.SPI0,
machine.P1_15, // TFT_RESET
machine.P1_13, // TFT_DC
machine.P0_10, // TFT_CS
machine.P0_09) // TFT_LITE
display.Configure(st7789.Config{
Rotation: st7789.ROTATION_90,
Width: 135,
Height: 240,
RowOffset: 40,
ColumnOffset: 53,
//FrameRate: st7789.FRAMERATE_111,
//VSyncLines: st7789.MAX_VSYNC_SCANLINES,
})
neo := machine.P1_11
neo.Configure(machine.PinConfig{Mode: machine.PinOutput})
leds = ws2812.NewWS2812(neo)
2026-04-15 21:11:30 +00:00
bzrPin = machine.P0_31
bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.InitADC()
ax = machine.ADC{Pin: machine.P0_02}
ay = machine.ADC{Pin: machine.P0_29}
ax.Configure(machine.ADCConfig{})
ay.Configure(machine.ADCConfig{})
enc = encoders.NewQuadratureViaInterrupt(machine.P1_00, machine.P0_24)
enc.Configure(encoders.QuadratureConfig{
Precision: 4,
})
btnStart = machine.P0_22
btnA = machine.P1_06
btnB = machine.P1_04
btnStart.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
btnA.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
btnB.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
black := color.RGBA{0, 0, 0, 255}
display.FillScreen(black)
}
func getInput() {
for b := 0; b < 9; b++ {
buttonsOldState[b] = buttonsState[b]
}
buttonsState[buttonA] = !btnA.Get()
buttonsState[buttonB] = !btnB.Get()
buttonsState[buttonStart] = !btnStart.Get()
buttonsState[buttonLeft] = (ax.Get() < 12000)
buttonsState[buttonRight] = (ax.Get() > 52000)
buttonsState[buttonDown] = (ay.Get() < 12000)
buttonsState[buttonUp] = (ay.Get() > 52000)
}