-
Notifications
You must be signed in to change notification settings - Fork 4
/
pin.go
72 lines (58 loc) · 1.55 KB
/
pin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package gpio
import (
"unsafe"
)
// Pin represents one phisical pin (specific pin in specific port).
type Pin struct {
h uintptr
}
// IsValid reports whether p represents a valid pin.
func (p Pin) IsValid() bool {
return p.h != 0
}
// Port returns the port where the pin is located.
func (p Pin) Port() *Port {
return (*Port)(unsafe.Pointer(p.h &^ 0xf))
}
func (p Pin) number() uintptr {
return p.h & 0xf
}
// Num returns pin number in the port.
func (p Pin) Num() int {
return int(p.number())
}
// Setup configures pin.
func (p Pin) Setup(cfg *Config) {
p.Port().SetupPin(p.Num(), cfg)
}
// Lock locks configuration of pin. Locked configuration can not be modified
// until reset
func (p Pin) Lock() {
p.Port().Lock(Pin0 << p.number())
}
// Mask return bitmask that represents the pin.
func (p Pin) Mask() Pins {
return Pin0 << p.number()
}
// Load returns input value of the pin.
func (p Pin) Load() int {
return int(p.Port().idr.Load()) >> p.number() & 1
}
// LoadOut returns output value of the pin.
func (p Pin) LoadOut() int {
return int(p.Port().odr.Load()) >> p.number() & 1
}
// Set sets output value of the pin to 1 in one atomic operation.
func (p Pin) Set() {
p.Port().bsrr.Store(uint32(Pin0) << p.number())
}
// Clear sets output value of the pin to 0 in one atomic operation.
func (p Pin) Clear() {
p.Port().bsrr.Store(uint32(Pin0) << 16 << p.number())
}
// Store sets output value of the pin to the least significant bit of val.
func (p Pin) Store(val int) {
n := p.number()
v := ^uint32(val)&1<<16 | uint32(val)&1
p.Port().bsrr.Store(v << n)
}