@@ -10,6 +10,10 @@ import (
1010 "runtime/volatile"
1111)
1212
13+ var (
14+ ErrCallbackAlreadyDefined = errors .New ("machine: callback already defined" )
15+ )
16+
1317const 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) {
501505func 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