package main import ( "fmt" "os" "time" "github.com/stianeikeland/go-rpio/v4" ) func busySleep(d time.Duration) { //time.Sleep(d) stop := time.Now().Add(d) for time.Now().Before(stop) {} } type VectorKeyboard struct { Pin rpio.Pin } func (k *VectorKeyboard) Start() { k.Pin.Output() k.Pin.High() } func (k *VectorKeyboard) Type(c byte) { k.bit(false); for i := 1; i < 7; i++ { k.bit((c&1) == 1) c >>= 1 } k.bit(false); k.Pin.High() time.Sleep(71 * time.Millisecond) } func (k *VectorKeyboard) bit(b bool) { stop := time.Now().Add(3350 * time.Microsecond) if (b) { k.Pin.High() } else { k.Pin.Low() } //busySleep(3350 * time.Microsecond) for time.Now().Before(stop) {} } func main() { if err := rpio.Open(); err != nil { fmt.Println("rpio open failed:", err) return } defer rpio.Close() kbd := VectorKeyboard{rpio.Pin(2)} kbd.Start() fmt.Println("Type:") var bs [1]byte for { if _, err := os.Stdin.Read(bs[:]); err != nil { fmt.Println("Read failed:", err) return } kbd.Type(bs[0]) } }