//go:build cortexm

package ws2812

// This file implements the WS2812 protocol for various Cortex-M
// microcontrollers. It is intended to work with various variants: M0, M0+, M3,
// and M4. Because machine.CPUFrequency() is usually a constant, the value will
// usually be constant-propagated and the switch below will be a direct
// (inlinable function) - thus there is usually no code size penalty over build
// tags per CPU speed.

import (
	"machine"
)

// Send a single byte using the WS2812 protocol.
func (d Device) WriteByte(c byte) error {
	switch machine.CPUFrequency() {
	case 16_000_000: // 16MHz
		d.writeByte16(c)
		return nil
	case 48_000_000: // 48MHz
		d.writeByte48(c)
		return nil
	case 64_000_000: // 64MHz
		d.writeByte64(c)
		return nil
	case 120_000_000: // 120MHz
		d.writeByte120(c)
		return nil
	case 125_000_000: // 125 MHz e.g. rp2040 originally
		d.writeByte125(c)
		return nil
	case 150_000_000: // 150MHz, e.g. rp2350
		d.writeByte150(c)
		return nil
	case 160_000_000: // 160MHz, e.g. stm32u585
		d.writeByte160(c)
		return nil
	case 168_000_000: // 168MHz, e.g. stm32f405
		d.writeByte168(c)
		return nil
	case 200_000_000: // 200MHz, e.g. rp2040 starting with TinyGo v0.37
		d.writeByte200(c)
		return nil
	default:
		return errUnknownClockSpeed
	}
}
