Use a queue to process bus messages
This commit is contained in:
parent
4447e89c5e
commit
a9a074602d
5 changed files with 366 additions and 185 deletions
|
@ -580,24 +580,22 @@ Wire Wire Line
|
||||||
$Comp
|
$Comp
|
||||||
L Connector_Generic:Conn_01x02 J6
|
L Connector_Generic:Conn_01x02 J6
|
||||||
U 1 1 50F5BE5A
|
U 1 1 50F5BE5A
|
||||||
P 1200 2850
|
P 850 2850
|
||||||
AR Path="/50F5BE5A" Ref="J6" Part="1"
|
AR Path="/50F5BE5A" Ref="J6" Part="1"
|
||||||
AR Path="/50FF13A8/50F5BE5A" Ref="J6" Part="1"
|
AR Path="/50FF13A8/50F5BE5A" Ref="J6" Part="1"
|
||||||
F 0 "J6" V 1150 2850 50 0000 C CNN
|
F 0 "J6" V 800 2850 50 0000 C CNN
|
||||||
F 1 "B3_Wago" V 1250 2850 40 0000 C CNN
|
F 1 "B3_Wago" V 900 2850 40 0000 C CNN
|
||||||
F 2 "TerminalBlock_WAGO:TerminalBlock_WAGO_236-402_1x02_P5.00mm_45Degree" H 1200 2850 60 0001 C CNN
|
F 2 "TerminalBlock_WAGO:TerminalBlock_WAGO_236-402_1x02_P5.00mm_45Degree" H 850 2850 60 0001 C CNN
|
||||||
F 3 "" H 1200 2850 60 0001 C CNN
|
F 3 "" H 850 2850 60 0001 C CNN
|
||||||
F 4 "FAR 1283527" H 1200 2850 60 0001 C CNN "Reference"
|
F 4 "FAR 1283527" H 850 2850 60 0001 C CNN "Reference"
|
||||||
F 5 "0,84" H 1200 2850 60 0001 C CNN "prix"
|
F 5 "0,84" H 850 2850 60 0001 C CNN "prix"
|
||||||
1 1200 2850
|
1 850 2850
|
||||||
-1 0 0 -1
|
-1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
1550 2850 1400 2850
|
1550 2850 1450 2850
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
1400 2950 2700 2950
|
1850 2850 1950 2850
|
||||||
Wire Wire Line
|
|
||||||
1850 2850 2200 2850
|
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
3350 3150 3350 3450
|
3350 3150 3350 3450
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
|
@ -796,22 +794,19 @@ F 3 "" H 2700 3600 50 0001 C CNN
|
||||||
1 2700 3600
|
1 2700 3600
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
Connection ~ 9500 1750
|
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
9500 1750 9700 1750
|
9500 1750 9700 1750
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
9500 1950 9700 1950
|
9500 1950 9700 1950
|
||||||
Wire Wire Line
|
|
||||||
9500 1750 9500 1950
|
|
||||||
$Comp
|
$Comp
|
||||||
L power:+12V #PWR0175
|
L power:+12V #PWR0175
|
||||||
U 1 1 60094D63
|
U 1 1 60094D63
|
||||||
P 9500 1750
|
P 9500 1550
|
||||||
F 0 "#PWR0175" H 9500 1600 50 0001 C CNN
|
F 0 "#PWR0175" H 9500 1400 50 0001 C CNN
|
||||||
F 1 "+12V" H 9515 1923 50 0000 C CNN
|
F 1 "+12V" H 9515 1723 50 0000 C CNN
|
||||||
F 2 "" H 9500 1750 50 0001 C CNN
|
F 2 "" H 9500 1550 50 0001 C CNN
|
||||||
F 3 "" H 9500 1750 50 0001 C CNN
|
F 3 "" H 9500 1550 50 0001 C CNN
|
||||||
1 9500 1750
|
1 9500 1550
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
|
@ -829,11 +824,6 @@ Wire Wire Line
|
||||||
Connection ~ 9600 1650
|
Connection ~ 9600 1650
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
9600 1650 9700 1650
|
9600 1650 9700 1650
|
||||||
Connection ~ 9500 1350
|
|
||||||
Wire Wire Line
|
|
||||||
9500 1550 9700 1550
|
|
||||||
Wire Wire Line
|
|
||||||
9500 1350 9500 1550
|
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
9600 2150 9600 2050
|
9600 2150 9600 2050
|
||||||
$Comp
|
$Comp
|
||||||
|
@ -880,102 +870,195 @@ PFET_DRAIN
|
||||||
$Comp
|
$Comp
|
||||||
L Regulator_Linear:LM7805_TO220 U1
|
L Regulator_Linear:LM7805_TO220 U1
|
||||||
U 1 1 60125424
|
U 1 1 60125424
|
||||||
P 7900 5750
|
P 2450 5050
|
||||||
F 0 "U1" H 7900 5992 50 0000 C CNN
|
F 0 "U1" H 2450 5292 50 0000 C CNN
|
||||||
F 1 "LM7805" H 7900 5901 50 0000 C CNN
|
F 1 "LM7805" H 2450 5201 50 0000 C CNN
|
||||||
F 2 "Package_TO_SOT_SMD:SOT-223-3_TabPin2" H 7900 5975 50 0001 C CIN
|
F 2 "Package_TO_SOT_SMD:SOT-223-3_TabPin2" H 2450 5275 50 0001 C CIN
|
||||||
F 3 "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" H 7900 5700 50 0001 C CNN
|
F 3 "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" H 2450 5000 50 0001 C CNN
|
||||||
1 7900 5750
|
1 2450 5050
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
$Comp
|
$Comp
|
||||||
L power:+5V #PWR0176
|
L power:+5V #PWR0176
|
||||||
U 1 1 601266A6
|
U 1 1 601266A6
|
||||||
P 8650 5750
|
P 3200 5050
|
||||||
F 0 "#PWR0176" H 8650 5600 50 0001 C CNN
|
F 0 "#PWR0176" H 3200 4900 50 0001 C CNN
|
||||||
F 1 "+5V" H 8665 5923 50 0000 C CNN
|
F 1 "+5V" H 3215 5223 50 0000 C CNN
|
||||||
F 2 "" H 8650 5750 50 0001 C CNN
|
F 2 "" H 3200 5050 50 0001 C CNN
|
||||||
F 3 "" H 8650 5750 50 0001 C CNN
|
F 3 "" H 3200 5050 50 0001 C CNN
|
||||||
1 8650 5750
|
1 3200 5050
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
$Comp
|
$Comp
|
||||||
L power:+12V #PWR0177
|
L power:+12V #PWR0177
|
||||||
U 1 1 60126C51
|
U 1 1 60126C51
|
||||||
P 7250 5750
|
P 1800 5050
|
||||||
F 0 "#PWR0177" H 7250 5600 50 0001 C CNN
|
F 0 "#PWR0177" H 1800 4900 50 0001 C CNN
|
||||||
F 1 "+12V" H 7265 5923 50 0000 C CNN
|
F 1 "+12V" H 1815 5223 50 0000 C CNN
|
||||||
F 2 "" H 7250 5750 50 0001 C CNN
|
F 2 "" H 1800 5050 50 0001 C CNN
|
||||||
F 3 "" H 7250 5750 50 0001 C CNN
|
F 3 "" H 1800 5050 50 0001 C CNN
|
||||||
1 7250 5750
|
1 1800 5050
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
$Comp
|
$Comp
|
||||||
L Device:CP C?
|
L Device:CP C?
|
||||||
U 1 1 6012703D
|
U 1 1 6012703D
|
||||||
P 8650 5900
|
P 3200 5200
|
||||||
AR Path="/6012703D" Ref="C?" Part="1"
|
AR Path="/6012703D" Ref="C?" Part="1"
|
||||||
AR Path="/50FF13A8/6012703D" Ref="C7" Part="1"
|
AR Path="/50FF13A8/6012703D" Ref="C7" Part="1"
|
||||||
F 0 "C7" H 8700 6200 50 0000 L CNN
|
F 0 "C7" H 3250 5500 50 0000 L CNN
|
||||||
F 1 "10u" V 8800 5850 50 0000 L CNN
|
F 1 "10u" V 3350 5150 50 0000 L CNN
|
||||||
F 2 "Capacitor_THT:CP_Radial_D5.0mm_P2.50mm" H 8650 5900 60 0001 C CNN
|
F 2 "Capacitor_THT:CP_Radial_D5.0mm_P2.50mm" H 3200 5200 60 0001 C CNN
|
||||||
F 3 "" H 8650 5900 60 0001 C CNN
|
F 3 "" H 3200 5200 60 0001 C CNN
|
||||||
F 4 "RS703-7396" H 8650 5900 60 0001 C CNN "Reference"
|
F 4 "RS703-7396" H 3200 5200 60 0001 C CNN "Reference"
|
||||||
F 5 "0.864" H 8650 5900 60 0001 C CNN "prix"
|
F 5 "0.864" H 3200 5200 60 0001 C CNN "prix"
|
||||||
1 8650 5900
|
1 3200 5200
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
$Comp
|
$Comp
|
||||||
L Device:C C?
|
L Device:C C?
|
||||||
U 1 1 6012763F
|
U 1 1 6012763F
|
||||||
P 8200 5900
|
P 2750 5200
|
||||||
AR Path="/6012763F" Ref="C?" Part="1"
|
AR Path="/6012763F" Ref="C?" Part="1"
|
||||||
AR Path="/50FF13A8/6012763F" Ref="C6" Part="1"
|
AR Path="/50FF13A8/6012763F" Ref="C6" Part="1"
|
||||||
F 0 "C6" H 8350 6100 50 0000 L CNN
|
F 0 "C6" H 2900 5400 50 0000 L CNN
|
||||||
F 1 "100n" H 8350 6000 50 0000 L CNN
|
F 1 "100n" H 2900 5300 50 0000 L CNN
|
||||||
F 2 "Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder" H 8550 5900 60 0001 C CNN
|
F 2 "Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder" H 3100 5200 60 0001 C CNN
|
||||||
F 3 "" H 8200 5900 60 0001 C CNN
|
F 3 "" H 2750 5200 60 0001 C CNN
|
||||||
1 8200 5900
|
1 2750 5200
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
8200 5750 8650 5750
|
2750 5050 3200 5050
|
||||||
Connection ~ 8200 5750
|
Connection ~ 2750 5050
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
8650 6050 8200 6050
|
3200 5350 2750 5350
|
||||||
Connection ~ 7900 6050
|
Connection ~ 2450 5350
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
7900 6050 7250 6050
|
2450 5350 1800 5350
|
||||||
Connection ~ 8200 6050
|
Connection ~ 2750 5350
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
8200 6050 7900 6050
|
2750 5350 2450 5350
|
||||||
Wire Wire Line
|
Wire Wire Line
|
||||||
7250 5750 7600 5750
|
1800 5050 2150 5050
|
||||||
Connection ~ 7250 5750
|
Connection ~ 1800 5050
|
||||||
Connection ~ 8650 5750
|
Connection ~ 3200 5050
|
||||||
$Comp
|
$Comp
|
||||||
L Device:C C?
|
L Device:C C?
|
||||||
U 1 1 60127A01
|
U 1 1 60127A01
|
||||||
P 7250 5900
|
P 1800 5200
|
||||||
AR Path="/60127A01" Ref="C?" Part="1"
|
AR Path="/60127A01" Ref="C?" Part="1"
|
||||||
AR Path="/50FF13A8/60127A01" Ref="C5" Part="1"
|
AR Path="/50FF13A8/60127A01" Ref="C5" Part="1"
|
||||||
F 0 "C5" H 7400 6100 50 0000 L CNN
|
F 0 "C5" H 1950 5400 50 0000 L CNN
|
||||||
F 1 "100n" H 7400 6000 50 0000 L CNN
|
F 1 "330n" H 1950 5300 50 0000 L CNN
|
||||||
F 2 "Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder" H 7600 5900 60 0001 C CNN
|
F 2 "Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder" H 2150 5200 60 0001 C CNN
|
||||||
F 3 "" H 7250 5900 60 0001 C CNN
|
F 3 "" H 1800 5200 60 0001 C CNN
|
||||||
1 7250 5900
|
1 1800 5200
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
$Comp
|
$Comp
|
||||||
L power:GND #PWR0179
|
L power:GND #PWR0179
|
||||||
U 1 1 600EBFC5
|
U 1 1 600EBFC5
|
||||||
P 7250 6050
|
P 1800 5350
|
||||||
F 0 "#PWR0179" H 7250 5800 50 0001 C CNN
|
F 0 "#PWR0179" H 1800 5100 50 0001 C CNN
|
||||||
F 1 "GND" H 7255 5877 50 0000 C CNN
|
F 1 "GND" H 1805 5177 50 0000 C CNN
|
||||||
F 2 "" H 7250 6050 50 0001 C CNN
|
F 2 "" H 1800 5350 50 0001 C CNN
|
||||||
F 3 "" H 7250 6050 50 0001 C CNN
|
F 3 "" H 1800 5350 50 0001 C CNN
|
||||||
1 7250 6050
|
1 1800 5350
|
||||||
1 0 0 -1
|
1 0 0 -1
|
||||||
$EndComp
|
$EndComp
|
||||||
Connection ~ 7250 6050
|
Connection ~ 1800 5350
|
||||||
|
$Comp
|
||||||
|
L power:+5V #PWR?
|
||||||
|
U 1 1 60130758
|
||||||
|
P 9500 1950
|
||||||
|
F 0 "#PWR?" H 9500 1800 50 0001 C CNN
|
||||||
|
F 1 "+5V" H 9515 2123 50 0000 C CNN
|
||||||
|
F 2 "" H 9500 1950 50 0001 C CNN
|
||||||
|
F 3 "" H 9500 1950 50 0001 C CNN
|
||||||
|
1 9500 1950
|
||||||
|
1 0 0 -1
|
||||||
|
$EndComp
|
||||||
|
Wire Wire Line
|
||||||
|
9500 1550 9700 1550
|
||||||
|
Wire Wire Line
|
||||||
|
9500 1550 9500 1750
|
||||||
|
Connection ~ 9500 1550
|
||||||
|
$Comp
|
||||||
|
L power:LINE #PWR?
|
||||||
|
U 1 1 6013AC53
|
||||||
|
P 1200 2250
|
||||||
|
F 0 "#PWR?" H 1200 2100 50 0001 C CNN
|
||||||
|
F 1 "LINE" H 1215 2423 50 0000 C CNN
|
||||||
|
F 2 "" H 1200 2250 50 0001 C CNN
|
||||||
|
F 3 "" H 1200 2250 50 0001 C CNN
|
||||||
|
1 1200 2250
|
||||||
|
1 0 0 -1
|
||||||
|
$EndComp
|
||||||
|
$Comp
|
||||||
|
L Device:Polyfuse F?
|
||||||
|
U 1 1 6013BA9D
|
||||||
|
P 1700 2700
|
||||||
|
F 0 "F?" V 1475 2700 50 0000 C CNN
|
||||||
|
F 1 "2A" V 1566 2700 50 0000 C CNN
|
||||||
|
F 2 "" H 1750 2500 50 0001 L CNN
|
||||||
|
F 3 "~" H 1700 2700 50 0001 C CNN
|
||||||
|
1 1700 2700
|
||||||
|
0 1 1 0
|
||||||
|
$EndComp
|
||||||
|
Wire Wire Line
|
||||||
|
1850 2700 1950 2700
|
||||||
|
Wire Wire Line
|
||||||
|
1950 2700 1950 2850
|
||||||
|
Connection ~ 1950 2850
|
||||||
|
Wire Wire Line
|
||||||
|
1950 2850 2200 2850
|
||||||
|
Wire Wire Line
|
||||||
|
1550 2700 1450 2700
|
||||||
|
Wire Wire Line
|
||||||
|
1450 2700 1450 2850
|
||||||
|
Connection ~ 1450 2850
|
||||||
|
$Comp
|
||||||
|
L Device:Jumper JP?
|
||||||
|
U 1 1 60146B55
|
||||||
|
P 1200 2550
|
||||||
|
F 0 "JP?" V 1154 2677 50 0000 L CNN
|
||||||
|
F 1 "AC" V 1245 2677 50 0000 L CNN
|
||||||
|
F 2 "" H 1200 2550 50 0001 C CNN
|
||||||
|
F 3 "~" H 1200 2550 50 0001 C CNN
|
||||||
|
1 1200 2550
|
||||||
|
0 1 1 0
|
||||||
|
$EndComp
|
||||||
|
Wire Wire Line
|
||||||
|
1050 2850 1200 2850
|
||||||
|
Connection ~ 1200 2850
|
||||||
|
Wire Wire Line
|
||||||
|
1200 2850 1450 2850
|
||||||
|
$Comp
|
||||||
|
L Device:Jumper JP?
|
||||||
|
U 1 1 6014CA6B
|
||||||
|
P 1200 3250
|
||||||
|
F 0 "JP?" V 1246 3162 50 0000 R CNN
|
||||||
|
F 1 "AC" V 1155 3162 50 0000 R CNN
|
||||||
|
F 2 "" H 1200 3250 50 0001 C CNN
|
||||||
|
F 3 "~" H 1200 3250 50 0001 C CNN
|
||||||
|
1 1200 3250
|
||||||
|
0 -1 -1 0
|
||||||
|
$EndComp
|
||||||
|
Wire Wire Line
|
||||||
|
1050 2950 1200 2950
|
||||||
|
Connection ~ 1200 2950
|
||||||
|
Wire Wire Line
|
||||||
|
1200 2950 2700 2950
|
||||||
|
$Comp
|
||||||
|
L power:NEUT #PWR?
|
||||||
|
U 1 1 60152DC7
|
||||||
|
P 1200 3550
|
||||||
|
F 0 "#PWR?" H 1200 3400 50 0001 C CNN
|
||||||
|
F 1 "NEUT" H 1215 3723 50 0000 C CNN
|
||||||
|
F 2 "" H 1200 3550 50 0001 C CNN
|
||||||
|
F 3 "" H 1200 3550 50 0001 C CNN
|
||||||
|
1 1200 3550
|
||||||
|
-1 0 0 1
|
||||||
|
$EndComp
|
||||||
$EndSCHEMATC
|
$EndSCHEMATC
|
||||||
|
|
|
@ -220,6 +220,28 @@ X ~ 2 0 -150 50 U 50 50 1 1 P
|
||||||
ENDDRAW
|
ENDDRAW
|
||||||
ENDDEF
|
ENDDEF
|
||||||
#
|
#
|
||||||
|
# Device_Jumper
|
||||||
|
#
|
||||||
|
DEF Device_Jumper JP 0 30 Y N 1 F N
|
||||||
|
F0 "JP" 0 150 50 H V C CNN
|
||||||
|
F1 "Device_Jumper" 0 -80 50 H V C CNN
|
||||||
|
F2 "" 0 0 50 H I C CNN
|
||||||
|
F3 "" 0 0 50 H I C CNN
|
||||||
|
$FPLIST
|
||||||
|
SolderJumper*
|
||||||
|
Jumper*
|
||||||
|
TestPoint*2Pads*
|
||||||
|
TestPoint*Bridge*
|
||||||
|
$ENDFPLIST
|
||||||
|
DRAW
|
||||||
|
A 0 -26 125 1426 373 0 1 0 N -98 50 99 50
|
||||||
|
C -100 0 35 0 1 0 N
|
||||||
|
C 100 0 35 0 1 0 N
|
||||||
|
X 1 1 -300 0 165 R 50 50 0 1 P
|
||||||
|
X 2 2 300 0 165 L 50 50 0 1 P
|
||||||
|
ENDDRAW
|
||||||
|
ENDDEF
|
||||||
|
#
|
||||||
# Device_L
|
# Device_L
|
||||||
#
|
#
|
||||||
DEF Device_L L 0 40 N N 1 F N
|
DEF Device_L L 0 40 N N 1 F N
|
||||||
|
@ -243,6 +265,26 @@ X 2 2 0 -150 50 U 50 50 1 1 P
|
||||||
ENDDRAW
|
ENDDRAW
|
||||||
ENDDEF
|
ENDDEF
|
||||||
#
|
#
|
||||||
|
# Device_Polyfuse
|
||||||
|
#
|
||||||
|
DEF Device_Polyfuse F 0 0 N Y 1 F N
|
||||||
|
F0 "F" -100 0 50 V V C CNN
|
||||||
|
F1 "Device_Polyfuse" 100 0 50 V V C CNN
|
||||||
|
F2 "" 50 -200 50 H I L CNN
|
||||||
|
F3 "" 0 0 50 H I C CNN
|
||||||
|
$FPLIST
|
||||||
|
*polyfuse*
|
||||||
|
*PTC*
|
||||||
|
$ENDFPLIST
|
||||||
|
DRAW
|
||||||
|
S -30 100 30 -100 0 1 10 N
|
||||||
|
P 2 0 1 0 0 100 0 -100 N
|
||||||
|
P 4 0 1 0 -60 100 -60 60 60 -60 60 -100 N
|
||||||
|
X ~ 1 0 150 50 D 50 50 1 1 P
|
||||||
|
X ~ 2 0 -150 50 U 50 50 1 1 P
|
||||||
|
ENDDRAW
|
||||||
|
ENDDEF
|
||||||
|
#
|
||||||
# Device_Q_NPN_BCE
|
# Device_Q_NPN_BCE
|
||||||
#
|
#
|
||||||
DEF Device_Q_NPN_BCE Q 0 0 Y N 1 F N
|
DEF Device_Q_NPN_BCE Q 0 0 Y N 1 F N
|
||||||
|
|
200
uncanny/can.go
200
uncanny/can.go
|
@ -7,8 +7,12 @@ import (
|
||||||
"github.com/brutella/can"
|
"github.com/brutella/can"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const queueSize = 10
|
||||||
|
|
||||||
type Can struct {
|
type Can struct {
|
||||||
bus *can.Bus
|
bus *can.Bus
|
||||||
|
queue chan func()
|
||||||
|
|
||||||
swstate FeedbackMessage
|
swstate FeedbackMessage
|
||||||
dispstate int
|
dispstate int
|
||||||
}
|
}
|
||||||
|
@ -20,112 +24,154 @@ func NewCan(intf string) (*Can, error) {
|
||||||
}
|
}
|
||||||
can := &Can{
|
can := &Can{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
|
queue: make(chan func(), queueSize),
|
||||||
dispstate: -1,
|
dispstate: -1,
|
||||||
}
|
}
|
||||||
bus.Subscribe(can)
|
bus.Subscribe(can)
|
||||||
return can, nil
|
return can, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) Start() {
|
func (c *Can) Start() error {
|
||||||
go func() {
|
go c.process()
|
||||||
// send the init sequence, but (hopefully) defer until after we start listening
|
log.Printf("Starting bus listener")
|
||||||
// FIXME this is inherently racy :(
|
return c.bus.ConnectAndPublish()
|
||||||
go c.initialize()
|
|
||||||
// ConnectAndPublish will block, so we'll just leave the Printf hanging here
|
|
||||||
log.Printf("CAN bus shut down: %v", c.bus.ConnectAndPublish())
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) Stop() {
|
func (c *Can) process() {
|
||||||
c.bus.Disconnect()
|
running := true
|
||||||
|
log.Printf("Starting processing queue")
|
||||||
|
for running {
|
||||||
|
select {
|
||||||
|
case fn, ok := <-c.queue:
|
||||||
|
if ok {
|
||||||
|
fn()
|
||||||
|
} else {
|
||||||
|
running = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for range c.queue {}
|
||||||
|
log.Printf("Processing queue shut down")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Can) Stop() error {
|
||||||
|
log.Printf("Shutting down processing queue and bus listener")
|
||||||
|
close(c.queue)
|
||||||
|
return c.bus.Disconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) Handle(frame can.Frame) {
|
func (c *Can) Handle(frame can.Frame) {
|
||||||
log.Printf("Got CAN frame to 0x%08x", frame.ID)
|
c.queue <- func() {
|
||||||
typ, obj, err := DecodeMessage(frame)
|
log.Printf("Got CAN frame to 0x%08x", frame.ID)
|
||||||
if err != nil {
|
typ, obj, err := DecodeMessage(frame)
|
||||||
if err == UnsupportedMessageType {
|
if err != nil {
|
||||||
log.Printf("Unsupported message type: 0x%08x", frame.ID)
|
if err == UnsupportedMessageType {
|
||||||
} else {
|
log.Printf("Unsupported message type: 0x%08x", frame.ID)
|
||||||
log.Printf("Cannot decode message: %v", err)
|
} else {
|
||||||
}
|
log.Printf("Cannot decode message: %v", err)
|
||||||
} else {
|
}
|
||||||
switch typ {
|
} else {
|
||||||
case MessageTypeFeedback:
|
switch typ {
|
||||||
log.Printf("Got feedback message: %+v", obj.(FeedbackMessage))
|
case MessageTypeFeedback:
|
||||||
log.Printf("Data: 0x%02x 0x%02x", frame.Data[0], frame.Data[1])
|
log.Printf("Got feedback message: %+v", obj.(FeedbackMessage))
|
||||||
c.swstate = obj.(FeedbackMessage)
|
log.Printf("Data: 0x%02x 0x%02x", frame.Data[0], frame.Data[1])
|
||||||
// when all end switches are off: send stop command
|
c.swstate = obj.(FeedbackMessage)
|
||||||
if !c.swstate.EndD && !c.swstate.EndE && !c.swstate.EndF && !c.swstate.EndG && !c.swstate.EndH {
|
// when all end switches are off: send stop command
|
||||||
log.Printf("All end switches off, stopping dispenser")
|
if !c.swstate.EndD && !c.swstate.EndE && !c.swstate.EndF && !c.swstate.EndG && !c.swstate.EndH {
|
||||||
c.Cancel()
|
log.Printf("All end switches off, stopping dispenser")
|
||||||
|
c.Cancel()
|
||||||
|
}
|
||||||
|
case MessageTypeFeedbackRequest:
|
||||||
|
// ignore
|
||||||
|
case MessageTypePower:
|
||||||
|
log.Printf("Got power message: %+v", obj.(PowerMessage))
|
||||||
|
// ignore
|
||||||
|
case MessageTypePowerRequest:
|
||||||
|
// ignore
|
||||||
|
case MessageTypeDispense:
|
||||||
|
log.Printf("Got dispense message: %+v", obj.(DispenseMessage))
|
||||||
|
c.dispstate = obj.(DispenseMessage).Slot
|
||||||
|
case MessageTypeAuto:
|
||||||
|
// ignore
|
||||||
}
|
}
|
||||||
case MessageTypeFeedbackRequest:
|
|
||||||
// ignore
|
|
||||||
case MessageTypePower:
|
|
||||||
log.Printf("Got power message: %+v", obj.(PowerMessage))
|
|
||||||
// ignore
|
|
||||||
case MessageTypePowerRequest:
|
|
||||||
// ignore
|
|
||||||
case MessageTypeDispense:
|
|
||||||
log.Printf("Got dispense message: %+v", obj.(DispenseMessage))
|
|
||||||
c.dispstate = obj.(DispenseMessage).Slot
|
|
||||||
case MessageTypeAuto:
|
|
||||||
// ignore
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) IsEmpty(slot int) bool {
|
func (c *Can) IsEmpty(slot int) bool {
|
||||||
switch (slot) {
|
ret := make(chan bool)
|
||||||
case 0:
|
c.queue <- func() {
|
||||||
return c.swstate.EmptyD
|
switch (slot) {
|
||||||
case 1:
|
case 0:
|
||||||
return c.swstate.EmptyE
|
ret <- c.swstate.EmptyD
|
||||||
case 2:
|
case 1:
|
||||||
return c.swstate.EmptyF
|
ret <- c.swstate.EmptyE
|
||||||
case 3:
|
case 2:
|
||||||
return c.swstate.EmptyG
|
ret <- c.swstate.EmptyF
|
||||||
case 4:
|
case 3:
|
||||||
return c.swstate.EmptyH
|
ret <- c.swstate.EmptyG
|
||||||
|
case 4:
|
||||||
|
ret <- c.swstate.EmptyH
|
||||||
|
}
|
||||||
|
ret <- false
|
||||||
}
|
}
|
||||||
return false
|
return <-ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) IsDispensing(slot int) bool {
|
func (c *Can) IsDispensing(slot int) bool {
|
||||||
switch (slot) {
|
ret := make(chan bool)
|
||||||
case 0:
|
c.queue <- func() {
|
||||||
return c.swstate.EndD
|
switch (slot) {
|
||||||
case 1:
|
case 0:
|
||||||
return c.swstate.EndE
|
ret <- c.swstate.EndD
|
||||||
case 2:
|
case 1:
|
||||||
return c.swstate.EndF
|
ret <- c.swstate.EndE
|
||||||
case 3:
|
case 2:
|
||||||
return c.swstate.EndG
|
ret <- c.swstate.EndF
|
||||||
case 4:
|
case 3:
|
||||||
return c.swstate.EndH
|
ret <- c.swstate.EndG
|
||||||
|
case 4:
|
||||||
|
ret <- c.swstate.EndH
|
||||||
|
}
|
||||||
|
ret <- false
|
||||||
}
|
}
|
||||||
return false
|
return <-ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) ActiveDispenser() int {
|
func (c *Can) ActiveDispenser() int {
|
||||||
return c.dispstate
|
ret := make(chan int)
|
||||||
|
c.queue <- func() {
|
||||||
|
ret <- c.dispstate
|
||||||
|
}
|
||||||
|
return <- ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) Dispense(slot int) error {
|
func (c *Can) Dispense(slot int) {
|
||||||
log.Printf("Starting dispense on slot %d", slot)
|
c.queue <- func() {
|
||||||
return c.bus.Publish(DispenseMessage{slot}.Encode())
|
log.Printf("Starting dispense on slot %d", slot)
|
||||||
|
err := c.bus.Publish(DispenseMessage{slot}.Encode())
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending dispense command: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) Cancel() error {
|
func (c *Can) Cancel() {
|
||||||
log.Printf("Stopping dispense")
|
c.queue <- func() {
|
||||||
return c.bus.Publish(DispenseMessage{DispenseSlotOff}.Encode())
|
log.Printf("Stopping dispense")
|
||||||
|
err := c.bus.Publish(DispenseMessage{DispenseSlotOff}.Encode())
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error sending stop command: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Can) initialize() {
|
func (c *Can) Initialize() {
|
||||||
log.Printf("Initializing")
|
c.queue <- func() {
|
||||||
// enable automatic status updates
|
log.Printf("Initializing devices")
|
||||||
c.bus.Publish(AutoMessage{true}.Encode())
|
// enable automatic status updates
|
||||||
c.bus.Publish(RequestFeedbackMessage())
|
c.bus.Publish(AutoMessage{true}.Encode())
|
||||||
c.bus.Publish(RequestPowerMessage())
|
c.bus.Publish(RequestFeedbackMessage())
|
||||||
|
c.bus.Publish(RequestPowerMessage())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"git.kabelsalat.ch/seto/matemat/uncanny"
|
"git.kabelsalat.ch/seto/matemat/uncanny"
|
||||||
"log"
|
"log"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -21,7 +22,20 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
server := uncanny.NewServer(can)
|
server := uncanny.NewServer(can, addr)
|
||||||
can.Start()
|
can.Start()
|
||||||
log.Fatal(server.ListenAndServe(addr))
|
wg := sync.WaitGroup{}
|
||||||
|
wg.Add(2)
|
||||||
|
go func() {
|
||||||
|
log.Printf("Server exited: %v", server.Start())
|
||||||
|
wg.Done()
|
||||||
|
can.Stop()
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
log.Printf("Bus listener exited: %v", can.Start())
|
||||||
|
wg.Done()
|
||||||
|
server.Stop()
|
||||||
|
}()
|
||||||
|
wg.Wait()
|
||||||
|
log.Printf("Shut down")
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,15 +15,20 @@ const (
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
*http.ServeMux
|
*http.ServeMux
|
||||||
|
srv *http.Server
|
||||||
can *Can
|
can *Can
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServer(can *Can) *Server {
|
func NewServer(can *Can, addr string) *Server {
|
||||||
ret := &Server{
|
ret := &Server{
|
||||||
ServeMux: http.NewServeMux(),
|
ServeMux: http.NewServeMux(),
|
||||||
can: can,
|
can: can,
|
||||||
|
srv: &http.Server{
|
||||||
|
Addr: addr,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
ret.registerHandlers()
|
ret.registerHandlers()
|
||||||
|
ret.srv.Handler = ret
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,17 +44,10 @@ func (s *Server) registerHandlers() {
|
||||||
log.Printf("Invalid slot number: %d", slot)
|
log.Printf("Invalid slot number: %d", slot)
|
||||||
http.Error(rw, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
http.Error(rw, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
||||||
} else {
|
} else {
|
||||||
err = s.can.Dispense(int(slot))
|
s.can.Dispense(int(slot))
|
||||||
if err != nil {
|
rw.Header().Set("Content-Type", "text/plain")
|
||||||
log.Printf("Error sending dispense command: %v", err)
|
rw.WriteHeader(http.StatusOK)
|
||||||
rw.Header().Set("Content-Type", "text/plain")
|
fmt.Fprintf(rw, "%d dispensing", slot)
|
||||||
rw.WriteHeader(http.StatusServiceUnavailable)
|
|
||||||
fmt.Fprintf(rw, "%d error", slot)
|
|
||||||
} else {
|
|
||||||
rw.Header().Set("Content-Type", "text/plain")
|
|
||||||
rw.WriteHeader(http.StatusOK)
|
|
||||||
fmt.Fprintf(rw, "%d dispense", slot)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Printf("Mismatched path: %s", r.URL.Path)
|
log.Printf("Mismatched path: %s", r.URL.Path)
|
||||||
|
@ -57,17 +55,10 @@ func (s *Server) registerHandlers() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
s.HandleFunc("/stop", func(rw http.ResponseWriter, r *http.Request) {
|
s.HandleFunc("/stop", func(rw http.ResponseWriter, r *http.Request) {
|
||||||
err := s.can.Cancel()
|
s.can.Cancel()
|
||||||
if err != nil {
|
rw.Header().Set("Content-Type", "text/plain")
|
||||||
log.Printf("Error sending stop command: %v", err)
|
rw.WriteHeader(http.StatusOK)
|
||||||
rw.Header().Set("Content-Type", "text/plain")
|
fmt.Fprintf(rw, "stopping")
|
||||||
rw.WriteHeader(http.StatusServiceUnavailable)
|
|
||||||
fmt.Fprintf(rw, "error")
|
|
||||||
} else {
|
|
||||||
rw.Header().Set("Content-Type", "text/plain")
|
|
||||||
rw.WriteHeader(http.StatusOK)
|
|
||||||
fmt.Fprintf(rw, "stopped")
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
s.HandleFunc("/level/", func(rw http.ResponseWriter, r *http.Request) {
|
s.HandleFunc("/level/", func(rw http.ResponseWriter, r *http.Request) {
|
||||||
if matched, _ := path.Match("/level/[0-9]*", r.URL.Path); matched {
|
if matched, _ := path.Match("/level/[0-9]*", r.URL.Path); matched {
|
||||||
|
@ -117,6 +108,11 @@ func (s *Server) registerHandlers() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) ListenAndServe(addr string) error {
|
func (s *Server) Start() error {
|
||||||
return http.ListenAndServe(addr, s)
|
log.Printf("Listening on %v", s.srv.Addr)
|
||||||
|
return s.srv.ListenAndServe()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Stop() error {
|
||||||
|
return s.srv.Close()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue