Compare commits

30 Commits

Author SHA1 Message Date
Martin Quarda
80653dfe11 misplaced start and finish 2025-04-16 15:17:58 +02:00
Martin Quarda
b737934f05 clear usb from applications 2025-04-16 13:09:32 +02:00
Martin Quarda
9227a8bfdb fix 2025-04-09 09:09:28 +02:00
Martin Quarda
5a34e9e4e5 more on_success handlers 2025-04-06 09:20:52 +02:00
Martin Quarda
ef915110a7 registrace.py: update racer only on success 2025-04-06 09:14:13 +02:00
Martin Quarda
19ead426fb reoder to make it works 2025-04-04 18:15:13 +02:00
Martin Quarda
2c9ea8e379 reload_racers button 2025-04-04 11:31:07 +02:00
Martin Quarda
8104096c0b remove /api/station/register at unregister, now server handles it 2025-04-04 10:18:13 +02:00
Martin Quarda
c4d7df8b5d testing dialog 2025-04-04 09:35:03 +02:00
Martin Quarda
03d8045990 small fixes 2025-04-01 20:14:05 +02:00
Martin Quarda
c59b24a561 logs 2025-04-01 11:51:17 +02:00
Martin Quarda
586bd3dc84 unify register and main py worker 2025-04-01 09:35:20 +02:00
Martin Quarda
2e9c11d73b refactor usbcardreader into own file 2025-04-01 09:07:51 +02:00
Martin Quarda
ca8d008e77 first working version 2025-04-01 10:47:02 +02:00
Martin Quarda
bc61d8a0bd small fix 2025-03-28 10:42:29 +01:00
Martin Quarda
2221f5b39d more autonomous 2025-03-28 10:41:17 +01:00
Martin Quarda
9deda461ee added error handling in registrace.py 2025-03-27 17:56:04 +01:00
Martin Quarda
52d81c127d finish up unregister and one variable for host in config 2025-03-27 14:57:32 +01:00
Martin Quarda
5653972b8d creation of registrace.py application, upload time to website in StopWatch 2025-03-27 14:37:40 +01:00
Martin Quarda
c441dc7a32 fix spaces 2025-03-25 08:11:28 +01:00
cee41ca595 added start to finish stopwatch 2025-02-25 18:17:36 +01:00
46df08600d added stopwatch card reader code 2025-01-13 21:26:05 +01:00
07473c8a20 added run script which forces Adw light theme because we don't support dark mode at this time 2024-11-30 17:11:22 +01:00
c267155b25 modified timer so it counts to -10s 2024-11-27 16:18:09 +01:00
da3215ec5e added header 2024-11-27 15:52:50 +01:00
c1b729cf52 added base GUI structure for stopwatch 2024-11-27 15:41:06 +01:00
7c871a3b5c added button top 3d model and buzzer to code 2024-02-28 19:37:58 +01:00
91739586d0 added HW for button 2024-02-28 13:03:36 +01:00
7477f909ad Merge branch 'main' of https://gitea.angoosh.com/angoosh/Alkator 2024-02-28 13:03:12 +01:00
a3fa6bc685 added pcb for timer_button 2024-02-05 14:36:43 +01:00
37 changed files with 124002 additions and 41 deletions

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

92107
HW/timer_button/fp-info-cache Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
Designator,Footprint,Quantity,Value,LCSC Part #
BZ1,Buzzer_12x9.5RM7.6,1,Buzzer,
"C1, C10, C11, C12, C17, C2, C4, C5, C6, C7, C8, C9",0805,12,100n,
"C13, C14",0805,2,1u,
"C15, C16",0805,2,12p,
C3,0805,1,10n,
D1,WSON-6-1EP_3x3mm_P0.95mm,1,TPD3E001DRSR,
"D10, D11, D12, D3, D4, D5, D6, D7, D8, D9",LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm,10,WS2812B,
D2,1206,1,LED,
J1,USB_C_Receptacle_HRO_TYPE-C-31-M-12,1,USB_C_Receptacle_USB2.0_16P,
J2,PinHeader_1x02_P2.54mm_Vertical,1,Conn_01x02,
"J3, J8, J9",PinHeader_1x03_P2.54mm_Vertical,3,Conn_01x03,
J4,PinHeader_1x06_P2.54mm_Vertical,1,Conn_01x06,
"J5, J6",PinHeader_1x04_P2.54mm_Vertical,2,Conn_01x04,
J7,PinHeader_2x05_P2.54mm_Vertical,1,Conn_02x05_Odd_Even,
JP1,SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm,1,Jumper_2_Open,
"Q1, Q3",SOT-23,2,BSS123T-HF,
Q2,TSOP-6_1.65x3.05mm_P0.95mm,1,PMN30XPEAX,
"R1, R7",0805,2,5k1,
"R10, R11, R12, R13, R15, R2, R4, R8",0805,8,10k,
R14,0805,1,560R,
"R3, R9",0805,2,1k,
"R5, R6",0805,2,27R,
SW1,SW_Cherry_MX_1.00u_PCB,1,SW_Push,
"SW2, SW3",SW_SPST_TL3342,2,SW_Push,
U1,QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm,1,RP2040,
U2,SOIC-8_5.23x5.23mm_P1.27mm,1,W25Q128JVS,
U3,SOT-23-5_HandSoldering,1,SP6205EM5-L-3-3,
Y1,Crystal_SMD_5032-2Pin_5.0x3.2mm,1,12MHz,
1 Designator Footprint Quantity Value LCSC Part #
2 BZ1 Buzzer_12x9.5RM7.6 1 Buzzer
3 C1, C10, C11, C12, C17, C2, C4, C5, C6, C7, C8, C9 0805 12 100n
4 C13, C14 0805 2 1u
5 C15, C16 0805 2 12p
6 C3 0805 1 10n
7 D1 WSON-6-1EP_3x3mm_P0.95mm 1 TPD3E001DRSR
8 D10, D11, D12, D3, D4, D5, D6, D7, D8, D9 LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm 10 WS2812B
9 D2 1206 1 LED
10 J1 USB_C_Receptacle_HRO_TYPE-C-31-M-12 1 USB_C_Receptacle_USB2.0_16P
11 J2 PinHeader_1x02_P2.54mm_Vertical 1 Conn_01x02
12 J3, J8, J9 PinHeader_1x03_P2.54mm_Vertical 3 Conn_01x03
13 J4 PinHeader_1x06_P2.54mm_Vertical 1 Conn_01x06
14 J5, J6 PinHeader_1x04_P2.54mm_Vertical 2 Conn_01x04
15 J7 PinHeader_2x05_P2.54mm_Vertical 1 Conn_02x05_Odd_Even
16 JP1 SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm 1 Jumper_2_Open
17 Q1, Q3 SOT-23 2 BSS123T-HF
18 Q2 TSOP-6_1.65x3.05mm_P0.95mm 1 PMN30XPEAX
19 R1, R7 0805 2 5k1
20 R10, R11, R12, R13, R15, R2, R4, R8 0805 8 10k
21 R14 0805 1 560R
22 R3, R9 0805 2 1k
23 R5, R6 0805 2 27R
24 SW1 SW_Cherry_MX_1.00u_PCB 1 SW_Push
25 SW2, SW3 SW_SPST_TL3342 2 SW_Push
26 U1 QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm 1 RP2040
27 U2 SOIC-8_5.23x5.23mm_P1.27mm 1 W25Q128JVS
28 U3 SOT-23-5_HandSoldering 1 SP6205EM5-L-3-3
29 Y1 Crystal_SMD_5032-2Pin_5.0x3.2mm 1 12MHz

View File

@@ -0,0 +1,66 @@
BZ1:1
C1:1
C10:1
C11:1
C12:1
C13:1
C14:1
C15:1
C16:1
C17:1
C2:1
C3:1
C4:1
C5:1
C6:1
C7:1
C8:1
C9:1
D1:1
D10:1
D11:1
D12:1
D2:1
D3:1
D4:1
D5:1
D6:1
D7:1
D8:1
D9:1
J1:1
J2:1
J3:1
J4:1
J5:1
J6:1
J7:1
J8:1
J9:1
JP1:1
Q1:1
Q2:1
Q3:1
R1:1
R10:1
R11:1
R12:1
R13:1
R14:1
R15:1
R2:1
R3:1
R4:1
R5:1
R6:1
R7:1
R8:1
R9:1
REF**:1
SW1:1
SW2:1
SW3:1
U1:1
U2:1
U3:1
Y1:1
1 BZ1:1
2 C1:1
3 C10:1
4 C11:1
5 C12:1
6 C13:1
7 C14:1
8 C15:1
9 C16:1
10 C17:1
11 C2:1
12 C3:1
13 C4:1
14 C5:1
15 C6:1
16 C7:1
17 C8:1
18 C9:1
19 D1:1
20 D10:1
21 D11:1
22 D12:1
23 D2:1
24 D3:1
25 D4:1
26 D5:1
27 D6:1
28 D7:1
29 D8:1
30 D9:1
31 J1:1
32 J2:1
33 J3:1
34 J4:1
35 J5:1
36 J6:1
37 J7:1
38 J8:1
39 J9:1
40 JP1:1
41 Q1:1
42 Q2:1
43 Q3:1
44 R1:1
45 R10:1
46 R11:1
47 R12:1
48 R13:1
49 R14:1
50 R15:1
51 R2:1
52 R3:1
53 R4:1
54 R5:1
55 R6:1
56 R7:1
57 R8:1
58 R9:1
59 REF**:1
60 SW1:1
61 SW2:1
62 SW3:1
63 U1:1
64 U2:1
65 U3:1
66 Y1:1

Binary file not shown.

View File

@@ -0,0 +1,353 @@
P CODE 00
P UNITS CUST 0
P arrayDim N
317GND VIA MD0157PA00X+052283Y-035827X0315Y0000R000S3
317GND VIA MD0157PA00X+053701Y-035827X0315Y0000R000S3
317GND VIA MD0157PA00X+057323Y-029921X0315Y0000R000S3
317GND VIA MD0157PA00X+053307Y-034409X0315Y0000R000S3
317GND VIA MD0157PA00X+054252Y-033622X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+056929Y-033701X0315Y0000R000S3
317GND VIA MD0157PA00X+054882Y-044173X0315Y0000R000S3
317GND VIA MD0157PA00X+055433Y-043071X0315Y0000R000S3
317GND VIA MD0157PA00X+061181Y-028425X0315Y0000R000S3
317NET-(D2-A) VIA MD0157PA00X+053189Y-037165X0315Y0000R000S3
317NET-(D2-A) VIA MD0157PA00X+050945Y-036772X0315Y0000R000S3
317VCC VIA MD0157PA00X+061496Y-037083X0315Y0000R000S3
317/RST VIA MD0157PA00X+061969Y-036142X0315Y0000R000S3
317/RST VIA MD0157PA00X+060295Y-041142X0315Y0000R000S3
317+BATT VIA MD0157PA00X+055433Y-046530X0315Y0000R000S3
317/BUZZ VIA MD0157PA00X+062205Y-042520X0315Y0000R000S3
317/NEOPIXEL VIA MD0157PA00X+062598Y-042205X0315Y0000R000S3
317/NEOPIXEL VIA MD0157PA00X+060020Y-048957X0315Y0000R000S3
317/TX VIA MD0157PA00X+066772Y-036540X0315Y0000R000S3
317/RX VIA MD0157PA00X+066494Y-036262X0315Y0000R000S3
317/NEOPIXEL VIA MD0157PA00X+066260Y-035933X0315Y0000R000S3
317/BUZZ VIA MD0157PA00X+065938Y-035706X0315Y0000R000S3
317/SDA VIA MD0157PA00X+065660Y-035428X0315Y0000R000S3
317/SCL VIA MD0157PA00X+065382Y-035149X0315Y0000R000S3
317NET-(D8-DOUT) VIA MD0157PA00X+063848Y-029490X0315Y0000R000S3
317/CHRG VIA MD0157PA00X+051260Y-042520X0315Y0000R000S3
317NET-(D10-DOUT) VIA MD0157PA00X+070080Y-041182X0315Y0000R000S3
317NET-(D10-DOUT) VIA MD0157PA00X+068456Y-041433X0315Y0000R000S3
317NET-(D10-DIN) VIA MD0157PA00X+067879Y-035476X0315Y0000R000S3
317NET-(D10-DIN) VIA MD0157PA00X+067795Y-033622X0315Y0000R000S3
317NET-(D8-DOUT) VIA MD0157PA00X+060079Y-028425X0315Y0000R000S3
317NET-(D7-DOUT) VIA MD0157PA00X+058031Y-029055X0315Y0000R000S3
317NET-(D7-DOUT) VIA MD0157PA00X+058094Y-029780X0315Y0000R000S3
317NET-(D5-DOUT) VIA MD0157PA00X+047638Y-038504X0315Y0000R000S3
317NET-(D5-DOUT) VIA MD0157PA00X+049632Y-037346X0315Y0000R000S3
317NET-(D4-DOUT) VIA MD0157PA00X+050709Y-045197X0315Y0000R000S3
317NET-(D4-DOUT) VIA MD0157PA00X+050235Y-043244X0315Y0000R000S3
317/BOOT VIA MD0157PA00X+052480Y-035118X0315Y0000R000S3
317NET-(C16-PAD1) VIA MD0157PA00X+063071Y-034961X0315Y0000R000S3
317NET-(U1-XIN) VIA MD0157PA00X+063071Y-033465X0315Y0000R000S3
317VCC VIA MD0157PA00X+054252Y-032677X0315Y0000R000S3
317T-(U1-QSPI_SS) VIA MD0157PA00X+054488Y-030157X0315Y0000R000S3
317T-(U1-QSPI_SS) VIA MD0157PA00X+055669Y-030157X0315Y0000R000S3
317-(U1-QSPI_SD1) VIA MD0157PA00X+054961Y-030433X0315Y0000R000S3
317-(U1-QSPI_SD1) VIA MD0157PA00X+055948Y-030436X0315Y0000R000S3
317GND VIA MD0157PA00X+049741Y-038789X0315Y0000R000S3
317+5V VIA MD0157PA00X+049909Y-038433X0315Y0000R000S3
317NET-(D1-IO2) VIA MD0157PA00X+050000Y-039134X0315Y0000R000S3
317NET-(D1-IO1) VIA MD0157PA00X+050000Y-039606X0315Y0000R000S3
317VCC VIA MD0157PA00X+058031Y-032913X0315Y0000R000S3
317VCC VIA MD0157PA00X+057323Y-034316X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+056378Y-032874X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+055748Y-034316X0315Y0000R000S3
317VCC VIA MD0157PA00X+059372Y-031804X0315Y0000R000S3
317VCC VIA MD0157PA00X+058189Y-031811X0315Y0000R000S3
317NET-(J9-PIN_3) VIA MD0157PA00X+053251Y-036641X0315Y0000R000S3
317NET-(J9-PIN_2) VIA MD0157PA00X+053622Y-036772X0315Y0000R000S3
317/V_BATT VIA MD0157PA00X+054882Y-038110X0315Y0000R000S3
317/V_BATT VIA MD0157PA00X+054862Y-037480X0315Y0000R000S3
317VCC VIA MD0157PA00X+061102Y-038268X0315Y0000R000S3
317NET-(J8-PIN_2) VIA MD0157PA00X+059802Y-036648X0315Y0000R000S3
317NET-(J8-PIN_3) VIA MD0157PA00X+059409Y-036614X0315Y0000R000S3
317/CHRG VIA MD0157PA00X+059329Y-037049X0315Y0000R000S3
317VCC VIA MD0157PA00X+059449Y-033701X0315Y0000R000S3
317/CS VIA MD0157PA00X+061890Y-038268X0315Y0000R000S3
317/CS VIA MD0157PA00X+061890Y-036929X0315Y0000R000S3
317/MISO VIA MD0157PA00X+062283Y-038268X0315Y0000R000S3
317/MISO VIA MD0157PA00X+062283Y-036929X0315Y0000R000S3
317GND VIA MD0394PA00X+059055Y-032756X0787Y0000R000S3
317/RST VIA MD0157PA00X+061614Y-033391X0315Y0000R000S3
317/SWDIO VIA MD0157PA00X+060945Y-033268X0315Y0000R000S3
317/SWCLK VIA MD0157PA00X+061339Y-033110X0315Y0000R000S3
317VCC VIA MD0157PA00X+061890Y-034316X0315Y0000R000S3
317+1V1 VIA MD0157PA00X+060000Y-032992X0315Y0000R000S3
367N/C REF** D1260UA00X+062992Y-045669X1260Y0000R000S3
327GND C1 -1 A02X+058553Y-038189X0463Y0571R000S1
327ET-(U1-GPIO24) C1 -2 A02X+059370Y-038189X0463Y0571R000S1
327/RST SW3 -1 A02X+060295Y-041142X0669Y0394R180S1
327/RST SW3 -1 A02X+057815Y-041142X0669Y0394R180S1
327GND SW3 -2 A02X+057815Y-042638X0669Y0394R180S1
327GND SW3 -2 A02X+060295Y-042638X0669Y0394R180S1
327/BOOT SW2 -1 A02X+051443Y-033414X0669Y0394R315S1
327/BOOT SW2 -1 A02X+053197Y-031660X0669Y0394R315S1
327GND SW2 -2 A02X+052139Y-030602X0669Y0394R315S1
327GND SW2 -2 A02X+050385Y-032356X0669Y0394R315S1
327NET-(U1-XIN) Y1 -1 A01X+063071Y-033504X0787Y0945R090S2
327NET-(C16-PAD1) Y1 -2 A01X+063071Y-034961X0787Y0945R090S2
327+BATT U3 -1 A02X+056122Y-045748X0614Y0256R270S1
327GND U3 -2 A02X+055748Y-045748X0614Y0256R270S1
327+BATT U3 -3 A02X+055374Y-045748X0614Y0256R270S1
327NET-(U3-NC) U3 -4 A02X+055374Y-044685X0614Y0256R270S1
327VCC U3 -5 A02X+056122Y-044685X0614Y0256R270S1
327T-(U1-QSPI_SS) U2 -1 A02X+054289Y-029213X0630Y0236R090S1
327-(U1-QSPI_SD1) U2 -2 A02X+054789Y-029213X0630Y0236R090S1
327-(U1-QSPI_SD2) U2 -3 A02X+055289Y-029213X0630Y0236R090S1
327GND U2 -4 A02X+055789Y-029213X0630Y0236R090S1
327-(U1-QSPI_SD0) U2 -5 A02X+055789Y-032047X0630Y0236R090S1
327(U1-QSPI_SCLK) U2 -6 A02X+055289Y-032047X0630Y0236R090S1
327-(U1-QSPI_SD3) U2 -7 A02X+054789Y-032047X0630Y0236R090S1
327VCC U2 -8 A02X+054289Y-032047X0630Y0236R090S1
327VCC U1 -1 A02X+058031Y-031403X0344Y0079R090S1
327/TX U1 -2 A02X+058189Y-031403X0344Y0079R090S1
327/RX U1 -3 A02X+058346Y-031403X0344Y0079R090S1
327/NEOPIXEL U1 -4 A02X+058504Y-031403X0344Y0079R090S1
327/BUZZ U1 -5 A02X+058661Y-031403X0344Y0079R090S1
327/SDA U1 -6 A02X+058819Y-031403X0344Y0079R090S1
327/SCL U1 -7 A02X+058976Y-031403X0344Y0079R090S1
327ET-(J7-PIN_10) U1 -8 A02X+059134Y-031403X0344Y0079R090S1
327NET-(J7-PIN_8) U1 -9 A02X+059291Y-031403X0344Y0079R090S1
327VCC U1 -10 A02X+059449Y-031403X0344Y0079R090S1
327NET-(J7-PIN_6) U1 -11 A02X+059606Y-031403X0344Y0079R090S1
327NET-(J7-PIN_4) U1 -12 A02X+059764Y-031403X0344Y0079R090S1
327NET-(J7-PIN_2) U1 -13 A02X+059921Y-031403X0344Y0079R090S1
327NET-(J7-PIN_1) U1 -14 A02X+060079Y-031403X0344Y0079R090S1
327NET-(J7-PIN_3) U1 -15 A02X+060408Y-031732X0079Y0344R090S1
327NET-(J7-PIN_5) U1 -16 A02X+060408Y-031890X0079Y0344R090S1
327NET-(J7-PIN_7) U1 -17 A02X+060408Y-032047X0079Y0344R090S1
327NET-(J7-PIN_9) U1 -18 A02X+060408Y-032205X0079Y0344R090S1
327GND U1 -19 A02X+060408Y-032362X0079Y0344R090S1
327NET-(U1-XIN) U1 -20 A02X+060408Y-032520X0079Y0344R090S1
327NET-(U1-XOUT) U1 -21 A02X+060408Y-032677X0079Y0344R090S1
327VCC U1 -22 A02X+060408Y-032835X0079Y0344R090S1
327+1V1 U1 -23 A02X+060408Y-032992X0079Y0344R090S1
327/SWCLK U1 -24 A02X+060408Y-033150X0079Y0344R090S1
327/SWDIO U1 -25 A02X+060408Y-033307X0079Y0344R090S1
327/RST U1 -26 A02X+060408Y-033465X0079Y0344R090S1
327/MISO U1 -27 A02X+060408Y-033622X0079Y0344R090S1
327/CS U1 -28 A02X+060408Y-033780X0079Y0344R090S1
327/CLK U1 -29 A02X+060079Y-034109X0344Y0079R090S1
327/MOSI U1 -30 A02X+059921Y-034109X0344Y0079R090S1
327NET-(J8-PIN_1) U1 -31 A02X+059764Y-034109X0344Y0079R090S1
327NET-(J8-PIN_2) U1 -32 A02X+059606Y-034109X0344Y0079R090S1
327VCC U1 -33 A02X+059449Y-034109X0344Y0079R090S1
327NET-(J8-PIN_3) U1 -34 A02X+059291Y-034109X0344Y0079R090S1
327/CHRG U1 -35 A02X+059134Y-034109X0344Y0079R090S1
327ET-(U1-GPIO24) U1 -36 A02X+058976Y-034109X0344Y0079R090S1
327NET-(D2-A) U1 -37 A02X+058819Y-034109X0344Y0079R090S1
327/V_BATT U1 -38 A02X+058661Y-034109X0344Y0079R090S1
327NET-(J9-PIN_1) U1 -39 A02X+058504Y-034109X0344Y0079R090S1
327NET-(J9-PIN_2) U1 -40 A02X+058346Y-034109X0344Y0079R090S1
327NET-(J9-PIN_3) U1 -41 A02X+058189Y-034109X0344Y0079R090S1
327VCC U1 -42 A02X+058031Y-034109X0344Y0079R090S1
327VCC U1 -43 A02X+057702Y-033780X0079Y0344R090S1
327VCC U1 -44 A02X+057702Y-033622X0079Y0344R090S1
327+1V1 U1 -45 A02X+057702Y-033465X0079Y0344R090S1
327/DN U1 -46 A02X+057702Y-033307X0079Y0344R090S1
327/DP U1 -47 A02X+057702Y-033150X0079Y0344R090S1
327VCC U1 -48 A02X+057702Y-032992X0079Y0344R090S1
327VCC U1 -49 A02X+057702Y-032835X0079Y0344R090S1
327+1V1 U1 -50 A02X+057702Y-032677X0079Y0344R090S1
327-(U1-QSPI_SD3) U1 -51 A02X+057702Y-032520X0079Y0344R090S1
327(U1-QSPI_SCLK) U1 -52 A02X+057702Y-032362X0079Y0344R090S1
327-(U1-QSPI_SD0) U1 -53 A02X+057702Y-032205X0079Y0344R090S1
327-(U1-QSPI_SD2) U1 -54 A02X+057702Y-032047X0079Y0344R090S1
327-(U1-QSPI_SD1) U1 -55 A02X+057702Y-031890X0079Y0344R090S1
327T-(U1-QSPI_SS) U1 -56 A02X+057702Y-031732X0079Y0344R090S1
327GND U1 -57 A02X+059055Y-032756X1260Y1260R090S1
367N/C SW1 D1575UA00X+059055Y-039370X1575Y0000R000S0
367N/C SW1 D0669UA00X+057055Y-039370X0669Y0000R000S0
367N/C SW1 D0669UA00X+061055Y-039370X0669Y0000R000S0
317ET-(U1-GPIO24) SW1 -1 D0591PA00X+060055Y-037370X0866Y0000R000S0
317GND SW1 -2 D0591PA00X+057555Y-038370X0866Y0000R000S0
327/BUZZ R15 -1 A02X+058425Y-044646X0472Y0551R000S1
327GND R15 -2 A02X+059213Y-044646X0472Y0551R000S1
327NET-(D2-K) R14 -1 A02X+049055Y-036772X0472Y0551R180S1
327GND R14 -2 A02X+048268Y-036772X0472Y0551R180S1
327VCC R13 -1 A02X+061102Y-038268X0472Y0551R180S1
327ET-(U1-GPIO24) R13 -2 A02X+060315Y-038268X0472Y0551R180S1
327NET-(Q1-D) R12 -1 A02X+051496Y-041890X0472Y0551R000S1
327+5V R12 -2 A02X+052283Y-041890X0472Y0551R000S1
327/CHRG R11 -1 A02X+049134Y-042598X0472Y0551R270S1
327GND R11 -2 A02X+049134Y-041811X0472Y0551R270S1
327/V_BATT R10 -1 A02X+053465Y-044094X0472Y0551R000S1
327GND R10 -2 A02X+054252Y-044094X0472Y0551R000S1
327/BOOT R9 -1 A01X+054173Y-035118X0472Y0551R270S2
327T-(U1-QSPI_SS) R9 -2 A01X+054173Y-034331X0472Y0551R270S2
327T-(U1-QSPI_SS) R8 -1 A01X+055039Y-033465X0472Y0551R270S2
327VCC R8 -2 A01X+055039Y-032677X0472Y0551R270S2
327GND R7 -1 A02X+051732Y-037402X0472Y0551R090S1
327NET-(J1-CC2) R7 -2 A02X+051732Y-038189X0472Y0551R090S1
327/DP R6 -1 A02X+052756Y-038898X0472Y0551R180S1
327NET-(D1-IO2) R6 -2 A02X+051969Y-038898X0472Y0551R180S1
327NET-(D1-IO1) R5 -1 A02X+051969Y-039685X0472Y0551R000S1
327/DN R5 -2 A02X+052756Y-039685X0472Y0551R000S1
327/RST R4 -2 A01X+061811Y-033465X0472Y0551R090S2
327VCC R4 -1 A01X+061811Y-032677X0472Y0551R090S2
327NET-(C16-PAD1) R3 -1 A02X+062520Y-033937X0472Y0551R270S1
327NET-(U1-XOUT) R3 -2 A02X+062520Y-033150X0472Y0551R270S1
327+BATT R2 -1 A02X+051969Y-044094X0472Y0551R000S1
327/V_BATT R2 -2 A02X+052756Y-044094X0472Y0551R000S1
327GND R1 -1 A02X+051732Y-041181X0472Y0551R270S1
327NET-(J1-CC1) R1 -2 A02X+051732Y-040394X0472Y0551R270S1
327/BUZZ Q3 -1 A02X+058898Y-046181X0581Y0236R000S1
327GND Q3 -2 A02X+058898Y-045433X0581Y0236R000S1
327NET-(BZ1--) Q3 -3 A02X+059636Y-045807X0581Y0236R000S1
327+BATT Q2 -1 A02X+051843Y-043346X0276Y0201R000S1
327+BATT Q2 -2 A02X+051843Y-042972X0276Y0201R000S1
327NET-(Q1-D) Q2 -3 A02X+051843Y-042598X0276Y0201R000S1
327+5V Q2 -4 A02X+052756Y-042598X0276Y0201R000S1
327+BATT Q2 -5 A02X+052756Y-042972X0276Y0201R000S1
327+BATT Q2 -6 A02X+052756Y-043346X0276Y0201R000S1
327/CHRG Q1 -1 A02X+049970Y-042579X0581Y0236R000S1
327GND Q1 -2 A02X+049970Y-041831X0581Y0236R000S1
327NET-(Q1-D) Q1 -3 A02X+050709Y-042205X0581Y0236R000S1
327+5V JP1 -1 A02X+053543Y-042736X0394Y0197R090S1
327+BATT JP1 -2 A02X+053543Y-043248X0394Y0197R090S1
317NET-(J9-PIN_1) J9 -1 D0394PA00X+054094Y-037352X0669Y0669R000S0
317NET-(J9-PIN_2) J9 -2 D0394PA00X+054094Y-038352X0669Y0669R000S0
317NET-(J9-PIN_3) J9 -3 D0394PA00X+054094Y-039352X0669Y0669R000S0
317NET-(J8-PIN_1) J8 -1 D0394PA00X+055591Y-039323X0669Y0669R180S0
317NET-(J8-PIN_2) J8 -2 D0394PA00X+055591Y-038323X0669Y0669R180S0
317NET-(J8-PIN_3) J8 -3 D0394PA00X+055591Y-037323X0669Y0669R180S0
317NET-(J7-PIN_1) J7 -1 D0394PA00X+069299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_2) J7 -2 D0394PA00X+069299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_3) J7 -3 D0394PA00X+068299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_4) J7 -4 D0394PA00X+068299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_5) J7 -5 D0394PA00X+067299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_6) J7 -6 D0394PA00X+067299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_7) J7 -7 D0394PA00X+066299Y-038898X0669Y0669R090S0
317NET-(J7-PIN_8) J7 -8 D0394PA00X+066299Y-039898X0669Y0669R090S0
317NET-(J7-PIN_9) J7 -9 D0394PA00X+065299Y-038898X0669Y0669R090S0
317ET-(J7-PIN_10) J7 -10 D0394PA00X+065299Y-039898X0669Y0669R090S0
317VCC J6 -1 D0394PA00X+066535Y-041417X0669Y0669R000S0
317/RX J6 -2 D0394PA00X+066535Y-042417X0669Y0669R000S0
317/TX J6 -3 D0394PA00X+066535Y-043417X0669Y0669R000S0
317GND J6 -4 D0394PA00X+066535Y-044417X0669Y0669R000S0
317GND J5 -4 D0394PA00X+065118Y-044417X0669Y0669R000S0
317/SDA J5 -3 D0394PA00X+065118Y-043417X0669Y0669R000S0
317/SCL J5 -2 D0394PA00X+065118Y-042417X0669Y0669R000S0
317VCC J5 -1 D0394PA00X+065118Y-041417X0669Y0669R000S0
317VCC J4 -1 D0394PA00X+063701Y-036811X0669Y0669R000S0
317/MOSI J4 -2 D0394PA00X+063701Y-037811X0669Y0669R000S0
317/CLK J4 -3 D0394PA00X+063701Y-038811X0669Y0669R000S0
317/CS J4 -4 D0394PA00X+063701Y-039811X0669Y0669R000S0
317/MISO J4 -5 D0394PA00X+063701Y-040811X0669Y0669R000S0
317GND J4 -6 D0394PA00X+063701Y-041811X0669Y0669R000S0
317/SWCLK J3 -1 D0394PA00X+063278Y-029370X0669Y0669R090S0
317GND J3 -2 D0394PA00X+062278Y-029370X0669Y0669R090S0
317/SWDIO J3 -3 D0394PA00X+061278Y-029370X0669Y0669R090S0
317+BATT J2 -1 D0394PA00X+052701Y-044961X0669Y0669R270S0
317GND J2 -2 D0394PA00X+053701Y-044961X0669Y0669R270S0
367N/C J1 D0256UA00X+050236Y-038232X0256Y0000R270S0
367N/C J1 D0256UA00X+050236Y-040508X0256Y0000R270S0
327GND J1 -A1 A02X+050805Y-040650X0236Y0571R270S1
327+5V J1 -A4 A02X+050805Y-040335X0236Y0571R270S1
327NET-(J1-CC1) J1 -A5 A02X+050805Y-039862X0118Y0571R270S1
327NET-(D1-IO2) J1 -A6 A02X+050805Y-039469X0118Y0571R270S1
327NET-(D1-IO1) J1 -A7 A02X+050805Y-039272X0118Y0571R270S1
327J1-SBU1-PADA8) J1 -A8 A02X+050805Y-038878X0118Y0571R270S1
327+5V J1 -A9 A02X+050805Y-038406X0236Y0571R270S1
327GND J1 -A12 A02X+050805Y-038091X0236Y0571R270S1
327GND J1 -B1 A02X+050805Y-038091X0236Y0571R270S1
327+5V J1 -B4 A02X+050805Y-038406X0236Y0571R270S1
327NET-(J1-CC2) J1 -B5 A02X+050805Y-038681X0118Y0571R270S1
327NET-(D1-IO2) J1 -B6 A02X+050805Y-039075X0118Y0571R270S1
327NET-(D1-IO1) J1 -B7 A02X+050805Y-039665X0118Y0571R270S1
327J1-SBU2-PADB8) J1 -B8 A02X+050805Y-040059X0118Y0571R270S1
327+5V J1 -B9 A02X+050805Y-040335X0236Y0571R270S1
327GND J1 -B12 A02X+050805Y-040650X0236Y0571R270S1
317GND J1 -S1 D0236PA00X+048799Y-041071X0394Y0630R270S0
317GND J1 -S1 D0236PA00X+050445Y-041071X0394Y0827R270S0
317GND J1 -S1 D0236PA00X+050445Y-037669X0394Y0827R270S0
317GND J1 -S1 D0236PA00X+048799Y-037669X0394Y0630R270S0
327+BATT D12 -1 A01X+063909Y-047691X0591Y0354R324S2
327D12-DOUT-PAD2) D12 -2 A01X+064672Y-048742X0591Y0354R324S2
327GND D12 -3 A01X+066233Y-047608X0591Y0354R324S2
327NET-(D11-DOUT) D12 -4 A01X+065469Y-046557X0591Y0354R324S2
327+BATT D11 -1 A01X+067860Y-043268X0591Y0354R288S2
327NET-(D11-DOUT) D11 -2 A01X+069095Y-043669X0591Y0354R288S2
327GND D11 -3 A01X+069691Y-041835X0591Y0354R288S2
327NET-(D10-DOUT) D11 -4 A01X+068456Y-041433X0591Y0354R288S2
327+BATT D10 -1 A01X+068476Y-037311X0591Y0354R252S2
327NET-(D10-DOUT) D10 -2 A01X+069711Y-036910X0591Y0354R252S2
327GND D10 -3 A01X+069115Y-035075X0591Y0354R252S2
327NET-(D10-DIN) D10 -4 A01X+067879Y-035476X0591Y0354R252S2
327+BATT D9 -1 A01X+065477Y-032191X0591Y0354R216S2
327NET-(D10-DIN) D9 -2 A01X+066241Y-031140X0591Y0354R216S2
327GND D9 -3 A01X+064680Y-030006X0591Y0354R216S2
327NET-(D8-DOUT) D9 -4 A01X+063917Y-031057X0591Y0354R216S2
327+BATT D8 -1 A01X+060024Y-029780X0591Y0354R180S2
327NET-(D8-DOUT) D8 -2 A01X+060024Y-028480X0591Y0354R180S2
327GND D8 -3 A01X+058094Y-028480X0591Y0354R180S2
327NET-(D7-DOUT) D8 -4 A01X+058094Y-029780X0591Y0354R180S2
327+BATT D7 -1 A01X+054190Y-031049X0591Y0354R144S2
327NET-(D7-DOUT) D7 -2 A01X+053426Y-029998X0591Y0354R144S2
327GND D7 -3 A01X+051865Y-031132X0591Y0354R144S2
327NET-(D6-DOUT) D7 -4 A01X+052629Y-032183X0591Y0354R144S2
327+BATT D6 -1 A01X+050235Y-035484X0591Y0354R108S2
327NET-(D6-DOUT) D6 -2 A01X+048999Y-035083X0591Y0354R108S2
327GND D6 -3 A01X+048403Y-036917X0591Y0354R108S2
327NET-(D5-DOUT) D6 -4 A01X+049639Y-037319X0591Y0354R108S2
327+BATT D5 -1 A01X+049639Y-041409X0591Y0354R072S2
327NET-(D5-DOUT) D5 -2 A01X+048403Y-041811X0591Y0354R072S2
327GND D5 -3 A01X+048999Y-043646X0591Y0354R072S2
327NET-(D4-DOUT) D5 -4 A01X+050235Y-043244X0591Y0354R072S2
327+BATT D4 -1 A01X+052645Y-046530X0591Y0354R036S2
327NET-(D4-DOUT) D4 -2 A01X+051881Y-047581X0591Y0354R036S2
327GND D4 -3 A01X+053442Y-048715X0591Y0354R036S2
327NET-(D3-DOUT) D4 -4 A01X+054205Y-047663X0591Y0354R036S2
327+BATT D3 -1 A01X+058091Y-048957X0591Y0354R000S2
327NET-(D3-DOUT) D3 -2 A01X+058091Y-050256X0591Y0354R000S2
327GND D3 -3 A01X+060020Y-050256X0591Y0354R000S2
327/NEOPIXEL D3 -4 A01X+060020Y-048957X0591Y0354R000S2
327NET-(D2-A) D2 -2 A02X+050945Y-036772X0492Y0689R000S1
327NET-(D2-K) D2 -1 A02X+049843Y-036772X0492Y0689R000S1
327NET-(D1-IO1) D1 -1 A01X+049504Y-039557X0248Y0177R180S2
327NET-(D1-IO2) D1 -2 A01X+049504Y-039183X0248Y0177R180S2
327GND D1 -3 A01X+049504Y-038809X0248Y0177R180S2
327-(D1-IO3-PAD4) D1 -4 A01X+048449Y-038809X0248Y0177R180S2
327+5V D1 -5 A01X+048449Y-039183X0248Y0177R180S2
327N/C D1 -6 A01X+048449Y-039557X0248Y0177R180S2
327N/C D1 -7 A01X+049134Y-039390X0315Y0413R180S2
327N/C D1 -7 A01X+048819Y-038976X0315Y0413R180S2
327N/C D1 -7 A01X+048819Y-039390X0315Y0413R180S2
327N/C D1 -7 A01X+049134Y-038976X0315Y0413R180S2
327GND C17 -2 A01X+054252Y-033479X0463Y0571R090S2
327VCC C17 -1 A01X+054252Y-032662X0463Y0571R090S2
327NET-(C16-PAD1) C16 -1 A01X+064252Y-035290X0463Y0571R270S2
327GND C16 -2 A01X+064252Y-034473X0463Y0571R270S2
327NET-(U1-XIN) C15 -1 A01X+064252Y-032977X0463Y0571R090S2
327GND C15 -2 A01X+064252Y-033794X0463Y0571R090S2
327GND C14 -1 A01X+058110Y-035133X0463Y0571R270S2
327VCC C14 -2 A01X+058110Y-034316X0463Y0571R270S2
327GND C13 -1 A01X+054961Y-035133X0463Y0571R270S2
327+1V1 C13 -2 A01X+054961Y-034316X0463Y0571R270S2
327GND C12 -1 A01X+057323Y-035133X0463Y0571R270S2
327VCC C12 -2 A01X+057323Y-034316X0463Y0571R270S2
327GND C11 -1 A01X+056535Y-035133X0463Y0571R270S2
327VCC C11 -2 A01X+056535Y-034316X0463Y0571R270S2
327GND C10 -1 A01X+058583Y-032613X0463Y0571R270S2
327VCC C10 -2 A01X+058583Y-031796X0463Y0571R270S2
327GND C9 -1 A01X+061102Y-035133X0463Y0571R270S2
327+1V1 C9 -2 A01X+061102Y-034316X0463Y0571R270S2
327GND C8 -1 A01X+055748Y-035133X0463Y0571R270S2
327+1V1 C8 -2 A01X+055748Y-034316X0463Y0571R270S2
327GND C7 -1 A01X+059449Y-035133X0463Y0571R270S2
327VCC C7 -2 A01X+059449Y-034316X0463Y0571R270S2
327GND C6 -1 A01X+061890Y-035133X0463Y0571R270S2
327VCC C6 -2 A01X+061890Y-034316X0463Y0571R270S2
327VCC C5 -2 A01X+059370Y-031796X0463Y0571R270S2
327GND C5 -1 A01X+059370Y-032613X0463Y0571R270S2
327VCC C4 -1 A02X+056220Y-043873X0463Y0571R270S1
327GND C4 -2 A02X+056220Y-043056X0463Y0571R270S1
327NET-(U3-NC) C3 -1 A02X+055433Y-043873X0463Y0571R270S1
327GND C3 -2 A02X+055433Y-043056X0463Y0571R270S1
327+BATT C2 -1 A02X+054646Y-045827X0463Y0571R270S1
327GND C2 -2 A02X+054646Y-045010X0463Y0571R270S1
317VCC BZ1 -1 D0394PA00X+057559Y-045827X0787Y0787R000S0
317NET-(BZ1--) BZ1 -2 D0394PA00X+060551Y-045827X0787Y0000R000S0
999

View File

@@ -0,0 +1,65 @@
Designator,Mid X,Mid Y,Rotation,Layer
BZ1,146.2,-116.4,0.0,top
C1,149.7625,-97.0,0.0,bottom
C10,148.8,-81.8,90.0,top
C11,143.6,-88.2,90.0,top
C12,145.6,-88.2,90.0,top
C13,139.6,-88.2,90.0,top
C14,147.6,-88.2,90.0,top
C15,163.2,-84.8,270.0,top
C16,163.2,-88.6,90.0,top
C17,137.8,-84.0,270.0,top
C2,138.8,-115.3625,90.0,bottom
C3,140.8,-110.4,90.0,bottom
C4,142.8,-110.4,90.0,bottom
C5,150.8,-81.8,90.0,top
C6,157.2,-88.2,90.0,top
C7,151.0,-88.2,90.0,top
C8,141.6,-88.2,90.0,top
C9,155.2,-88.2,90.0,top
D1,124.4,-99.525,180.0,top
D10,174.74,-91.93,108.0,top
D11,174.69,-108.08,72.0,top
D12,165.28,-121.03,36.0,top
D2,128.0,-93.4,0.0,bottom
D3,150.0,-126.0,0.0,top
D4,134.73,-120.96,324.0,top
D5,125.27,-108.02,288.0,top
D6,125.27,-91.95,252.0,top
D7,134.69,-78.97,216.0,top
D8,150.01,-73.99,180.0,top
D9,165.3,-78.99,144.0,top
J1,125.0,-100.0,90.0,bottom
J2,133.86,-114.2,90.0,top
J3,160.725,-74.6,270.0,top
J4,161.8,-93.5,0.0,top
J5,165.4,-105.2,0.0,top
J6,169.0,-105.2,0.0,top
J7,176.02,-98.8,270.0,top
J8,141.2,-99.88,180.0,top
J9,137.4,-94.875,0.0,top
Q1,127.8625,-107.2,0.0,bottom
Q2,132.84,-109.15,0.0,bottom
Q3,150.5375,-116.35,0.0,bottom
R1,131.4,-103.6,90.0,bottom
R10,136.8,-112.0,0.0,bottom
R11,124.8,-107.2,90.0,bottom
R12,131.8,-106.4,0.0,bottom
R13,154.2,-97.2,180.0,bottom
R14,123.6,-93.4,180.0,bottom
R15,149.4,-113.4,0.0,bottom
R2,133.0,-112.0,0.0,bottom
R3,158.8,-85.2,90.0,bottom
R4,157.0,-84.0,270.0,top
R5,133.0,-100.8,0.0,bottom
R6,133.0,-98.8,180.0,bottom
R7,131.4,-96.0,270.0,bottom
R8,139.8,-84.0,90.0,top
R9,137.6,-88.2,90.0,top
SW1,152.54,-94.92,0.0,top
SW2,131.55,-81.3,45.0,bottom
SW3,150.0,-106.4,180.0,bottom
U1,150.0,-83.2,270.0,bottom
U2,139.8,-77.8,270.0,bottom
U3,141.6,-114.85,90.0,bottom
Y1,160.2,-86.95,270.0,top
1 Designator Mid X Mid Y Rotation Layer
2 BZ1 146.2 -116.4 0.0 top
3 C1 149.7625 -97.0 0.0 bottom
4 C10 148.8 -81.8 90.0 top
5 C11 143.6 -88.2 90.0 top
6 C12 145.6 -88.2 90.0 top
7 C13 139.6 -88.2 90.0 top
8 C14 147.6 -88.2 90.0 top
9 C15 163.2 -84.8 270.0 top
10 C16 163.2 -88.6 90.0 top
11 C17 137.8 -84.0 270.0 top
12 C2 138.8 -115.3625 90.0 bottom
13 C3 140.8 -110.4 90.0 bottom
14 C4 142.8 -110.4 90.0 bottom
15 C5 150.8 -81.8 90.0 top
16 C6 157.2 -88.2 90.0 top
17 C7 151.0 -88.2 90.0 top
18 C8 141.6 -88.2 90.0 top
19 C9 155.2 -88.2 90.0 top
20 D1 124.4 -99.525 180.0 top
21 D10 174.74 -91.93 108.0 top
22 D11 174.69 -108.08 72.0 top
23 D12 165.28 -121.03 36.0 top
24 D2 128.0 -93.4 0.0 bottom
25 D3 150.0 -126.0 0.0 top
26 D4 134.73 -120.96 324.0 top
27 D5 125.27 -108.02 288.0 top
28 D6 125.27 -91.95 252.0 top
29 D7 134.69 -78.97 216.0 top
30 D8 150.01 -73.99 180.0 top
31 D9 165.3 -78.99 144.0 top
32 J1 125.0 -100.0 90.0 bottom
33 J2 133.86 -114.2 90.0 top
34 J3 160.725 -74.6 270.0 top
35 J4 161.8 -93.5 0.0 top
36 J5 165.4 -105.2 0.0 top
37 J6 169.0 -105.2 0.0 top
38 J7 176.02 -98.8 270.0 top
39 J8 141.2 -99.88 180.0 top
40 J9 137.4 -94.875 0.0 top
41 Q1 127.8625 -107.2 0.0 bottom
42 Q2 132.84 -109.15 0.0 bottom
43 Q3 150.5375 -116.35 0.0 bottom
44 R1 131.4 -103.6 90.0 bottom
45 R10 136.8 -112.0 0.0 bottom
46 R11 124.8 -107.2 90.0 bottom
47 R12 131.8 -106.4 0.0 bottom
48 R13 154.2 -97.2 180.0 bottom
49 R14 123.6 -93.4 180.0 bottom
50 R15 149.4 -113.4 0.0 bottom
51 R2 133.0 -112.0 0.0 bottom
52 R3 158.8 -85.2 90.0 bottom
53 R4 157.0 -84.0 270.0 top
54 R5 133.0 -100.8 0.0 bottom
55 R6 133.0 -98.8 180.0 bottom
56 R7 131.4 -96.0 270.0 bottom
57 R8 139.8 -84.0 90.0 top
58 R9 137.6 -88.2 90.0 top
59 SW1 152.54 -94.92 0.0 top
60 SW2 131.55 -81.3 45.0 bottom
61 SW3 150.0 -106.4 180.0 bottom
62 U1 150.0 -83.2 270.0 bottom
63 U2 139.8 -77.8 270.0 bottom
64 U3 141.6 -114.85 90.0 bottom
65 Y1 160.2 -86.95 270.0 top

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,77 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": false,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "ffffdff_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "timer_button.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@@ -0,0 +1,492 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"board_outline_line_width": 0.09999999999999999,
"copper_line_width": 0.19999999999999998,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.09999999999999999,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.15,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 3.2,
"height": 3.2,
"width": 3.2
},
"silk_line_width": 0.15,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.09999999999999999,
"min_via_diameter": 0.5,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 5,
"td_on_pad_in_zone": false,
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0,
0.2,
0.4
],
"via_dimensions": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "timer_button.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.25,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"specctra_dsn": "",
"step": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"4c88d864-5558-4972-998d-a249c51e3544",
""
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

View File

@@ -30,8 +30,3 @@ for id in data_dict:
print(results)
dict(sorted(results.items(), key=lambda item: item[0]))
print(results)

View File

@@ -0,0 +1,7 @@
{
"station_id": 2,
"host": "https://beta.alkator.cz",
"login": "station_register@alkator.cz",
"password": "password_heslo",
"countdown_seconds": 60
}

1
SW/PC/Stopwatch/log.json Normal file
View File

@@ -0,0 +1 @@
[]

205
SW/PC/Stopwatch/main.py Normal file
View File

@@ -0,0 +1,205 @@
import gi
import threading
import time
import datetime
import requests
import json
gi.require_version('Gtk', '4.0')
from queue import Queue
from gi.repository import Gtk, Gio, Gdk
from requests.adapters import HTTPAdapter, Retry
from usbcardreader import UsbCardReader
with open('config.json', 'r') as f:
config = json.load(f)
activeCards = []
TIME = config['countdown_seconds']
db = {}
queue_to_send = []
session = requests.Session()
retries = Retry(total=10,
backoff_factor=1,
status_forcelist=[ 500, 502, 503, 504 ])
session.mount('https://', HTTPAdapter(max_retries=retries))
session.post(config['host'] + '/api/login', {'email':config['login'], 'password': config['password']})
def refreshDb():
global db
resp = session.get(config['host'] + '/api/racers')
if resp.status_code == 200:
json = resp.json()
db = {}
for racer in json:
if racer["card_id"]:
db[racer["card_id"]] = racer
def refreshDbEvery3mins():
while True:
refreshDb()
time.sleep(3 * 60)
threading.Thread(target=refreshDbEvery3mins).start()
log = []
with open('log.json', 'r') as f:
log = json.loads(f.read())
queue = Queue()
def worker():
while True:
item = queue.get()
log.append(item)
with open('log.json', 'w') as f:
f.write(json.dumps(log))
response = session.post(item['url'], json=item['json'])
print(item, response)
threading.Thread(target=worker).start()
def callbackOnCard(card_id):
global win, activeCards, db
if card_id not in db:
refreshDb()
if card_id in db:
if card_id not in activeCards:
activeCards.append(card_id)
win.arb(db[card_id])
print('Card is active now')
else:
print('Card is already active')
else:
print(f'Card {card_id} not found in db')
class GridRow():
def __init__(self, parent, racer, index):
global queue_to_send
self.id = racer['starting_number']
self.parent = parent
self.grid = Gtk.Grid()
if index % 2 == 0:
self.grid.set_name("lightgrid")
else:
self.grid.set_name("darkgrid")
self.runid = Gtk.Label(label=str(racer["starting_number"]), name="gridlabel")
self.runid.set_justify(2)
self.runid.set_width_chars(10)
self.runb = Gtk.Label(label='00:00', name="gridlabel")
self.runb.set_hexpand(1)
self.grid.attach(self.runid, 0, 0, 1, 1)
self.grid.attach(self.runb, 1, 0, 1, 1)
parent.grid.attach(self.grid, 0, index, 2, 1)
countdown=threading.Thread(target=self.updateTime)
countdown.start()
queue.put({'url': config['host'] + '/api/station/register', 'json': {
'card_id': racer['card_id'],
'station_id': config['station_id'],
'time': datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S.%f')
}})
def printIndex(self, button):
print(self.index)
def updateTime(self):
t = TIME
while t >= -10:
if t < 0:
mins, secs = divmod((t * -1), 60)
timer = '-{:02d}:{:02d}'.format(mins, secs)
else:
mins, secs = divmod(t, 60)
timer = '{:02d}:{:02d}'.format(mins, secs)
self.runb.set_label(timer)
time.sleep(1)
t -= 1
if t == 10:
if self.grid.get_name() == "lightgrid":
self.grid.set_name("lredgrid")
else:
self.grid.set_name("dredgrid")
GridWindow.remRow(self.parent)
class GridWindow(Gtk.ApplicationWindow):
def __init__(self, **kargs):
super().__init__(**kargs, title='Alkator Clock')
css_provider = Gtk.CssProvider()
css_provider.load_from_file(Gio.File.new_for_path("style.css"))
Gtk.StyleContext.add_provider_for_display(Gdk.Display.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
runlabel = Gtk.Label(label="ID", name="gridlabel")
runlabel.set_justify(2)
cntlabel = Gtk.Label(label="Countdown", name="gridlabel")
cntlabel.set_justify(2)
self.runners = []
self.grid = Gtk.Grid()
self.grid.attach(runlabel, 0, 0, 1, 1)
self.grid.attach(cntlabel, 1, 0, 2, 1)
self.set_child(self.grid)
def arb(self, racer):
self.runners.append(GridRow(self, racer, len(activeCards)))
def rrb(self, button):
self.remRow()
def addRow(self, runner, index):
runid = Gtk.Label(label=str(runner))
runb = Gtk.Button(label='time_placeholder')
self.grid.attach(runid, 0, index, 1, 1)
self.grid.attach(runb, 1, index, 1, 1)
def remRow(self):
global activeCards
if len(activeCards) > 0:
self.grid.remove_row(1)
del activeCards[0]
def on_activate(app):
# Create window
global win
win = GridWindow(application=app)
win.present()
UsbCardReader(callbackOnCard)
app = Gtk.Application(application_id='com.example.App')
app.connect('activate', on_activate)
app.run(None)

View File

@@ -0,0 +1,4 @@
{
"1": 3619716179,
"2": 3620062547
}

View File

@@ -0,0 +1,184 @@
import sys
import datetime
import requests
import threading
import json
from PyQt6 import QtWidgets, uic, QtGui, QtCore
from PyQt6.QtCore import pyqtSignal as Signal, pyqtSlot as Slot
from queue import Queue
from requests.adapters import HTTPAdapter, Retry
from usbcardreader import UsbCardReader
app = QtWidgets.QApplication(sys.argv)
with open('config.json', 'r') as f:
config = json.load(f)
session = requests.Session()
session.post(config['host'] + '/api/login', {'email':config['login'], 'password': config['password']})
retries = Retry(total=10,
backoff_factor=1,
status_forcelist=[ 500, 502, 503, 504 ],)
session.mount('https://', HTTPAdapter(max_retries=retries))
last_card = 0
last_time = datetime.datetime.now()
racers = []
log = []
with open('log.json', 'r') as f:
log = json.loads(f.read())
queue = Queue()
class Worker(QtCore.QThread):
returned_state = Signal(str)
def __init__(self):
super().__init__()
self.returned_state.connect(self.handle_returned_state)
self.worker_thread = threading.Thread(target=self.worker)
self.worker_thread.start()
def worker(self):
while True:
item = queue.get()
log.append({
'url': item['url'],
'json': item['json'],
})
with open('log.json', 'w') as f:
f.write(json.dumps(log))
response = session.post(item['url'], json=item['json'])
if response.status_code == 200:
if item.get('on_success'):
item['on_success']()
if item.get('message'):
self.returned_state.emit(f'{item['message']}')
else:
if item.get('failed'):
self.returned_state.emit(f'{item['failed']}')
print(item, response)
def handle_returned_state(self, state):
mb = QtWidgets.QMessageBox(text=f"{state}")
mb.exec()
worker = Worker()
def register_racer():
card_id = last_card
index = window.racers.currentIndex()
if not index.data():
mb = QtWidgets.QMessageBox(text='Prosím vyberte závodníka!')
mb.exec()
return
racer_id = int(index.data().split(' ')[-1])
try:
starting_number = max(filter(lambda r: r['starting_number'], racers), key=lambda racer: racer['starting_number'])['starting_number'] + 1
except ValueError:
starting_number = 1
racer = list(filter(lambda x: x['racer_id'] == racer_id, racers))[0]
def register_update_racer():
racer['card_id'] = card_id
racer['starting_number'] = starting_number
racer['started'] = False
updateRacers()
queue.put({
'url': config['host'] + '/api/card/register',
'json': {'racer_id': racer_id, 'starting_number': starting_number, 'card_id': card_id, 'time': datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S.%f')},
'message': f"Úspěšné zaregistrování závodníka {racer['first_name']} {racer['last_name']} se startovním číslem {starting_number}!",
'failed': f"Neúspěšná registrace závodníka {racer['first_name']} {racer['last_name']}",
'on_success': register_update_racer,
})
model = QtGui.QStandardItemModel()
def updateRacers():
model.clear()
for racer in racers:
if racer['starting_number'] or racer['card_id']:
continue
item = QtGui.QStandardItem(f"{racer['last_name']} {racer['first_name']} {racer['date_of_birth']} {racer['racer_id']}")
model.appendRow(item)
updateRacers()
def reload_racers():
global racers
response = session.get(config['host'] + '/api/racers')
racers = response.json()
updateRacers()
reload_racers()
def findByCard(card_id):
for racer in racers:
if racer['card_id'] == card_id:
return racer
def updateLastCard(card_id):
global last_card, last_time
if card_id == last_card and datetime.datetime.now() - last_time < datetime.timedelta(seconds=15):
return
time = last_time = datetime.datetime.now()
last_card = card_id
window.lastCard.setText(str(card_id))
racer = findByCard(card_id)
if racer:
if racer['started']:
def finish_update_racer():
racer['card_id'] = None
queue.put({
'url': config['host'] + '/api/card/unregister',
'json': {'racer_id': racer['racer_id'], 'starting_number': racer['starting_number'], 'card_id': card_id, 'time': time.strftime('%d.%m.%Y %H:%M:%S.%f')},
'message': f"Úspěšné odhlášení závodníka {racer['starting_number']}!",
'failed': f"Neúspěšné odhlášení karty závodníka {racer['starting_number']}",
'on_success': finish_update_racer,
})
else:
def start_update_racer():
racer['started'] = True
queue.put({
'url': config['host'] + '/api/station/register',
'json': {'card_id': card_id, 'time': time.strftime('%d.%m.%Y %H:%M:%S.%f'), 'station_id': 1},
'message': f"Úspěšné odstartování závodníka {racer['starting_number']}!",
'failed': f"Núspěšné odstartování závodníka {racer['starting_number']}, prosím registraci opakujte!",
'on_success': start_update_racer,
})
UsbCardReader(updateLastCard)
window = uic.loadUi("registrace.ui")
window.racers.setModel(model)
window.register_racer.clicked.connect(register_racer)
window.reload_racers.clicked.connect(reload_racers)
window.show()
app.exec()

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Frame</class>
<widget class="QFrame" name="Frame">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>315</width>
<height>289</height>
</rect>
</property>
<property name="windowTitle">
<string>Registrace závodníků</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="register_racer">
<property name="text">
<string>Registrovat</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLineEdit" name="lastCard"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>číslo karty</string>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="5">
<widget class="QListView" name="racers"/>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="reload_racers">
<property name="text">
<string>Obnovit Závodníky</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -0,0 +1,51 @@
import usb.core
import usb.util
import time
import requests
import json
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in MS
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
# Find the HID device by vender/product ID
dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
endpoint = dev[0][(0,0)][0]
if dev.is_kernel_driver_active(USB_IF) is True:
dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(dev, USB_IF)
receivedNumber = 0
while True:
control = None
try:
# Read a character from the device
control = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, USB_TIMEOUT)
# Here you have to analyze what's coming in.
# In my case you had to check the first byte (command)
if (control[2] != 40) & (control[2] != 0):
# Convert ascii to a number, there's probably better ways to do so.
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
# Append the digit to the number
receivedNumber = 10 * receivedNumber + receivedDigit
# Check if the received character is CRLF
if (( control[0] == 0 )) & (( control[2] == 40 )) & (( not receivedNumber == 0 )):
print('cardNumber:', receivedNumber)
except KeyboardInterrupt:
exit()
except:
pass
time.sleep(0.001) # Let CTRL+C actually exit

2
SW/PC/Stopwatch/run.sh Executable file
View File

@@ -0,0 +1,2 @@
#!/bin/bash
GTK_THEME=Adwaita:light python ./main.py

View File

@@ -0,0 +1,110 @@
import threading
import time
import usb.core
import usb.util
import requests
import json
import datetime
DEBUG = False
if DEBUG == True:
index = 2
else:
index = 1
activeCards = []
TIME = 600
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in ms
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
with open('people.json', 'r') as f:
db = json.load(f)
try:
times = {}
with open('times.json', 'r') as f:
times_json = json.load(f)
for i in times_json:
times[i] = {}
times[i]['start'] = datetime.datetime.strptime(times_json[i]['start'],"%d/%m/%Y, %H:%M:%S")
try:
times[i]['end'] = datetime.datetime.strptime(times_json[i]['end'],"%d/%m/%Y, %H:%M:%S")
times[i]['duration'] = times[i]['end'] - times[i]['start']
except:
print(i, "Not finished yet")
print(times)
except Exception as e: print(e)
#except:
# times = {}
# times_json = {}
class UsbCardReader():
def __init__(self, **kargs):
# Find the HID device by vendor/product ID
self.dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
self.endpoint = self.dev[0][(0,0)][0]
if self.dev.is_kernel_driver_active(USB_IF) is True:
self.dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(self.dev, USB_IF)
self.receivedNumber = 0
cardread=threading.Thread(target=self.read)
cardread.start()
def read(self):
global activeCards, db, times, times_json
print("Waiting for card")
receivedNumber = 0
while True:
control = None
try:
control = self.dev.read(self.endpoint.bEndpointAddress, self.endpoint.wMaxPacketSize, USB_TIMEOUT)
if (control[2] != 40) & (control[2] != 0):
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
receivedNumber = 10 * receivedNumber + receivedDigit
if (( control[0] == 0 )) & (( control[2] == 40 )) & (( not receivedNumber == 0 )):
try:
with open('people.json', 'r') as f:
db = json.load(f)
for i in db:
if db[i] == receivedNumber:
print("Runner:", i)
print(db)
runner_found = False
for j in times:
if j == i:
runner_found = True
times[j]['end'] = datetime.datetime.now()
times[j]['duration'] = times[j]['end'] - times[j]['start']
times_json[j]['end'] = times[j]['end'].strftime("%d/%m/%Y, %H:%M:%S")
times_json[j]['duration'] = str(times[j]['duration'])
if runner_found == False:
times[i] = {}
times[i]['start'] = datetime.datetime.now()
times_json[i] = {}
times_json[i]['start'] = times[i]['start'].strftime("%d/%m/%Y, %H:%M:%S")
with open("times.json", 'w') as f:
f.write(json.dumps(times_json, indent = 4))
print(times)
except Exception as e: print(e)
receivedNumber = 0
except KeyboardInterrupt:
exit()
except:
pass
time.sleep(0.001)
UsbCardReader()

20
SW/PC/Stopwatch/style.css Normal file
View File

@@ -0,0 +1,20 @@
#lightgrid {
background-color: #F0F0F0;
}
#darkgrid {
background-color: #D0D0D0;
}
#lredgrid {
background-color: #FF8888;
}
#dredgrid {
background-color: #FF6666;
}
#gridlabel {
font-size: 16pt;
font-weight: bold;
}

View File

@@ -0,0 +1,12 @@
{
"1": {
"start": "25/02/2025, 18:06:16",
"end": "25/02/2025, 18:06:31",
"duration": "0:00:14.553644"
},
"2": {
"start": "25/02/2025, 18:15:08",
"end": "25/02/2025, 18:15:27",
"duration": "0:00:19.543765"
}
}

View File

@@ -0,0 +1,52 @@
import usb.core
import usb.util
import threading
import time
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in ms
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
class UsbCardReader:
def __init__(self, callback):
#fn called on found card
self.callback = callback
# Find the HID device by vendor/product ID
self.dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
self.endpoint = self.dev[0][(0,0)][0]
if self.dev.is_kernel_driver_active(USB_IF) is True:
self.dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(self.dev, USB_IF)
self.receivedNumber = 0
cardread=threading.Thread(target=self.read)
cardread.start()
def read(self):
receivedNumber = 0
while True:
control = None
try:
control = self.dev.read(self.endpoint.bEndpointAddress, self.endpoint.wMaxPacketSize, USB_TIMEOUT)
if (control[2] != 40) and (control[2] != 0):
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
receivedNumber = 10 * receivedNumber + receivedDigit
if ( control[0] == 0 ) and ( control[2] == 40 ) and ( not receivedNumber == 0 ):
self.callback(receivedNumber)
receivedNumber = 0
except KeyboardInterrupt:
exit()
except:
receivedNumber = 0
pass
time.sleep(0.001)

View File

@@ -0,0 +1,84 @@
import time
import usb.core
import usb.util
import requests
import json
import threading
USB_IF = 0 # Interface
USB_TIMEOUT = 5 # Timeout in ms
USB_VENDOR = 0xffff # Vendor-ID:
USB_PRODUCT = 0x0035 # Product-ID
activeCards = {}
try:
with open('people.json', 'r') as f:
activeCards = json.load(f)
except:
print("No people.json found")
class UsbCardReader():
def __init__(self, **kargs):
# Find the HID device by vendor/product ID
self.dev = usb.core.find(idVendor=USB_VENDOR, idProduct=USB_PRODUCT)
# Get and store the endpoint
self.endpoint = self.dev[0][(0,0)][0]
if self.dev.is_kernel_driver_active(USB_IF) is True:
self.dev.detach_kernel_driver(USB_IF)
# Claim the device
usb.util.claim_interface(self.dev, USB_IF)
self.receivedNumber = 0
def read(self):
global activeCards
print("Priloz kartu")
while True:
control = None
try:
control = self.dev.read(self.endpoint.bEndpointAddress, self.endpoint.wMaxPacketSize, USB_TIMEOUT)
if (control[2] != 40) & (control[2] != 0):
receivedDigit = control[2] - 29
if receivedDigit == 10:
receivedDigit = 0
self.receivedNumber = 10 * self.receivedNumber + receivedDigit
if (( control[0] == 0 )) & (( control[2] == 40 )) & (( not self.receivedNumber == 0 )):
try:
cardPresent = False
for i in activeCards:
if activeCards[i] == self.receivedNumber:
cardPresent = True
break
if cardPresent == False:
assign=threading.Thread(target=self.assign)
assign.start()
else:
print("Naramek jiz zaregistrovan")
self.receivedNumber = 0
print("Priloz kartu")
except Exception as e: print(e)
except KeyboardInterrupt:
exit()
except:
pass
time.sleep(0.001)
def assign(self):
global activeCards
n = input("Cislo zavodnika: ")
activeCards[str(n)] = self.receivedNumber
with open('people.json', 'w') as f:
f.write(json.dumps(activeCards, indent = 4))
self.receivedNumber = 0
print("Ulozeno, priloz kartu")
if __name__ == "__main__":
reader = UsbCardReader()
print("Zapis zavodniku ready")
reader.read()

View File

@@ -90,7 +90,6 @@ def main():
elif rw == '':
s.write('r\r'.encode())
read(s)
else:
print('Invalid option')

View File

@@ -11,7 +11,9 @@ BRIGHTNESS = 0.2 # Adjust the brightness (0.0 - 1.0)
led_strip = neopixel.NeoPixel(Pin(ws_pin), led_num)
push_button = Pin(24,Pin.IN,Pin.PULL_UP)
push_button = Pin(24, Pin.IN, Pin.PULL_UP)
buzzer = Pin(3, Pin.OUT)
led = Pin(25, Pin.OUT)
pushbutton_pressed = 0
blink_interrupted = 0
@@ -80,19 +82,24 @@ def blink_and_beep(times):
blink_delay = 0.2
#insert beep
buzzer.value(1)
for i in range(0, times):
set_neopixel_color(255, 0, 0)
buzzer.value(0)
time.sleep(blink_delay)
set_neopixel_color(0, 0, 0)
buzzer.value(1)
time.sleep(blink_delay)
if pushbutton_pressed == 1:
pushbutton_pressed = 0
blink_interrupted = 1
i = times
buzzer.value(0)
return
buzzer.value(0)
ten_min_timer = 0
ten_min_timer_led_index = 0
ten_min_timer_led_index = 11
def count_10_min():
global ten_min_timer, ten_min_timer_led_index, pushbutton_pressed, blink_interrupted
@@ -107,7 +114,7 @@ def count_10_min():
if (ten_min_timer % 60) == 0:
if ten_min_timer_led_index == 10:
pushbutton_pressed = 0
blink_and_beep(60)
blink_and_beep(15)
if blink_interrupted == 1:
blink_interrupted = 0
return
@@ -135,6 +142,22 @@ def button_callback(push_button):
set_neopixel_color(0,0,0)
push_button.irq(trigger=Pin.IRQ_FALLING, handler=button_callback)
green = (0, 255, 0)
green = set_neopixel_brightness(green)
led_strip[0] = green
led_strip[2] = green
led_strip[4] = green
led_strip[6] = green
led_strip[8] = green
led_strip.write()
led_state = False
while True:
count_10_min()
time.sleep(1)
if led_state:
led.low()
led_state = False
else:
led.high()
led_state = True

View File

@@ -406,4 +406,3 @@ class PN532:
_COMMAND_INDATAEXCHANGE, params=params, response_length=1
)
return response[0] == 0x00