Skip to content

Commit 9fb49cf

Browse files
author
Tyler Bell
committed
avr: pin change interrupt - yet more cleanup
1 parent 406027c commit 9fb49cf

File tree

2 files changed

+57
-55
lines changed

2 files changed

+57
-55
lines changed

src/machine/machine.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var (
99
ErrInvalidClockPin = errors.New("machine: invalid clock pin")
1010
ErrInvalidDataPin = errors.New("machine: invalid data pin")
1111
ErrNoPinChangeChannel = errors.New("machine: no channel available for pin interrupt")
12+
ErrNotImplemented = errors.New("machine: not implemented")
1213
)
1314

1415
// Device is the running program's chip name, such as "ATSAMD51J19A" or

src/machine/machine_atmega328p.go

Lines changed: 56 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import (
1010
"runtime/volatile"
1111
)
1212

13+
var (
14+
ErrCallbackAlreadyDefined = errors.New("machine: callback already defined")
15+
)
16+
1317
const irq_USART0_RX = avr.IRQ_USART_RX
1418

1519
// getPortMask returns the PORTx register and mask for the pin.
@@ -501,63 +505,60 @@ func handlePCINT2Interrupts(intr interrupt.Interrupt) {
501505
func SetInterrupt(pin Pin, callback func(Pin)) (err error) {
502506
if callback == nil {
503507
// Disable this pin interrupt
504-
return errors.New("Not implemented")
505-
} else {
506-
var PCMSK_REG *volatile.Register8
507-
var PCIE uint8
508-
var PCINT uint8
509-
var IRQ uint8
510-
var PIN0 Pin
511-
//var PIN *volatile.Register8
512-
switch {
513-
case pin >= PB0 && pin <= PB7:
514-
// PCMSK0 - PCINT0-7
515-
PCMSK_REG = avr.PCMSK0
516-
PCIE = avr.PCICR_PCIE0
517-
PIN0 = PD0
518-
PCINT = 1 << (pin - PIN0)
519-
IRQ = avr.IRQ_PCINT0
520-
if interrupts[IRQ-avr.IRQ_PCINT0] == nil {
521-
intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts)
522-
interrupts[IRQ-avr.IRQ_PCINT0] = &intr
523-
} else {
524-
}
525-
case pin >= PC0 && pin <= PC7:
526-
// PCMSK1 - PCINT8-14
527-
PCMSK_REG = avr.PCMSK1
528-
PCIE = avr.PCICR_PCIE1
529-
PIN0 = PC0
530-
PCINT = 1 << (pin - PIN0)
531-
IRQ = avr.IRQ_PCINT1
532-
if interrupts[IRQ-avr.IRQ_PCINT0] == nil {
533-
intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts)
534-
interrupts[IRQ-avr.IRQ_PCINT0] = &intr
535-
} else {
536-
}
537-
case pin >= PD0 && pin <= PD7:
538-
// PCMSK2 - PCINT16-23
539-
PCMSK_REG = avr.PCMSK2
540-
PCIE = avr.PCICR_PCIE2
541-
PIN0 = PD0
542-
PCINT = 1 << (pin - PIN0)
543-
IRQ = avr.IRQ_PCINT2
544-
if interrupts[IRQ-avr.IRQ_PCINT0] == nil {
545-
intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts)
546-
interrupts[IRQ-avr.IRQ_PCINT0] = &intr
547-
}
548-
default:
549-
return errors.New("Unsupported pin")
550-
}
508+
return ErrNotImplemented
509+
}
510+
var PCMSK_REG *volatile.Register8
511+
var PCIE uint8
512+
var PCINT uint8
513+
var IRQ uint8
514+
var PIN0 Pin
551515

552-
if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] == nil {
553-
pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback
554-
} else {
555-
return errors.New("callback already defined")
516+
switch {
517+
case pin >= PB0 && pin <= PB7:
518+
// PCMSK0 - PCINT0-7
519+
PCMSK_REG = avr.PCMSK0
520+
PCIE = avr.PCICR_PCIE0
521+
PIN0 = PD0
522+
PCINT = 1 << (pin - PIN0)
523+
IRQ = avr.IRQ_PCINT0
524+
if interrupts[IRQ-avr.IRQ_PCINT0] == nil {
525+
intr := interrupt.New(avr.IRQ_PCINT0, handlePCINT0Interrupts)
526+
interrupts[IRQ-avr.IRQ_PCINT0] = &intr
556527
}
528+
case pin >= PC0 && pin <= PC7:
529+
// PCMSK1 - PCINT8-14
530+
PCMSK_REG = avr.PCMSK1
531+
PCIE = avr.PCICR_PCIE1
532+
PIN0 = PC0
533+
PCINT = 1 << (pin - PIN0)
534+
IRQ = avr.IRQ_PCINT1
535+
if interrupts[IRQ-avr.IRQ_PCINT0] == nil {
536+
intr := interrupt.New(avr.IRQ_PCINT1, handlePCINT1Interrupts)
537+
interrupts[IRQ-avr.IRQ_PCINT0] = &intr
538+
}
539+
case pin >= PD0 && pin <= PD7:
540+
// PCMSK2 - PCINT16-23
541+
PCMSK_REG = avr.PCMSK2
542+
PCIE = avr.PCICR_PCIE2
543+
PIN0 = PD0
544+
PCINT = 1 << (pin - PIN0)
545+
IRQ = avr.IRQ_PCINT2
546+
if interrupts[IRQ-avr.IRQ_PCINT0] == nil {
547+
intr := interrupt.New(avr.IRQ_PCINT2, handlePCINT2Interrupts)
548+
interrupts[IRQ-avr.IRQ_PCINT0] = &intr
549+
}
550+
default:
551+
return ErrInvalidInputPin
552+
}
557553

558-
PCMSK_REG.SetBits(PCINT)
559-
avr.PCICR.SetBits(PCIE)
560-
561-
return nil
554+
if pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] != nil {
555+
return ErrCallbackAlreadyDefined
562556
}
557+
558+
pinCallbacks[IRQ-avr.IRQ_PCINT0][pin-PIN0] = callback
559+
560+
PCMSK_REG.SetBits(PCINT)
561+
avr.PCICR.SetBits(PCIE)
562+
563+
return nil
563564
}

0 commit comments

Comments
 (0)