This commit is contained in:
Sergey Yarkov 2026-05-15 14:15:17 +03:00
commit ef3ff63cb5
46 changed files with 15824 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
3d

13
.vscode/c_cpp_properties.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"configurations": [
{
"name": "Linux",
"compilerPath": "/usr/bin/avr-gcc",
"compilerArgs": ["-Wall", "-mmcu=atmega8a", "-Os"],
"includePath": ["${workspaceFolder}/firmware/**", "/usr/lib/avr/include"],
"cStandard": "c11",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}

19
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,19 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug (bloom)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/firmware/build/firmware.elf",
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/avr-gdb",
"miDebuggerServerAddress": "localhost:1234",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
// "preLaunchTask": "Debug server (bloom)",
}
]
}

8
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,8 @@
{
"C_Cpp.default.compilerPath": "/usr/bin/avr-gcc",
"files.associations": {},
"makefile.configureOnOpen": false,
"makefile.makefilePath": "./firmware/Makefile",
"makefile.makeDirectory": "./firmware",
"C_Cpp.formatting": "disabled"
}

63
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,63 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build (prod)",
"type": "shell",
"command": "make -C ${workspaceFolder}/firmware",
"problemMatcher": ["$gcc"],
"group": "build"
},
{
"label": "Clean and build (prod)",
"type": "shell",
"command": "make -C ${workspaceFolder}/firmware clean && make -C ${workspaceFolder}/firmware",
"problemMatcher": ["$gcc"],
"group": "build",
"presentation": {
"close": true,
"showReuseMessage": false
}
},
{
"label": "Clean and build (debug)",
"type": "shell",
"command": "make -C ${workspaceFolder}/firmware clean && make -C ${workspaceFolder}/firmware DEBUG=true",
"problemMatcher": ["$gcc"],
"group": "build",
"presentation": {
"close": true,
"showReuseMessage": false
}
},
{
"label": "Debug server (bloom)",
"type": "shell",
"command": "bloom",
"presentation": {
"echo": true,
"reveal": "always",
"panel": "shared",
"focus": true,
"showReuseMessage": false,
"clear": false,
"close": true
},
"problemMatcher": {
"owner": "custom",
"pattern": {
"regexp": "."
},
"background": {
"activeOnStart": true,
"beginsPattern": "DebugServer ready",
"endsPattern": "DebugServer ready"
}
},
"isBackground": true,
"dependsOn": "Clean and build (debug)"
}
]
}

104
firmware/Makefile Normal file
View File

@ -0,0 +1,104 @@
TARGET=firmware
# === Directories path =============================================================================
SRC_DIR=./src
OBJ_DIR=./obj
ASM_DIR=./asm
OUT_DIR=./build
# ==================================================================================================
# === Device configuration =========================================================================
MCU=atmega8a
FUSE_HIGH=0xd9
FUSE_LOW=0xff
# ==================================================================================================
# === Toolchain ====================================================================================
OBJCOPY=avr-objcopy
OBJDUMP=avr-objdump
SIZE=avr-size
CC=avr-gcc
# ==================================================================================================
# === Programmer options ===========================================================================
# MPLAB SNAP: snap_jtag (or isp)
# USBtiny: usbtiny
AVRDUDE_DEVICE=m8a
AVRDUDE_PROGRAMMER=snap_isp
AVRDUDE_SPEED=128kHz
AVRDUDE_FLAGS=-c $(AVRDUDE_PROGRAMMER) -p $(AVRDUDE_DEVICE) -B $(AVRDUDE_SPEED)
# ==================================================================================================
# === Compiler options =============================================================================
CC_FLAGS=-Wall -Wextra
ifeq ($(DEBUG), true)
CC_FLAGS+=-ggdb -Og
CC_FLAGS+=-Wl,-Map=$(OUT_DIR)/$(TARGET).map
CC_FLAGS+=-DDEBUG_BUILD=TRUE
else
CC_FLAGS+=-Os
endif
CC_FLAGS+=-mmcu=$(MCU)
CC_FLAGS+=-std=c11
# ==================================================================================================
OBJS=$(subst $(SRC_DIR),$(OBJ_DIR),$(patsubst %.c,%.o,$(wildcard $(SRC_DIR)/*.c)))
ASMS=$(subst $(SRC_DIR),$(ASM_DIR),$(patsubst %.c,%.S,$(wildcard $(SRC_DIR)/*.c)))
.PHONY: all asms hex clean size prog_flash prog_test prog_read_eep prog_read_fuses prog_flash_fuses
all: hex size
hex: $(OUT_DIR)/$(TARGET).hex
asms: $(ASMS)
prog_flash:
avrdude $(AVRDUDE_FLAGS) -V -U flash:w:"$(OUT_DIR)/$(TARGET).hex":i
prog_test:
avrdude $(AVRDUDE_FLAGS)
prog_read_eep:
avrdude $(AVRDUDE_FLAGS) -U eeprom:r:"$(OUT_DIR)/eeprom.hex":i
prog_read_fuses:
avrdude $(AVRDUDE_FLAGS) -U hfuse:r:"$(OUT_DIR)/h_fuse.hex":h -U lfuse:r:"$(OUT_DIR)/l_fuse.hex":h
prog_flash_fuses:
avrdude $(AVRDUDE_FLAGS) -U hfuse:w:$(FUSE_HIGH):m -U lfuse:w:$(FUSE_LOW):m
$(OUT_DIR)/$(TARGET).hex: $(OUT_DIR)/$(TARGET).elf $(OUT_DIR)/$(TARGET).S
$(OBJCOPY) -R .eeprom -R .fuse -R .lock -R .signature -O ihex $< $@
$(OUT_DIR)/$(TARGET).elf: $(OBJS) | $(OUT_DIR)
$(CC) $(CC_FLAGS) $^ -o $@
$(OUT_DIR)/$(TARGET).S: $(OBJS) | $(OUT_DIR)
$(OBJDUMP) -D $(OUT_DIR)/$(TARGET).elf > $@
## Compile to object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h | $(OBJ_DIR)
$(CC) $(CC_FLAGS) -c $(SRC_DIR)/$(patsubst %.o,%.c, $(notdir $@)) -o $@
## Compile to assembler files (optional)
$(ASM_DIR)/%.S: $(SRC_DIR)/%.c $(SRC_DIR)/%.h | $(ASM_DIR)
$(CC) -S -fverbose-asm $(CC_FLAGS) -c $(SRC_DIR)/$(patsubst %.S,%.c, $(notdir $@)) -o $@
$(OUT_DIR):
mkdir $@
$(OBJ_DIR):
mkdir $@
$(ASM_DIR):
mkdir $@
clean:
rm -rf $(OBJ_DIR)
rm -rf $(OUT_DIR)
rm -rf $(ASM_DIR)
size: $(OUT_DIR)/$(TARGET).elf
$(SIZE) --mcu=$(MCU) --format=avr $<

3403
firmware/build/firmware.S Normal file

File diff suppressed because it is too large Load Diff

BIN
firmware/build/firmware.elf Executable file

Binary file not shown.

235
firmware/build/firmware.hex Normal file
View File

@ -0,0 +1,235 @@
:1000000012C02CC02BC02AC029C028C027C026C0BF
:1000100025C024C023C0C1C321C020C01FC01EC032
:100020001DC01CC01BC011241FBECFE5D4E0DEBF25
:10003000CDBF10E0A0E6B0E0E4EFFDE002C0059027
:100040000D92A43FB107D9F721E0A4EFB0E001C0C1
:100050001D92A034B207E1F78ED4CAC6D1CF21B326
:10006000242B21BB32B3242F2095232332B3432BDF
:100070003FB7F894FC01680F791FA2E3B0E0E617E0
:10008000F70719F43FBF78940895819198E0E894B8
:100090004C93000087FF2C93880F07F407F408F4B3
:1000A0002C939A95A9F7EBCF9B01220F331F620F78
:1000B000731FD5DF83E893E00197F1F700C00000DC
:1000C000089540E8F1CF660F771F660F771F40E86D
:1000D000C6DF83E893E00197F1F700C000000895C0
:1000E00040E8BDCF8091F40081111092F400089592
:1000F000282F80911101289FC0011124EFEFF0E01B
:10010000BF0169D4462F80911001289FC00111249E
:10011000BF0161D4362F80911201289FC0011124A4
:10012000BF0159D4862FE5EFF0E04183308382830D
:10013000339691E0E031F907C1F769E070E085EFAF
:1001400090E0BFCFE5EFF0E0818360834283339698
:1001500091E0E031F907C1F769E070E085EF90E0E8
:10016000B0CFCF93DF93C5EFD0E0698183E090E01B
:10017000B0D5688182E090E0ACD56A8181E090E002
:10018000A8D589818C8F88818B8F8A818D8FDF9113
:10019000CF910895CF93DF9300D0CDB7DEB79A8388
:1001A000898389819A8190931401809313016981D5
:1001B0007A8180E090E00F900F90DF91CF9189C518
:1001C000CF92DF92EF92FF920F931F93CF93DF9323
:1001D00000D000D000D01F92CDB7DEB719821A82AE
:1001E0001B821F821E826FE670E00AD58C01CE0151
:1001F00001966C01F12CEE24EA9401151105B9F574
:100200004B816A8189819EDFACDF8E2D71DF8E810B
:100210009F81C0DF88EA90E02ED38091F60090E0C5
:1002200035D38CE224D38091F50090E02FD38CE27B
:100230001ED38091F70090E029D385EA90E01BD38C
:1002400086EB90E018D38E2D90E020D385EA90E0E5
:1002500012D389EC90E00FD38E819F8117D38DE06C
:1002600006D38AE004D381E08093F40006C095E0D1
:10027000F91212C081E790E0FED227960FB6F894EB
:10028000DEBF0FBECDBFDF91CF911F910F91FF90C9
:10029000EF90DF90CF900895E2E0EF15A8F04AE0EC
:1002A00050E0BE016C5F7F4FC801BCD3F601608394
:1002B0008C819D818017910701F5F6018081811164
:1002C0001CC080E990E0D8CFF3E0FF1209C04AE0FB
:1002D00050E0BE016C5F7F4FC801A4D3E62EE8CF8B
:1002E00084E0F812E5CF4AE050E0BE016C5F7F4F3A
:1002F000C80198D37F836E83DBCFF3946FE670E001
:1003000090E080E07DD48C01FFEFCF1ADF0A75CF3B
:10031000CF93DF93E199FECF80E090E0D2D490E0DC
:100320009093140180931301C5EFD0E083E090E037
:10033000C8D4898382E090E0C4D4888381E090E0CF
:10034000C0D48A83239681E0C031D80779F78091A1
:10035000F600809311016091F500609310014091C7
:10036000F70040931201EEDE809113019091140189
:1003700011DF8CED90E07FD28091F60090E086D284
:1003800080EF90E078D28091F50090E07FD280EF0E
:1003900090E071D28091F70090E078D280EF90E009
:1003A0006AD2809113019091140170D285EA90E095
:1003B000DF91CF9160C2CF93C8EC94DE811130C041
:1003C0008C2F96DE8FE59AEE0197F1F700C00000C2
:1003D000C15098F7C2E386DE811122C08FE295E713
:1003E0000197F1F700C00000C150A9F77BDE811131
:1003F00017C08C2F7DDE8FE59AEE0197F1F700C0D4
:100400000000CF5FC93C91F7C4E66CDE811108C0E3
:100410008FE295E70197F1F700C00000C150A9F7FE
:10042000CF910895CF9388EC63DEC5E05BDE811148
:1004300032C08FE295E70197F1F700C00000C1508C
:10044000A9F7C8EC4FDE811126C08C2F51DE87EB57
:100450009BE00197F1F700C00000C15098F788ECCD
:1004600047DEC8EC3FDE811116C08C2F41DE87E0ED
:1004700092E50197F1F700C00000C15098F7CEE176
:1004800031DE811108C087EC9FEA0197F1F700C0C7
:100490000000C150A9F7CF9108952F923F924F923B
:1004A0005F926F927F928F929F92AF92BF92CF9204
:1004B000DF92EF92FF920F931F93CF93DF9300D0C1
:1004C0001F92CDB7DEB78091170190E0FC01EE0FCF
:1004D000FF1FE80FF91FE05AFF4F20812983318069
:1004E0002280019665E070E08AD280931701FC01BA
:1004F000EE0FFF1FE80FF91FE05AFF4F8080821AAE
:10050000990861806318770842804218550810E006
:1005100000E0F12CE12CD12CC12C85E690E09B83EE
:100520008A8344E6A42EB12CDDDD811135C0C801DB
:10053000B50151D2422D460FC701B5014CD2232D32
:10054000260FC601B50147D2862F622F9981890FE8
:10055000F9DD8FE59AEE0197F1F700C000008A817E
:100560009B8101979B838A83C80CD91CE60CF71CDE
:10057000040D151D892BC1F692E39983B3DD81111A
:100580000BC08FE295E70197F1F700C00000998159
:10059000915099839111F2CF0F900F900F90DF91AE
:1005A000CF911F910F91FF90EF90DF90CF90BF9070
:1005B000AF909F908F907F906F905F904F903F9003
:1005C0002F9008951F93CF93DF93E82F862F6BE230
:1005D000F6D1282F892F880F890F382F330FCFEFAF
:1005E000D0E0AE01431B51091FEF149FC001159FBE
:1005F000900D1124BE01EFD1F62F462F319FC0017F
:100600001124BE01E8D1962F223019F140F42223A3
:1006100021F0213061F02F2F90E04FEF0AC02330FE
:10062000E1F02430C1F7462F2FEF90E002C020E028
:100630009FEF6E2F70E0FB01EE0FFF1FE60FF71F1D
:10064000EB50FF4F418390832283DF91CF911F9125
:100650000895262F9FEF40E0ECCF9F2F2FEFFBCF89
:10066000CF93DF93D0E0C0E0609116016D0F8C2F27
:10067000A9DFCF5FD45EC930B9F769E070E085EFDC
:1006800090E01FDD809116018E5F80931601C3E01C
:1006900029DD811108C08FE295E70197F1F700C0CD
:1006A0000000C150A9F7DF91CF910895CF93DF9358
:1006B00080911501823051F138F4882399F181300D
:1006C00059F1109215011FC0833089F0CFEFD0E0AF
:1006D0008430B9F707DD811116C0C2DF8FE295E7DC
:1006E0000197F1F700C000002197A1F705C0D5DE02
:1006F000D4DED3DED2DED1DE809115018F5F85306E
:1007000000F780931501DF91CF9108958BDE8ADE8B
:1007100089DE88DE87DEF0CF4EDE4DDE4CDE4BDE3E
:100720004ADEEACF409112016091100180911101DF
:1007300009DD8FEFDDDCC4EFD1E0D4DC8111E3CF44
:100740008FE295E70197F1F700C000002197A9F724
:10075000D3CF8FE295E70197F1F700C0000008952D
:100760002FEF8EE994E2215080409040E1F700C0E5
:10077000000072D080EE90E05AD08F9AC9DD789454
:10078000089587B38C6287BB709A8DB180658DB9EF
:1007900008958FB9779BFECF08951F920F920FB6E1
:1007A0000F9211242F933F934F935F936F937F93F7
:1007B0008F939F93AF93BF93EF93FF938CB19091DF
:1007C00019019F3110F010921901E091190191E087
:1007D0009E0F90931901F0E0E25EFE4F808384301B
:1007E00021F08D3011F08A3089F4E0911901F0E0A8
:1007F000E25EFE4F108210921901E0911A01F09111
:100800001B01309719F08EE191E00995FF91EF916E
:10081000BF91AF919F918F917F916F915F914F9118
:100820003F912F910F900FBE0F901F9018959093AE
:100830001B0180931A010895E0911A01F0911B01A8
:10084000309749F080911801882329F08EE191E0DA
:1008500009951092180108958898899A8AB1886933
:100860008AB986EA80BD10BC8DE489B908955D9B84
:10087000FECF8CB90895CF93DF93EC01899181115C
:1008800003C0DF91CF910895F2DFF8CFCF93DF93CC
:1008900000D000D000D01F92CDB7DEB74AE0BE0135
:1008A0006F5F7F4FD8D1CE010196E5DF27960FB657
:1008B000F894DEBF0FBECDBFDF91CF910895DF92D8
:1008C000EF92FF920F931F93CF93DF93CDB7DEB7D5
:1008D000C05CD1090FB6F894DEBF0FBECDBFFE01DC
:1008E000319690ECDF011D929A95E9F77F01DF01C7
:1008F000362F50EC27E090E074E016E0D12E9830CF
:1009000081F1903189F1983189F1032F10E0022EA5
:1009100002C0159507950A94E2F700FF2AC0DC9201
:100920009F5F2150515011965111E9CFF8948F01DA
:1009300000541F4FF70181917F012BDF0E151F051A
:10094000C9F77894C054DF4F0FB6F894DEBF0FBEDE
:10095000CDBFDF91CF911F910F91FF90EF90DF906E
:100960000895382F27E0D1CF342FFCCF362F90E0D9
:10097000CCCF7C93D5CFF4DE8091130190911401FC
:1009800082309105B1F030F4009761F00197A1F742
:1009900012DDF2CF8430910581F068F0059761F7A0
:1009A00085DEEACF8FE295E70197F1F700C00000FE
:1009B000E3CF38DDE1CF71DDDFCF52DEDDCF991B34
:1009C00079E004C0991F961708F0961B881F7A9546
:1009D000C9F780950895AA1BBB1B51E107C0AA1F48
:1009E000BB1FA617B70710F0A61BB70B881F991FD0
:1009F0005A95A9F780959095BC01CD01089597FB74
:100A0000072E16F4009406D077FD08D0E4DF07FC2B
:100A100005D03EF4909581959F4F0895709561950E
:100A20007F4F0895B0E0A0E0E7E1F5E09FC15C01F1
:100A30006B017A016115710519F0FB0191838083C7
:100A4000E114F10449F0C7010297839728F060E0B0
:100A500070E0CB019AC05E01E5012196F50110819D
:100A6000812F90E0C5D0892BB1F71D3209F055C018
:100A70002196F501118101E0E114F10409F4ABC004
:100A8000F0E1EF16F10409F08CC0103341F48881D5
:100A90008F7D883509F081C0198122960260E0E1DE
:100AA000EE2EF12C88248A94982CA82CFFE0BF2EDF
:100AB00020E060E070E0CB0127010F2C000C6608FD
:100AC0007708FE0150ED352E310E39E0331538F43C
:100AD0003FEB310F3A3198F549EC342E310E3E148C
:100AE0001F04B4F52F3FB1F086169706A806B90685
:100AF00068F1A3019201FED0232D30E050E040E0E8
:100B0000620F731F841F951F621773078407950771
:100B1000E8F021E021961081D4CF1B3221F4E501C9
:100B20002296F501118100E0A7CF78E0E72EF12CA5
:100B300088248A94982CA82C6FE1B62EB9CF3FE96F
:100B4000310F3A3128F439EA332EC8CF2FEFE2CFF4
:100B5000C114D10431F02223E1F02197F601D183B1
:100B6000C08300FF07C090958095709561957F4F79
:100B70008F4F9F4F2F3F49F482E290E090933F01C7
:100B800080933E016FEF7FEFCB01CDB7DEB7E1E1A0
:100B900009C101FFE6CF2297E1CF10E3E114F10490
:100BA00021F23AE0E316F104E1F080E1E816F10405
:100BB00009F475CFE8E0EE16F10409F4B9CF6FEF50
:100BC0007FEFCB0197010F2C000C440B550BA1D0EC
:100BD00049015A016DCF103309F459CF9AE0E92E3B
:100BE000F12C89E9882E982CA82C89E1B82E60CFA9
:100BF000911154C0803219F089508550D0F7089572
:100C00004CE151E001D00895FA01A191B081009723
:100C100019F41097E1F0CD01DC01CD010D90002019
:100C200011F4C00113C0FB012191222319F02015FA
:100C3000D9F7F3CFFB012191201519F41E921196DB
:100C400006C02223C1F70D900020A1F7D001FA01C0
:100C5000A193B0830895BB274A3031F4992322F43D
:100C6000BDE2909581959F4F01C0BB27FB015527A1
:100C7000AA27880F991FAA1FA41710F0A41B8395F9
:100C80005051B9F7A05DAA3308F0A95DA193009770
:100C900079F7B111B1931192CB0103C0992788273D
:100CA0000895DC01FC01672F71917723E1F73297FA
:100CB00004C07C916D9370836291AE17BF07C8F337
:100CC0000895E199FECF9FBB8EBBE09A99278DB323
:100CD0000895262FE199FECF9FBB8EBBE09A019726
:100CE0000DB2021631F02DBB0FB6F894E29AE19ADC
:100CF0000FBE0895DB018F939F932DD0BF91AF91CD
:100D0000A29F800D911DA39F900DB29F900D112465
:100D10000895A1E21A2EAA1BBB1BFD010DC0AA1F3C
:100D2000BB1FEE1FFF1FA217B307E407F50720F054
:100D3000A21BB30BE40BF50B661F771F881F991FCF
:100D40001A9469F760957095809590959B01AC0118
:100D5000BD01CF01089540D0A59F900DB49F900D87
:100D6000A49F800D911D112408952F923F924F92C0
:100D70005F926F927F928F929F92AF92BF92CF922B
:100D8000DF92EF92FF920F931F93CF93DF93CDB734
:100D9000DEB7CA1BDB0B0FB6F894DEBF0FBECDBFAC
:100DA00009942A88398848885F846E847D848C847D
:100DB0009B84AA84B984C884DF80EE80FD800C8186
:100DC0001B81AA81B981CE0FD11D0FB6F894DEBF69
:100DD0000FBECDBFED010895A29FB001B39FC0012A
:100DE000A39F01D0B29F700D811D1124911D089504
:040DF000F894FFCFA5
:100DF400FF000000FF000000FFFFFF0000FFFF2CCA
:100E040000496E76616C6964206E756D626572204E
:100E14006F6620617267756D656E74732E0D0A00BE
:100E24004572726F72206E756D62657220706172A8
:100E340073696E672E0D0A003E204E657720636F3E
:100E44006C6F723A20003E204E65772062726967AB
:100E540068746E6573733A20003E204E6577206394
:100E64006F6C6F72206D6F64653A20003E2053658D
:100E74007474696E6773206C6F616465643A2000F2
:040E84002C2000001E
:00000001FF

BIN
firmware/obj/light_ws2812.o Normal file

Binary file not shown.

BIN
firmware/obj/main.o Normal file

Binary file not shown.

BIN
firmware/obj/spi.o Normal file

Binary file not shown.

BIN
firmware/obj/usart.o Normal file

Binary file not shown.

BIN
firmware/obj/ws2812b.o Normal file

Binary file not shown.

10
firmware/src/defs.h Normal file
View File

@ -0,0 +1,10 @@
#if !defined(_DEFS_H_)
#define _DEFS_H_
#define F_CPU 12000000UL
#define LED_NUMBERS 9
#define LED_DIR DDRD
#define LED_PORT PORTD
#define LED_PIN PD7
#endif

243
firmware/src/light_ws2812.c Normal file
View File

@ -0,0 +1,243 @@
/*
* light weight WS2812 lib V2.5b
*
* Controls WS2811/WS2812/WS2812B RGB-LEDs
* Author: Tim (cpldcpu@gmail.com)
*
* Jan 18, 2014 v2.0b Initial Version
* Nov 29, 2015 v2.3 Added SK6812RGBW support
* Nov 11, 2023 v2.5 Added support for ports that cannot be addressed with "out"
* Added LGT8F88A support
* May 1, 2024 v2.6 Added support for reduced core AVRs
*
* License: GNU GPL v2+ (see License.txt)
*/
#include "light_ws2812.h"
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
// Setleds for standard RGB
inline void ws2812_setleds(struct cRGB *ledarray, uint16_t leds)
{
ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
}
inline void ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask)
{
ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask);
_delay_us(ws2812_resettime);
}
// Setleds for SK6812RGBW
inline void ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
{
ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(ws2812_pin));
_delay_us(ws2812_resettime);
}
void ws2812_sendarray(uint8_t *data,uint16_t datlen)
{
ws2812_sendarray_mask(data,datlen,_BV(ws2812_pin));
}
/*
This routine writes an array of bytes with RGB values to the Dataout pin
using the fast 800kHz clockless WS2811/2812 protocol.
*/
// Timing in ns
#define w_zeropulse 350
#define w_onepulse 900
#define w_totalperiod 1250
// Fixed cycles used by the inner loop
#if defined(__LGT8F__) // LGT8F88A
#define w_fixedlow 4
#define w_fixedhigh 6
#define w_fixedtotal 10
#elif __AVR_ARCH__ == 100 // reduced core AVR
#define w_fixedlow 2
#define w_fixedhigh 4
#define w_fixedtotal 8
#else // all others
#define w_fixedlow 3
#define w_fixedhigh 6
#define w_fixedtotal 10
#endif
// Insert NOPs to match the timing, if possible
#define w_zerocycles (((F_CPU/1000)*w_zeropulse )/1000000)
#define w_onecycles (((F_CPU/1000)*w_onepulse +500000)/1000000)
#define w_totalcycles (((F_CPU/1000)*w_totalperiod +500000)/1000000)
// w1 - nops between rising edge and falling edge - low
#define w1 (w_zerocycles-w_fixedlow)
// w2 nops between fe low and fe high
#define w2 (w_onecycles-w_fixedhigh-w1)
// w3 nops to complete loop
#define w3 (w_totalcycles-w_fixedtotal-w1-w2)
#if w1>0
#define w1_nops w1
#else
#define w1_nops 0
#endif
// The only critical timing parameter is the minimum pulse length of the "0"
// Warn or throw error if this timing can not be met with current F_CPU settings.
#define w_lowtime ((w1_nops+w_fixedlow)*1000000)/(F_CPU/1000)
#if w_lowtime>550
#error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?"
#elif w_lowtime>450
#warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)."
#warning "Please consider a higher clockspeed, if possible"
#endif
#if w2>0
#define w2_nops w2
#else
#define w2_nops 0
#endif
#if w3>0
#define w3_nops w3
#else
#define w3_nops 0
#endif
#define w_nop1 "nop \n\t"
#if (ws2812_interrupt_handling)
#define w_nop2 "brid .+0 \n\t"
#else
#define w_nop2 "brtc .+0 \n\t"
#endif
#define w_nop4 w_nop2 w_nop2
#define w_nop8 w_nop4 w_nop4
#define w_nop16 w_nop8 w_nop8
inline void ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi)
{
// `maskhi` is 0x80 if P?7 is LED DATA
uint8_t curbyte,ctr,masklo;
uint8_t sreg_prev;
#if __AVR_ARCH__ != 100
uint8_t *port = (uint8_t*) _SFR_MEM_ADDR(ws2812_PORTREG);
#endif
ws2812_DDRREG |= maskhi; // Enable output
// `masklo` and `maskhi` are written to PORT? to drive the DATA line low or
// high (rather than setting or clearing the bit in PORT?)
masklo =~maskhi&ws2812_PORTREG;
maskhi |= ws2812_PORTREG;
sreg_prev=SREG;
#if (ws2812_interrupt_handling)
cli();
#endif
while (datlen--) {
curbyte=*data++;
__asm__ volatile(
" ldi %0,8 \n\t"
#if (ws2812_interrupt_handling)
" clt \n\t"
#endif
"loop%=: \n\t"
#if __AVR_ARCH__ == 100
" out %2,%3 \n\t" // '1' [01] '0' [01] - re
#else
" st X,%3 \n\t" // '1' [02] '0' [02] - re
#endif
#if (w1_nops&1)
w_nop1
#endif
#if (w1_nops&2)
w_nop2
#endif
#if (w1_nops&4)
w_nop4
#endif
#if (w1_nops&8)
w_nop8
#endif
#if (w1_nops&16)
w_nop16
#endif
#if defined(__LGT8F__)
" bst %1,7 \n\t" // '1' [02] '0' [02]
" brts 1f \n\t" // '1' [04] '0' [03]
" st X,%4 \n\t" // '1' [--] '0' [04] - fe-low
"1: lsl %1 \n\t" // '1' [05] '0' [05]
#elif __AVR_ARCH__ == 100
" sbrs %1,7 \n\t" // '1' [03] '0' [02]
" out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low
" lsl %1 \n\t" // '1' [04] '0' [04]
#else
" sbrs %1,7 \n\t" // '1' [04] '0' [03]
" st X,%4 \n\t" // '1' [--] '0' [05] - fe-low
" lsl %1 \n\t" // '1' [05] '0' [06]
#endif
#if (w2_nops&1)
w_nop1
#endif
#if (w2_nops&2)
w_nop2
#endif
#if (w2_nops&4)
w_nop4
#endif
#if (w2_nops&8)
w_nop8
#endif
#if (w2_nops&16)
w_nop16
#endif
#if __AVR_ARCH__ == 100
" out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high
#else
" brcc skipone%= \n\t" // '1' [+1] '0' [+2] -
" st X,%4 \n\t" // '1' [+3] '0' [--] - fe-high
"skipone%=: " // '1' [+3] '0' [+2] -
#endif
#if (w3_nops&1)
w_nop1
#endif
#if (w3_nops&2)
w_nop2
#endif
#if (w3_nops&4)
w_nop4
#endif
#if (w3_nops&8)
w_nop8
#endif
#if (w3_nops&16)
w_nop16
#endif
" dec %0 \n\t" // '1' [+4] '0' [+3]
" brne loop%=\n\t" // '1' [+5] '0' [+4]
: "=&d" (ctr)
#if __AVR_ARCH__ == 100
: "r" (curbyte), "I" (_SFR_IO_ADDR(ws2812_PORTREG)), "r" (maskhi), "r" (masklo)
#else
: "r" (curbyte), "x" (port), "r" (maskhi), "r" (masklo)
#endif
);
}
SREG=sreg_prev;
#if (ws2812_interrupt_handling)
sei();
#endif
}

116
firmware/src/light_ws2812.h Normal file
View File

@ -0,0 +1,116 @@
/*
* light weight WS2812 lib include
*
* Version 2.3 - Nev 29th 2015
* Author: Tim (cpldcpu@gmail.com)
*
* Please do not change this file! All configuration is handled in "ws2812_config.h"
*
* License: GNU GPL v2+ (see License.txt)
+
*/
#ifndef LIGHT_WS2812_H_
#define LIGHT_WS2812_H_
#include "ws2812_config.h"
#include <avr/io.h>
#include <avr/interrupt.h>
///////////////////////////////////////////////////////////////////////
// Define Reset time in µs.
//
// This is the time the library spends waiting after writing the data.
//
// WS2813 needs 300 µs reset time
// WS2812 and clones only need 50 µs
//
///////////////////////////////////////////////////////////////////////
#if !defined(ws2812_resettime)
#define ws2812_resettime 300
#endif
///////////////////////////////////////////////////////////////////////
// Define I/O pin
///////////////////////////////////////////////////////////////////////
#if !defined(ws2812_port)
#define ws2812_port B // Data port
#endif
#if !defined(ws2812_pin)
#define ws2812_pin 0 // Data out pin
#endif
///////////////////////////////////////////////////////////////////////
// Define interrupt behaviour
//
// Set to 1 if you want the library to handle interrupt toggling
// (i.e. turning off interrupts when sending data and reverting back after).
// Set to 0 if you need to allow interrupts (can introduce flickering!).
//
///////////////////////////////////////////////////////////////////////
#if !defined(ws2812_interrupt_handling)
#define ws2812_interrupt_handling 1
#endif
/*
* Structure of the LED array
*
* cRGB: RGB for WS2812S/B/C/D, SK6812, SK6812Mini, SK6812WWA, APA104, APA106
* cRGBW: RGBW for SK6812RGBW
*/
struct __attribute__ ((__packed__)) cRGB { uint8_t g; uint8_t r; uint8_t b; };
struct __attribute__ ((__packed__)) cRGBW { uint8_t g; uint8_t r; uint8_t b; uint8_t w;};
#ifdef __cplusplus
extern "C" {
#endif
/* User Interface
*
* Input:
* ledarray: An array of GRB data describing the LED colors
* number_of_leds: The number of LEDs to write
* pinmask (optional): Bitmask describing the output bin. e.g. _BV(PB0)
*
* The functions will perform the following actions:
* - Set the data-out pin as output
* - Send out the LED data
* - Wait 50µs to reset the LEDs
*/
void ws2812_setleds (struct cRGB *ledarray, uint16_t number_of_leds);
void ws2812_setleds_pin (struct cRGB *ledarray, uint16_t number_of_leds,uint8_t pinmask);
void ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t number_of_leds);
/*
* Old interface / Internal functions
*
* The functions take a byte-array and send to the data output as WS2812 bitstream.
* The length is the number of bytes to send - three per LED.
*/
void ws2812_sendarray (uint8_t *array,uint16_t length);
void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask);
#ifdef __cplusplus
}
#endif
/*
* Internal defines
*/
#if !defined(CONCAT)
#define CONCAT(a, b) a ## b
#endif
#if !defined(CONCAT_EXP)
#define CONCAT_EXP(a, b) CONCAT(a, b)
#endif
#define ws2812_PORTREG CONCAT_EXP(PORT,ws2812_port)
#define ws2812_DDRREG CONCAT_EXP(DDR,ws2812_port)
#endif /* LIGHT_WS2812_H_ */

400
firmware/src/main.c Normal file
View File

@ -0,0 +1,400 @@
#include "main.h"
uint8_t eeprom_led_r EEMEM = 0;
uint8_t eeprom_led_g EEMEM = 0;
uint8_t eeprom_led_b EEMEM = 0;
uint8_t eeprom_color_mode EEMEM = 0;
DeviceState_t device = {
.current_color = {{ 0 }},
.base_current_color = { 0, 0 ,0 },
.current_mode = COLOR_MODE_STATIC,
};
volatile bool isChangedColorOrModeInterrupt = false;
bool DeviceChangedColorOrModeCheck(void) {
if (isChangedColorOrModeInterrupt) {
isChangedColorOrModeInterrupt = false;
return true;
}
return false;
}
/**
* @brief Reads the received USART buffer and changes color and mode of device.
* Format: {R},{G},{B},{Brightness},{Color mode}
*
* @param rx_buffer
*/
void DeviceChangeColorHandler(volatile char *rx_buffer) {
char *sep = ",";
char *token;
uint8_t new_rgb_color[3] = {0};
uint8_t brightness = 255;
uint8_t i = 0;
ColorMode_t color_mode = COLOR_MODE_STATIC;
token = strtok((char *)rx_buffer, sep);
while (token != NULL) {
char *endptr;
if (i >= 5) {
USART_SendStr("Invalid number of arguments.\r\n");
i = 0;
return;
}
if (i < 3) new_rgb_color[i] = strtoul(token, &endptr, 10); // get rgb colors
if (i == 3) brightness = strtoul(token, &endptr, 10); // get brigtness percentage
if (i == 4) color_mode = strtoul(token, &endptr, 10); // get color mode
if (endptr == token && new_rgb_color[i] == 0) {
USART_SendStr("Error number parsing.\r\n");
return;
}
i++;
token = strtok(NULL, sep);
}
i = 0;
DeviceSetColor(new_rgb_color[0], new_rgb_color[1], new_rgb_color[2]);
DeviceUpdateColorSettings();
DeviceSetBrightness(brightness);
DeviceSetColorMode(color_mode);
USART_SendStr("> New color: ");
USART_SendInt16(device.current_color[0].r);
USART_SendChar(',');
USART_SendInt16(device.current_color[0].g);
USART_SendChar(',');
USART_SendInt16(device.current_color[0].b);
USART_SendStr("\r\n");
USART_SendStr("> New brightness: ");
USART_SendInt16(brightness);
USART_SendStr("\r\n");
USART_SendStr("> New color mode: ");
USART_SendInt16(color_mode);
USART_SendChar('\r');
USART_SendChar('\n');
isChangedColorOrModeInterrupt = true;
}
/**
* @brief Sets the brightness of all LEDs
*
* @param brightness from 0 to 255
*/
void DeviceSetBrightness(uint8_t brightness) {
uint8_t i = 0;
do {
device.current_color[i].r = (uint16_t)device.base_current_color.r * brightness / 255;
device.current_color[i].g = (uint16_t)device.base_current_color.g * brightness / 255;
device.current_color[i].b = (uint16_t)device.base_current_color.b * brightness / 255;
} while (++i <= LED_NUMBERS - 1);
ws2812_setleds(device.current_color, LED_NUMBERS);
}
void DeviceSetColor(uint8_t r, uint8_t g, uint8_t b) {
uint8_t i = 0;
do {
device.current_color[i].r = r;
device.current_color[i].g = g;
device.current_color[i].b = b;
} while (++i <= LED_NUMBERS - 1);
ws2812_setleds(device.current_color, LED_NUMBERS);
}
void DeviceUpdateColorSettings(void) {
eeprom_update_byte(&eeprom_led_r, device.current_color[0].r);
eeprom_update_byte(&eeprom_led_g, device.current_color[0].g);
eeprom_update_byte(&eeprom_led_b, device.current_color[0].b);
device.base_current_color.r = device.current_color[0].r;
device.base_current_color.g = device.current_color[0].g;
device.base_current_color.b = device.current_color[0].b;
}
void DeviceSetColorMode(ColorMode_t mode) {
device.current_mode = mode;
eeprom_update_byte(&eeprom_color_mode, mode);
}
void DeviceLoadSettings() {
uint8_t i = 0;
eeprom_busy_wait();
device.current_mode = eeprom_read_byte(&eeprom_color_mode);
do {
device.current_color[i].r = eeprom_read_byte(&eeprom_led_r);
device.current_color[i].g = eeprom_read_byte(&eeprom_led_g);
device.current_color[i].b = eeprom_read_byte(&eeprom_led_b);
} while (++i < LED_NUMBERS);
device.base_current_color.r = device.current_color[0].r;
device.base_current_color.g = device.current_color[0].g;
device.base_current_color.b = device.current_color[0].b;
DeviceSetColor(device.current_color[0].r, device.current_color[0].g, device.current_color[0].b);
DeviceSetColorMode(device.current_mode);
USART_SendStr("> Settings loaded: ");
USART_SendInt16(device.current_color[0].r);
USART_SendStr(", ");
USART_SendInt16(device.current_color[0].g);
USART_SendStr(", ");
USART_SendInt16(device.current_color[0].b);
USART_SendStr(", ");
USART_SendInt16(device.current_mode);
USART_SendStr("\r\n");
}
void DeviceBreathModeHahdler(void) {
int16_t brightness = 200;
do {
if (DeviceChangedColorOrModeCheck()) return;
DeviceSetBrightness(brightness);
_delay_ms(20);
} while(--brightness >= 0);
brightness = 0;
for (uint8_t i = 0; i < 50; i++){
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(10);
}
do {
if (DeviceChangedColorOrModeCheck()) return;
DeviceSetBrightness(brightness);
_delay_ms(20);
} while (++brightness <= 200);
for (uint8_t i = 0; i < 100; i++){
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(10);
}
}
void DevicePulseModeHandler(void) {
DeviceSetBrightness(200);
for (uint8_t i = 0; i < 5; i++) {
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(10);
}
for (int16_t b = 200; b >= 0; b--) {
if (DeviceChangedColorOrModeCheck()) return;
DeviceSetBrightness((uint8_t)b);
_delay_ms(1);
}
DeviceSetBrightness(200);
for (int16_t b = 200; b >= 0; b--) {
if (DeviceChangedColorOrModeCheck()) return;
DeviceSetBrightness((uint8_t)b);
_delay_ms(7);
}
for (uint8_t i = 0; i < 30; i++) {
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(15);
}
}
void DeviceDiscoModeHandler(void) {
static const struct { uint8_t r; uint8_t g; uint8_t b; } disco_colors[] = {
{255, 0, 0},
{0, 255, 0},
{0, 0, 255},
{255, 255, 0},
{0, 255, 255}
};
const uint8_t num_colors = sizeof(disco_colors) / sizeof(disco_colors[0]);
static uint8_t color_idx = 0;
uint8_t start_r = disco_colors[color_idx].r;
uint8_t start_g = disco_colors[color_idx].g;
uint8_t start_b = disco_colors[color_idx].b;
color_idx = (color_idx + 1) % num_colors;
uint8_t target_r = disco_colors[color_idx].r;
uint8_t target_g = disco_colors[color_idx].g;
uint8_t target_b = disco_colors[color_idx].b;
for (uint16_t step = 0; step <= 100; step++) {
if (DeviceChangedColorOrModeCheck()) return;
uint8_t r = start_r + (int16_t)(target_r - start_r) * step / 100;
uint8_t g = start_g + (int16_t)(target_g - start_g) * step / 100;
uint8_t b = start_b + (int16_t)(target_b - start_b) * step / 100;
DeviceSetColor(r, g, b);
_delay_ms(20);
}
for (uint8_t d = 0; d < 50; d++) {
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(10);
}
}
void set_pixel_hue(uint8_t index, uint8_t hue) {
uint8_t r, g, b;
uint8_t region = hue / 43;
uint8_t remainder = (hue % 43) * 6;
uint8_t q = (uint16_t)255 * (255 - remainder) / 255;
uint8_t t = (uint16_t)255 * remainder / 255;
switch (region) {
case 0: r = 255; g = t; b = 0; break;
case 1: r = q; g = 255; b = 0; break;
case 2: r = 0; g = 255; b = t; break;
case 3: r = 0; g = q; b = 255; break;
case 4: r = t; g = 0; b = 255; break;
default: r = 255; g = 0; b = q; break;
}
device.current_color[index].r = r;
device.current_color[index].g = g;
device.current_color[index].b = b;
}
void DeviceRainbowModeHandler(void) {
static uint8_t start_hue = 0;
for (uint8_t i = 0; i < LED_NUMBERS; i++) {
uint8_t hue = start_hue + (i * (255 / LED_NUMBERS));
set_pixel_hue(i, hue);
}
ws2812_setleds(device.current_color, LED_NUMBERS);
start_hue += 2;
for (uint8_t d = 0; d < 3; d++) {
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(10);
}
}
void DeviceStepperModeHandler(void) {
static uint8_t effect_step = 0;
switch (effect_step) {
case 0:
DeviceSetColor(device.base_current_color.r, device.base_current_color.g, device.base_current_color.b);
DeviceSetBrightness(255);
for (uint16_t i = 0; i < 500; i++) {
if (DeviceChangedColorOrModeCheck()) return;
_delay_ms(10);
}
break;
case 1:
for (uint8_t i = 0; i < 5; i++) {
DeviceBreathModeHahdler();
}
break;
case 2:
for (uint8_t i = 0; i < 5; i++) {
DevicePulseModeHandler();
}
break;
case 3:
for (uint8_t i = 0; i < 5; i++) {
DeviceDiscoModeHandler();
}
break;
case 4:
for (uint16_t i = 0; i < 255; i++) {
if (DeviceChangedColorOrModeCheck()) return;
DeviceRainbowModeHandler();
_delay_ms(10);
}
break;
default:
effect_step = 0;
return;
}
effect_step++;
if (effect_step > 4) {
effect_step = 0;
}
}
void DeviceStaticModeHandler(void) {
_delay_ms(10);
}
void System_Init() {
_delay_ms(1000);
USART_Init();
USART_SetReceiveHandler(&DeviceChangeColorHandler);
LED_DIR |= _BV(LED_PIN);
DeviceLoadSettings();
sei();
}
int main(void) {
System_Init();
while (1) {
switch (device.current_mode) {
case COLOR_MODE_STATIC:
DeviceStaticModeHandler();
break;
case COLOR_MODE_BREATH:
DeviceBreathModeHahdler();
break;
case COLOR_MODE_PULSE:
DevicePulseModeHandler();
break;
case COLOR_MODE_DISCO:
DeviceDiscoModeHandler();
break;
case COLOR_MODE_RAINBOW:
DeviceRainbowModeHandler();
break;
case COLOR_MODE_STEPPER:
DeviceStepperModeHandler();
break;
default:
break;
}
}
}

50
firmware/src/main.h Normal file
View File

@ -0,0 +1,50 @@
#if !defined(_MAIN_H)
#define _MAIN_H
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include "defs.h"
#include "usart.h"
#include "spi.h"
#include <util/setbaud.h>
#include <util/delay.h>
#include <util/atomic.h>
#include "light_ws2812.h"
typedef volatile enum {
COLOR_MODE_STATIC = 0x00,
COLOR_MODE_BREATH = 0x01,
COLOR_MODE_PULSE = 0x02,
COLOR_MODE_DISCO = 0x03,
COLOR_MODE_RAINBOW = 0x04,
COLOR_MODE_STEPPER = 0x05
} ColorMode_t;
typedef struct {
struct cRGB current_color[LED_NUMBERS];
struct cRGB base_current_color;
ColorMode_t current_mode;
} DeviceState_t;
bool DeviceChangedColorOrModeCheck(void);
void DeviceSetBrightness(uint8_t brightness);
void DeviceSetColor(uint8_t r, uint8_t g, uint8_t b);
void DeviceSetColorMode(ColorMode_t mode);
void DeviceUpdateColorSettings(void);
void DeviceStaticModeHandler(void);
void DeviceBreathModeHahdler(void);
void DevicePulseModeHandler(void);
void DeviceDiscoModeHandler(void);
void DeviceRainbowModeHandler(void);
void DeviceStepperModeHandler(void);
#endif // _MAIN_H

12
firmware/src/spi.c Normal file
View File

@ -0,0 +1,12 @@
#include "spi.h"
void SPI_Init(void) {
DDRB |= _BV(PB5) | _BV(PB3) | _BV(PB2);
SPSR |= _BV(SPI2X);
SPCR |= _BV(SPE) | _BV(MSTR);
}
void SPI_SendByte(uint8_t byte) {
SPDR = byte;
loop_until_bit_is_set(SPSR, SPIF);
}

9
firmware/src/spi.h Normal file
View File

@ -0,0 +1,9 @@
#if !defined(_SPI_H_)
#define _SPI_H_
#include <avr/io.h>
void SPI_SendByte(uint8_t byte);
void SPI_Init(void);
#endif

64
firmware/src/usart.c Normal file
View File

@ -0,0 +1,64 @@
#include "usart.h"
void (*EOT_Handler)(volatile char *rx_buffer) = NULL;
volatile char rx_buffer[RX_BUFFER_SIZE];
volatile uint8_t rx_buffer_idx = 0;
volatile bool rx_received_packet = false;
ISR(USART_RXC_vect) {
char c = UDR;
if (rx_buffer_idx >= RX_BUFFER_SIZE - 1) rx_buffer_idx = 0;
rx_buffer[rx_buffer_idx++] = c;
if (c == EOT || c == '\r' || c == '\n') {
rx_buffer[rx_buffer_idx] = '\0';
rx_buffer_idx = 0;
if (EOT_Handler != NULL) (*EOT_Handler)(rx_buffer);
}
}
void USART_SetReceiveHandler(void (*handler)(volatile char *rx_buffer)) {
EOT_Handler = handler;
}
void USART_OnReceivePacketHandler(void) {
if (EOT_Handler != NULL && rx_received_packet) {
(*EOT_Handler)(rx_buffer);
rx_received_packet = false;
}
}
void USART_Init(void) {
/**
* USART
* 8-bit char size, 1 stop bit, even parity, baud 9600
*/
DDRD &= ~_BV(PD0);
DDRD |= _BV(PD1);
UCSRB |= _BV(RXEN) | _BV(TXEN) | _BV(RXCIE);
UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1) | _BV(UPM1);
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
}
void USART_SendChar(char c) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
}
void USART_SendStr(char *str) {
char c;
while ((c = *str++) != '\0') {
USART_SendChar(c);
}
}
void USART_SendInt16(int16_t num) {
char str[7];
itoa(num, str, 10);
USART_SendStr(str);
}

24
firmware/src/usart.h Normal file
View File

@ -0,0 +1,24 @@
#if !defined(_USART_H_)
#define _USART_H_
#include "defs.h"
#define BAUD 9600
#define RX_BUFFER_SIZE 32
#define EOT 0x04
#include <stdlib.h>
#include <stdbool.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/setbaud.h>
void USART_Init();
void USART_SendChar(char c);
void USART_SendStr(char *str);
void USART_SendInt16(int16_t num);
void USART_SetReceiveHandler(void (*handler)(volatile char *rx_buffer));
void USART_OnReceivePacketHandler(void);
#endif // _USART_H_

View File

@ -0,0 +1,47 @@
/*
* light_ws2812_config.h
*
* v2.4 - Nov 27, 2016
*
* User Configuration file for the light_ws2812_lib
*
*/
#ifndef WS2812_CONFIG_H_
#define WS2812_CONFIG_H_
///////////////////////////////////////////////////////////////////////
// Define Reset time in µs.
//
// This is the time the library spends waiting after writing the data.
//
// WS2813 needs 300 µs reset time
// WS2812 and clones only need 50 µs
//
///////////////////////////////////////////////////////////////////////
#define ws2812_resettime 300
///////////////////////////////////////////////////////////////////////
// Define I/O pin
///////////////////////////////////////////////////////////////////////
#define ws2812_port D // Data port
#define ws2812_pin 7 // Data out pin
///////////////////////////////////////////////////////////////////////
// Define interrupt behaviour
//
// Set to 1 if you want the library to handle interrupt toggling
// (i.e. turning off interrupts when sending data and reverting back after).
// Set to 0 if you need to allow interrupts (can introduce flickering!).
//
///////////////////////////////////////////////////////////////////////
#define ws2812_interrupt_handling 1
#include "defs.h"
#endif /* WS2812_CONFIG_H_ */

48
firmware/src/ws2812b.c Normal file
View File

@ -0,0 +1,48 @@
#include "ws2812b.h"
#include <avr/cpufunc.h>
#define LEDS_COUNT 8
#define PACKET_SIZE LEDS_COUNT * 24
void WS2812_SendRGB(uint8_t r, uint8_t g, uint8_t b) {
uint8_t packet[PACKET_SIZE] = {0};
uint8_t i = 0, j = 0, k = 7;
uint8_t color = g;
do {
if (j == 8) {
k = 7;
color = r;
}
if (j == 16) {
k = 7;
color = b;
}
if (j == 24) {
j = 7;
j = 0;
color = g;
}
if ((color >> k) & 0x01) {
packet[i] = 0b110;
} else {
packet[i] = 0b100;
}
j++;
k--;
} while (++i < PACKET_SIZE);
i = 0;
cli();
do {
SPI_SendByte(packet[i]);
} while (++i < PACKET_SIZE);
sei();
}

10
firmware/src/ws2812b.h Normal file
View File

@ -0,0 +1,10 @@
#if !defined(_WS2812B_H_)
#define _WS2812B_H_
#include <avr/io.h>
#include <avr/interrupt.h>
#include "spi.h"
void WS2812_SendRGB(uint8_t r, uint8_t g, uint8_t b);
#endif // _USART_H_

View File

@ -0,0 +1,2 @@
(kicad_pcb (version 20241229) (generator "pcbnew") (generator_version "9.0")
)

View File

@ -0,0 +1,130 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 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": [
"vias",
"footprint_text",
"footprint_anchors",
"ratsnest",
"grid",
"footprints_front",
"footprints_back",
"footprint_values",
"footprint_references",
"tracks",
"drc_errors",
"drawing_sheet",
"bitmaps",
"pads",
"zones",
"drc_warnings",
"locked_item_shadows",
"conflict_shadows",
"shapes"
],
"visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "atmega8a_rgb-night-light.kicad_prl",
"version": 5
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [
162,
147,
91,
67,
91,
91,
91,
71,
91,
91
],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": 0
},
"open_jobsets": [],
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

View File

@ -0,0 +1,618 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"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.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": true,
"text_position": 0,
"units_format": 0
},
"fab_line_width": 0.1,
"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.1,
"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": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"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",
"creepage": "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_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"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",
"mirrored_text_on_front_layer": "warning",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"nonmirrored_text_on_back_layer": "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_on_edge_cuts": "error",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_angle": "error",
"track_dangling": "warning",
"track_segment_length": "error",
"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.5,
"min_groove_width": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpthpad": true,
"td_onroundshapesonly": false,
"td_onsmdpad": true,
"td_ontrackend": false,
"td_onvia": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"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",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"footprint_filter": "ignore",
"footprint_link_issues": "warning",
"four_way_junction": "ignore",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"label_multiple_wires": "warning",
"lib_symbol_issues": "warning",
"lib_symbol_mismatch": "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",
"same_local_global_label": "warning",
"similar_label_and_power": "warning",
"similar_labels": "warning",
"similar_power": "warning",
"simulation_model_issue": "ignore",
"single_global_label": "ignore",
"unannotated": "error",
"unconnected_wire_endpoint": "warning",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "atmega8a_rgb-night-light.kicad_pro",
"version": 3
},
"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)",
"priority": 2147483647,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"bom_export_filename": "${PROJECTNAME}.csv",
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
},
{
"group_by": true,
"label": "Exclude from BOM",
"name": "${EXCLUDE_FROM_BOM}",
"show": true
},
{
"group_by": true,
"label": "Exclude from Board",
"name": "${EXCLUDE_FROM_BOARD}",
"show": true
},
{
"group_by": true,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"include_excluded_from_bom": true,
"name": "Default Editing",
"sort_asc": true,
"sort_field": "Reference"
},
"connection_grid_size": 50.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,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"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": "C:/Users/serzh/Desktop/",
"space_save_all_events": true,
"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_dissipations": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"6800ce2e-e6e2-46da-a080-1bcfae5c58fe",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,519 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="297.0022mm" height="210.0072mm" viewBox="0.0000 0.0000 297.0022 210.0072">
<title>SVG Image created as ch340_adapter_smd-F_Cu.svg date 2026/04/05 18:48:22 </title>
<desc>Image generated by PCBNEW </desc>
<g style="fill:#000000; fill-opacity:1.0000;stroke:#000000; stroke-opacity:1.0000;
stroke-linecap:round; stroke-linejoin:round;"
transform="translate(0 0) scale(1 1)">
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 150.8522,108.1000
150.9479,108.0810
151.0290,108.0268
151.0832,107.9457
151.1022,107.8500
151.1022,107.0250
151.0832,106.9293
151.0290,106.8482
150.9479,106.7940
150.8522,106.7750
149.5522,106.7750
149.4565,106.7940
149.3754,106.8482
149.3212,106.9293
149.3022,107.0250
149.3022,107.8500
149.3212,107.9457
149.3754,108.0268
149.4565,108.0810
149.5522,108.1000
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 150.8522,111.2250
150.9479,111.2060
151.0290,111.1518
151.0832,111.0707
151.1022,110.9750
151.1022,110.1500
151.0832,110.0543
151.0290,109.9732
150.9479,109.9190
150.8522,109.9000
149.5522,109.9000
149.4565,109.9190
149.3754,109.9732
149.3212,110.0543
149.3022,110.1500
149.3022,110.9750
149.3212,111.0707
149.3754,111.1518
149.4565,111.2060
149.5522,111.2250
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 142.3022,102.7500
142.2832,102.6543
142.2290,102.5732
142.1479,102.5190
142.0522,102.5000
141.2272,102.5000
141.1315,102.5190
141.0504,102.5732
140.9962,102.6543
140.9772,102.7500
140.9772,104.0500
140.9962,104.1457
141.0504,104.2268
141.1315,104.2810
141.2272,104.3000
142.0522,104.3000
142.1479,104.2810
142.2290,104.2268
142.2832,104.1457
142.3022,104.0500
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 145.4272,102.7500
145.4082,102.6543
145.3540,102.5732
145.2729,102.5190
145.1772,102.5000
144.3522,102.5000
144.2565,102.5190
144.1754,102.5732
144.1212,102.6543
144.1022,102.7500
144.1022,104.0500
144.1212,104.1457
144.1754,104.2268
144.2565,104.2810
144.3522,104.3000
145.1772,104.3000
145.2729,104.2810
145.3540,104.2268
145.4082,104.1457
145.4272,104.0500
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 148.1522,111.9125
148.2096,111.9011
148.2583,111.8686
148.2908,111.8199
148.3022,111.7625
148.3022,110.3875
148.2908,110.3301
148.2583,110.2814
148.2096,110.2489
148.1522,110.2375
147.8522,110.2375
147.7948,110.2489
147.7461,110.2814
147.7136,110.3301
147.7022,110.3875
147.7022,111.7625
147.7136,111.8199
147.7461,111.8686
147.7948,111.9011
147.8522,111.9125
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 147.1522,111.9125
147.2096,111.9011
147.2583,111.8686
147.2908,111.8199
147.3022,111.7625
147.3022,110.3875
147.2908,110.3301
147.2583,110.2814
147.2096,110.2489
147.1522,110.2375
146.8522,110.2375
146.7948,110.2489
146.7461,110.2814
146.7136,110.3301
146.7022,110.3875
146.7022,111.7625
146.7136,111.8199
146.7461,111.8686
146.7948,111.9011
146.8522,111.9125
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 146.1522,111.9125
146.2096,111.9011
146.2583,111.8686
146.2908,111.8199
146.3022,111.7625
146.3022,110.3875
146.2908,110.3301
146.2583,110.2814
146.2096,110.2489
146.1522,110.2375
145.8522,110.2375
145.7948,110.2489
145.7461,110.2814
145.7136,110.3301
145.7022,110.3875
145.7022,111.7625
145.7136,111.8199
145.7461,111.8686
145.7948,111.9011
145.8522,111.9125
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 145.1522,111.9125
145.2096,111.9011
145.2583,111.8686
145.2908,111.8199
145.3022,111.7625
145.3022,110.3875
145.2908,110.3301
145.2583,110.2814
145.2096,110.2489
145.1522,110.2375
144.8522,110.2375
144.7948,110.2489
144.7461,110.2814
144.7136,110.3301
144.7022,110.3875
144.7022,111.7625
144.7136,111.8199
144.7461,111.8686
144.7948,111.9011
144.8522,111.9125
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 144.1522,111.9125
144.2096,111.9011
144.2583,111.8686
144.2908,111.8199
144.3022,111.7625
144.3022,110.3875
144.2908,110.3301
144.2583,110.2814
144.2096,110.2489
144.1522,110.2375
143.8522,110.2375
143.7948,110.2489
143.7461,110.2814
143.7136,110.3301
143.7022,110.3875
143.7022,111.7625
143.7136,111.8199
143.7461,111.8686
143.7948,111.9011
143.8522,111.9125
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 144.1522,106.6375
144.2096,106.6261
144.2583,106.5936
144.2908,106.5449
144.3022,106.4875
144.3022,105.1125
144.2908,105.0551
144.2583,105.0064
144.2096,104.9739
144.1522,104.9625
143.8522,104.9625
143.7948,104.9739
143.7461,105.0064
143.7136,105.0551
143.7022,105.1125
143.7022,106.4875
143.7136,106.5449
143.7461,106.5936
143.7948,106.6261
143.8522,106.6375
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 145.1522,106.6375
145.2096,106.6261
145.2583,106.5936
145.2908,106.5449
145.3022,106.4875
145.3022,105.1125
145.2908,105.0551
145.2583,105.0064
145.2096,104.9739
145.1522,104.9625
144.8522,104.9625
144.7948,104.9739
144.7461,105.0064
144.7136,105.0551
144.7022,105.1125
144.7022,106.4875
144.7136,106.5449
144.7461,106.5936
144.7948,106.6261
144.8522,106.6375
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 146.1522,106.6375
146.2096,106.6261
146.2583,106.5936
146.2908,106.5449
146.3022,106.4875
146.3022,105.1125
146.2908,105.0551
146.2583,105.0064
146.2096,104.9739
146.1522,104.9625
145.8522,104.9625
145.7948,104.9739
145.7461,105.0064
145.7136,105.0551
145.7022,105.1125
145.7022,106.4875
145.7136,106.5449
145.7461,106.5936
145.7948,106.6261
145.8522,106.6375
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 147.1522,106.6375
147.2096,106.6261
147.2583,106.5936
147.2908,106.5449
147.3022,106.4875
147.3022,105.1125
147.2908,105.0551
147.2583,105.0064
147.2096,104.9739
147.1522,104.9625
146.8522,104.9625
146.7948,104.9739
146.7461,105.0064
146.7136,105.0551
146.7022,105.1125
146.7022,106.4875
146.7136,106.5449
146.7461,106.5936
146.7948,106.6261
146.8522,106.6375
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 148.1522,106.6375
148.2096,106.6261
148.2583,106.5936
148.2908,106.5449
148.3022,106.4875
148.3022,105.1125
148.2908,105.0551
148.2583,105.0064
148.2096,104.9739
148.1522,104.9625
147.8522,104.9625
147.7948,104.9739
147.7461,105.0064
147.7136,105.0551
147.7022,105.1125
147.7022,106.4875
147.7136,106.5449
147.7461,106.5936
147.7948,106.6261
147.8522,106.6375
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 144.3522,109.4875
147.6522,109.4875
147.6522,107.3875
144.3522,107.3875
Z" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 139.9522,105.6050
139.9522,107.3050
141.6522,107.3050
141.6522,105.6050
Z" />
</g>
<g style="fill:#000000; fill-opacity:1.0000; stroke:none;">
<circle cx="140.8022" cy="108.9950" r="0.8500" />
<path style="fill:#000000; fill-opacity:1.0000; stroke:none;fill-rule:evenodd;"
d="M 152.6522,103.0700
152.6522,104.7700
154.3522,104.7700
154.3522,103.0700
Z" />
</g>
<g style="fill:#000000; fill-opacity:1.0000; stroke:none;">
<circle cx="153.5022" cy="106.4600" r="0.8500" />
</g>
<g style="fill:#000000; fill-opacity:1.0000; stroke:none;">
<circle cx="153.5022" cy="109.0000" r="0.8500" />
</g>
<g style="fill:#000000; fill-opacity:1.0000; stroke:none;">
<circle cx="153.5022" cy="111.5400" r="0.8500" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.4000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M139.2022 112.3000
L140.2022 113.3000
" />
<path d="M140.2022 113.3000
L147.3022 113.3000
" />
<path d="M148.0022 112.6000
L148.0022 111.0750
" />
<path d="M139.2022 107.2000
L139.2022 112.3000
" />
<path d="M147.3022 113.3000
L148.0022 112.6000
" />
<path d="M139.9472 106.4550
L139.2022 107.2000
" />
<path d="M140.8022 106.4550
L139.9472 106.4550
" />
<path d="M146.0022 111.0750
L146.0022 108.4375
" />
<path d="M146.6022 102.8000
L146.0022 103.4000
" />
<path d="M146.0022 103.4000
L144.7647 103.4000
" />
<path d="M146.9022 103.5000
L146.0022 104.4000
" />
<path d="M146.0022 104.4000
L146.0022 105.8000
" />
<path d="M150.5422 103.5000
L146.9022 103.5000
" />
<path d="M153.5022 106.4600
L150.5422 103.5000
" />
<path d="M152.3222 103.9200
L151.2022 102.8000
" />
<path d="M151.2022 102.8000
L146.6022 102.8000
" />
<path d="M153.5022 103.9200
L152.3222 103.9200
" />
<path d="M147.2022 104.2000
L147.0022 104.4000
" />
<path d="M147.0022 104.4000
L147.0022 105.8000
" />
<path d="M149.8022 104.2000
L147.2022 104.2000
" />
<path d="M151.8022 107.3000
L151.8022 106.2000
" />
<path d="M153.5022 109.0000
L151.8022 107.3000
" />
<path d="M151.8022 106.2000
L149.8022 104.2000
" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.6000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M142.8022 105.0000
L141.6397 103.8375
" />
<path d="M144.2397 108.4375
L142.8022 107.0000
" />
<path d="M142.8022 107.0000
L142.8022 105.0000
" />
<path d="M146.0022 108.4375
L144.2397 108.4375
" />
<path d="M141.6397 103.8375
L141.6397 103.4000
" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.4000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M147.0022 111.8000
L146.2022 112.6000
" />
<path d="M147.0022 111.0750
L147.0022 111.8000
" />
<path d="M146.2022 112.6000
L141.2022 112.6000
" />
<path d="M145.0022 103.6375
L144.7647 103.4000
" />
<path d="M145.0022 105.8000
L145.0022 103.6375
" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.6000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M148.0772 108.4375
L146.0022 108.4375
" />
<path d="M150.2022 110.5625
L148.0772 108.4375
" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.4000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M148.4022 105.8000
L148.0022 105.8000
" />
<path d="M150.0397 107.4375
L148.4022 105.8000
" />
<path d="M150.2022 107.4375
L150.0397 107.4375
" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.6000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M150.7647 110.5625
L150.2022 110.5625
" />
<path d="M151.7422 111.5400
L150.7647 110.5625
" />
<path d="M153.5022 111.5400
L151.7422 111.5400
" />
</g>
<g style="fill:none;
stroke:#000000; stroke-width:0.4000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M140.8022 112.2000
L141.2022 112.6000
" />
<path d="M140.8022 108.9950
L140.8022 112.2000
" />
<path style="fill:none;
stroke:#000000; stroke-width:0.2000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;fill:none"
d="M 155.9022,101.8000
138.3022,101.8000
138.3022,114.0000
155.9022,114.0000
Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

1
hardware/fp-info-cache Executable file
View File

@ -0,0 +1 @@
0

BIN
hardware/lut.pdf Executable file

Binary file not shown.

766
hardware/lut.svg Executable file
View File

@ -0,0 +1,766 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
sodipodi:docname="lut.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="2.0485264"
inkscape:cx="152.3046"
inkscape:cy="80.301624"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1"><g
id="g1"
transform="rotate(90,126.16821,9.833668)"><g
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g16"><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,108.1 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,111.225 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path2" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 142.3022,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path3" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.4272,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path4" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path5" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path6" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path7" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path10" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path11" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path12" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path13" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path14" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.3522,109.4875 h 3.3 v -2.1 h -3.3 z"
id="path15" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 139.9522,105.605 v 1.7 h 1.7 v -1.7 z"
id="path16" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g17"><circle
cx="140.8022"
cy="108.995"
r="0.85000002"
id="circle16" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 152.6522,103.07 v 1.7 h 1.7 v -1.7 z"
id="path17" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g18"><circle
cx="153.5022"
cy="106.46"
r="0.85000002"
id="circle17" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g19"><circle
cx="153.5022"
cy="109"
r="0.85000002"
id="circle18" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g20"><circle
cx="153.5022"
cy="111.54"
r="0.85000002"
id="circle19" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g42"><path
d="m 139.2022,112.3 1,1"
id="path20" /><path
d="m 140.2022,113.3 h 7.1"
id="path21" /><path
d="m 148.0022,112.6 v -1.525"
id="path22" /><path
d="m 139.2022,107.2 v 5.1"
id="path23" /><path
d="m 147.3022,113.3 0.7,-0.7"
id="path24" /><path
d="m 139.9472,106.455 -0.745,0.745"
id="path25" /><path
d="m 140.8022,106.455 h -0.855"
id="path26" /><path
d="m 146.0022,111.075 v -2.6375"
id="path27" /><path
d="m 146.6022,102.8 -0.6,0.6"
id="path28" /><path
d="m 146.0022,103.4 h -1.2375"
id="path29" /><path
d="m 146.9022,103.5 -0.9,0.9"
id="path30" /><path
d="m 146.0022,104.4 v 1.4"
id="path31" /><path
d="m 150.5422,103.5 h -3.64"
id="path32" /><path
d="m 153.5022,106.46 -2.96,-2.96"
id="path33" /><path
d="m 152.3222,103.92 -1.12,-1.12"
id="path34" /><path
d="m 151.2022,102.8 h -4.6"
id="path35" /><path
d="m 153.5022,103.92 h -1.18"
id="path36" /><path
d="m 147.2022,104.2 -0.2,0.2"
id="path37" /><path
d="m 147.0022,104.4 v 1.4"
id="path38" /><path
d="m 149.8022,104.2 h -2.6"
id="path39" /><path
d="m 151.8022,107.3 v -1.1"
id="path40" /><path
d="m 153.5022,109 -1.7,-1.7"
id="path41" /><path
d="m 151.8022,106.2 -2,-2"
id="path42" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g47"><path
d="m 142.8022,105 -1.1625,-1.1625"
id="path43" /><path
d="M 144.2397,108.4375 142.8022,107"
id="path44" /><path
d="m 142.8022,107 v -2"
id="path45" /><path
d="m 146.0022,108.4375 h -1.7625"
id="path46" /><path
d="M 141.6397,103.8375 V 103.4"
id="path47" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g52"><path
d="m 147.0022,111.8 -0.8,0.8"
id="path48" /><path
d="M 147.0022,111.075 V 111.8"
id="path49" /><path
d="m 146.2022,112.6 h -5"
id="path50" /><path
d="M 145.0022,103.6375 144.7647,103.4"
id="path51" /><path
d="m 145.0022,105.8 v -2.1625"
id="path52" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g54"><path
d="m 148.0772,108.4375 h -2.075"
id="path53" /><path
d="m 150.2022,110.5625 -2.125,-2.125"
id="path54" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g57"><path
d="m 148.4022,105.8 h -0.4"
id="path55" /><path
d="M 150.0397,107.4375 148.4022,105.8"
id="path56" /><path
d="m 150.2022,107.4375 h -0.1625"
id="path57" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g60"><path
d="m 150.7647,110.5625 h -0.5625"
id="path58" /><path
d="m 151.7422,111.54 -0.9775,-0.9775"
id="path59" /><path
d="m 153.5022,111.54 h -1.76"
id="path60" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g63"><path
d="m 140.8022,112.2 0.4,0.4"
id="path61" /><path
d="M 140.8022,108.995 V 112.2"
id="path62" /><path
style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 155.9022,101.8 h -17.6 V 114 h 17.6 z"
id="path63" /></g></g><g
id="g2"
transform="rotate(90,133.24047,16.942269)"><g
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g16-6"><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,108.1 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path1-9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,111.225 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path2-5" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 142.3022,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path3-2" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.4272,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path4-1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path5-2" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path6-1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path7-9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path8-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path9-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path10-1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path11-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path12-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path13-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path14-5" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.3522,109.4875 h 3.3 v -2.1 h -3.3 z"
id="path15-6" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 139.9522,105.605 v 1.7 h 1.7 v -1.7 z"
id="path16-9" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g17-7"><circle
cx="140.8022"
cy="108.995"
r="0.85000002"
id="circle16-6" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 152.6522,103.07 v 1.7 h 1.7 v -1.7 z"
id="path17-0" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g18-7"><circle
cx="153.5022"
cy="106.46"
r="0.85000002"
id="circle17-5" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g19-0"><circle
cx="153.5022"
cy="109"
r="0.85000002"
id="circle18-4" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g20-9"><circle
cx="153.5022"
cy="111.54"
r="0.85000002"
id="circle19-7" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g42-7"><path
d="m 139.2022,112.3 1,1"
id="path20-3" /><path
d="m 140.2022,113.3 h 7.1"
id="path21-2" /><path
d="m 148.0022,112.6 v -1.525"
id="path22-3" /><path
d="m 139.2022,107.2 v 5.1"
id="path23-1" /><path
d="m 147.3022,113.3 0.7,-0.7"
id="path24-8" /><path
d="m 139.9472,106.455 -0.745,0.745"
id="path25-8" /><path
d="m 140.8022,106.455 h -0.855"
id="path26-9" /><path
d="m 146.0022,111.075 v -2.6375"
id="path27-1" /><path
d="m 146.6022,102.8 -0.6,0.6"
id="path28-1" /><path
d="m 146.0022,103.4 h -1.2375"
id="path29-7" /><path
d="m 146.9022,103.5 -0.9,0.9"
id="path30-8" /><path
d="m 146.0022,104.4 v 1.4"
id="path31-4" /><path
d="m 150.5422,103.5 h -3.64"
id="path32-0" /><path
d="m 153.5022,106.46 -2.96,-2.96"
id="path33-7" /><path
d="m 152.3222,103.92 -1.12,-1.12"
id="path34-0" /><path
d="m 151.2022,102.8 h -4.6"
id="path35-2" /><path
d="m 153.5022,103.92 h -1.18"
id="path36-9" /><path
d="m 147.2022,104.2 -0.2,0.2"
id="path37-5" /><path
d="m 147.0022,104.4 v 1.4"
id="path38-7" /><path
d="m 149.8022,104.2 h -2.6"
id="path39-8" /><path
d="m 151.8022,107.3 v -1.1"
id="path40-9" /><path
d="m 153.5022,109 -1.7,-1.7"
id="path41-0" /><path
d="m 151.8022,106.2 -2,-2"
id="path42-4" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g47-5"><path
d="m 142.8022,105 -1.1625,-1.1625"
id="path43-3" /><path
d="M 144.2397,108.4375 142.8022,107"
id="path44-6" /><path
d="m 142.8022,107 v -2"
id="path45-6" /><path
d="m 146.0022,108.4375 h -1.7625"
id="path46-4" /><path
d="M 141.6397,103.8375 V 103.4"
id="path47-8" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g52-9"><path
d="m 147.0022,111.8 -0.8,0.8"
id="path48-9" /><path
d="M 147.0022,111.075 V 111.8"
id="path49-3" /><path
d="m 146.2022,112.6 h -5"
id="path50-6" /><path
d="M 145.0022,103.6375 144.7647,103.4"
id="path51-6" /><path
d="m 145.0022,105.8 v -2.1625"
id="path52-9" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g54-6"><path
d="m 148.0772,108.4375 h -2.075"
id="path53-6" /><path
d="m 150.2022,110.5625 -2.125,-2.125"
id="path54-6" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g57-0"><path
d="m 148.4022,105.8 h -0.4"
id="path55-5" /><path
d="M 150.0397,107.4375 148.4022,105.8"
id="path56-8" /><path
d="m 150.2022,107.4375 h -0.1625"
id="path57-9" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g60-3"><path
d="m 150.7647,110.5625 h -0.5625"
id="path58-0" /><path
d="m 151.7422,111.54 -0.9775,-0.9775"
id="path59-5" /><path
d="m 153.5022,111.54 h -1.76"
id="path60-7" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g63-9"><path
d="m 140.8022,112.2 0.4,0.4"
id="path61-2" /><path
d="M 140.8022,108.995 V 112.2"
id="path62-7" /><path
style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 155.9022,101.8 h -17.6 V 114 h 17.6 z"
id="path63-1" /></g></g><g
id="g2-5"
transform="rotate(90,140.25528,23.982598)"><g
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g16-6-0"><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,108.1 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path1-9-9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,111.225 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path2-5-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 142.3022,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path3-2-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.4272,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path4-1-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path5-2-5" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path6-1-1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path7-9-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path8-0-3" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path9-8-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path10-1-7" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path11-8-7" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path12-0-9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path13-0-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path14-5-2" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.3522,109.4875 h 3.3 v -2.1 h -3.3 z"
id="path15-6-8" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 139.9522,105.605 v 1.7 h 1.7 v -1.7 z"
id="path16-9-6" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g17-7-0"><circle
cx="140.8022"
cy="108.995"
r="0.85000002"
id="circle16-6-3" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 152.6522,103.07 v 1.7 h 1.7 v -1.7 z"
id="path17-0-0" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g18-7-9"><circle
cx="153.5022"
cy="106.46"
r="0.85000002"
id="circle17-5-8" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g19-0-7"><circle
cx="153.5022"
cy="109"
r="0.85000002"
id="circle18-4-0" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g20-9-7"><circle
cx="153.5022"
cy="111.54"
r="0.85000002"
id="circle19-7-5" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g42-7-2"><path
d="m 139.2022,112.3 1,1"
id="path20-3-2" /><path
d="m 140.2022,113.3 h 7.1"
id="path21-2-8" /><path
d="m 148.0022,112.6 v -1.525"
id="path22-3-2" /><path
d="m 139.2022,107.2 v 5.1"
id="path23-1-6" /><path
d="m 147.3022,113.3 0.7,-0.7"
id="path24-8-7" /><path
d="m 139.9472,106.455 -0.745,0.745"
id="path25-8-5" /><path
d="m 140.8022,106.455 h -0.855"
id="path26-9-9" /><path
d="m 146.0022,111.075 v -2.6375"
id="path27-1-4" /><path
d="m 146.6022,102.8 -0.6,0.6"
id="path28-1-7" /><path
d="m 146.0022,103.4 h -1.2375"
id="path29-7-4" /><path
d="m 146.9022,103.5 -0.9,0.9"
id="path30-8-5" /><path
d="m 146.0022,104.4 v 1.4"
id="path31-4-3" /><path
d="m 150.5422,103.5 h -3.64"
id="path32-0-1" /><path
d="m 153.5022,106.46 -2.96,-2.96"
id="path33-7-3" /><path
d="m 152.3222,103.92 -1.12,-1.12"
id="path34-0-2" /><path
d="m 151.2022,102.8 h -4.6"
id="path35-2-7" /><path
d="m 153.5022,103.92 h -1.18"
id="path36-9-2" /><path
d="m 147.2022,104.2 -0.2,0.2"
id="path37-5-6" /><path
d="m 147.0022,104.4 v 1.4"
id="path38-7-3" /><path
d="m 149.8022,104.2 h -2.6"
id="path39-8-4" /><path
d="m 151.8022,107.3 v -1.1"
id="path40-9-0" /><path
d="m 153.5022,109 -1.7,-1.7"
id="path41-0-8" /><path
d="m 151.8022,106.2 -2,-2"
id="path42-4-2" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g47-5-6"><path
d="m 142.8022,105 -1.1625,-1.1625"
id="path43-3-8" /><path
d="M 144.2397,108.4375 142.8022,107"
id="path44-6-9" /><path
d="m 142.8022,107 v -2"
id="path45-6-1" /><path
d="m 146.0022,108.4375 h -1.7625"
id="path46-4-3" /><path
d="M 141.6397,103.8375 V 103.4"
id="path47-8-6" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g52-9-6"><path
d="m 147.0022,111.8 -0.8,0.8"
id="path48-9-3" /><path
d="M 147.0022,111.075 V 111.8"
id="path49-3-6" /><path
d="m 146.2022,112.6 h -5"
id="path50-6-1" /><path
d="M 145.0022,103.6375 144.7647,103.4"
id="path51-6-7" /><path
d="m 145.0022,105.8 v -2.1625"
id="path52-9-2" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g54-6-0"><path
d="m 148.0772,108.4375 h -2.075"
id="path53-6-8" /><path
d="m 150.2022,110.5625 -2.125,-2.125"
id="path54-6-0" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g57-0-6"><path
d="m 148.4022,105.8 h -0.4"
id="path55-5-0" /><path
d="M 150.0397,107.4375 148.4022,105.8"
id="path56-8-4" /><path
d="m 150.2022,107.4375 h -0.1625"
id="path57-9-9" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g60-3-3"><path
d="m 150.7647,110.5625 h -0.5625"
id="path58-0-2" /><path
d="m 151.7422,111.54 -0.9775,-0.9775"
id="path59-5-2" /><path
d="m 153.5022,111.54 h -1.76"
id="path60-7-4" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g63-9-9"><path
d="m 140.8022,112.2 0.4,0.4"
id="path61-2-6" /><path
d="M 140.8022,108.995 V 112.2"
id="path62-7-7" /><path
style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 155.9022,101.8 h -17.6 V 114 h 17.6 z"
id="path63-1-4" /></g></g><g
id="g2-8"
transform="rotate(90,147.19515,30.903231)"><g
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g16-6-9"><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,108.1 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path1-9-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 150.8522,111.225 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 v -0.825 l -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -1.3 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 0.825 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 z"
id="path2-5-6" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 142.3022,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path3-2-2" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.4272,102.75 -0.019,-0.0957 -0.0542,-0.0811 -0.0811,-0.0542 -0.0957,-0.019 h -0.825 l -0.0957,0.019 -0.0811,0.0542 -0.0542,0.0811 -0.019,0.0957 v 1.3 l 0.019,0.0957 0.0542,0.0811 0.0811,0.0542 0.0957,0.019 h 0.825 l 0.0957,-0.019 0.0811,-0.0542 0.0542,-0.0811 0.019,-0.0957 z"
id="path4-1-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path5-2-9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path6-1-2" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path7-9-6" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path8-0-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,111.9125 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path9-8-5" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path10-1-5" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 145.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path11-8-9" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 146.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path12-0-1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 147.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path13-0-4" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 148.1522,106.6375 0.0574,-0.0114 0.0487,-0.0325 0.0325,-0.0487 0.0114,-0.0574 v -1.375 l -0.0114,-0.0574 -0.0325,-0.0487 -0.0487,-0.0325 -0.0574,-0.0114 h -0.3 l -0.0574,0.0114 -0.0487,0.0325 -0.0325,0.0487 -0.0114,0.0574 v 1.375 l 0.0114,0.0574 0.0325,0.0487 0.0487,0.0325 0.0574,0.0114 z"
id="path14-5-1" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 144.3522,109.4875 h 3.3 v -2.1 h -3.3 z"
id="path15-6-82" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 139.9522,105.605 v 1.7 h 1.7 v -1.7 z"
id="path16-9-9" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g17-7-3"><circle
cx="140.8022"
cy="108.995"
r="0.85000002"
id="circle16-6-0" /><path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 152.6522,103.07 v 1.7 h 1.7 v -1.7 z"
id="path17-0-4" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g18-7-5"><circle
cx="153.5022"
cy="106.46"
r="0.85000002"
id="circle17-5-86" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g19-0-8"><circle
cx="153.5022"
cy="109"
r="0.85000002"
id="circle18-4-5" /></g><g
style="fill:#000000;fill-opacity:1;stroke:none"
id="g20-9-3"><circle
cx="153.5022"
cy="111.54"
r="0.85000002"
id="circle19-7-4" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g42-7-0"><path
d="m 139.2022,112.3 1,1"
id="path20-3-1" /><path
d="m 140.2022,113.3 h 7.1"
id="path21-2-7" /><path
d="m 148.0022,112.6 v -1.525"
id="path22-3-1" /><path
d="m 139.2022,107.2 v 5.1"
id="path23-1-4" /><path
d="m 147.3022,113.3 0.7,-0.7"
id="path24-8-9" /><path
d="m 139.9472,106.455 -0.745,0.745"
id="path25-8-6" /><path
d="m 140.8022,106.455 h -0.855"
id="path26-9-7" /><path
d="m 146.0022,111.075 v -2.6375"
id="path27-1-8" /><path
d="m 146.6022,102.8 -0.6,0.6"
id="path28-1-2" /><path
d="m 146.0022,103.4 h -1.2375"
id="path29-7-6" /><path
d="m 146.9022,103.5 -0.9,0.9"
id="path30-8-55" /><path
d="m 146.0022,104.4 v 1.4"
id="path31-4-0" /><path
d="m 150.5422,103.5 h -3.64"
id="path32-0-2" /><path
d="m 153.5022,106.46 -2.96,-2.96"
id="path33-7-5" /><path
d="m 152.3222,103.92 -1.12,-1.12"
id="path34-0-1" /><path
d="m 151.2022,102.8 h -4.6"
id="path35-2-74" /><path
d="m 153.5022,103.92 h -1.18"
id="path36-9-3" /><path
d="m 147.2022,104.2 -0.2,0.2"
id="path37-5-2" /><path
d="m 147.0022,104.4 v 1.4"
id="path38-7-2" /><path
d="m 149.8022,104.2 h -2.6"
id="path39-8-0" /><path
d="m 151.8022,107.3 v -1.1"
id="path40-9-4" /><path
d="m 153.5022,109 -1.7,-1.7"
id="path41-0-9" /><path
d="m 151.8022,106.2 -2,-2"
id="path42-4-6" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g47-5-9"><path
d="m 142.8022,105 -1.1625,-1.1625"
id="path43-3-1" /><path
d="M 144.2397,108.4375 142.8022,107"
id="path44-6-4" /><path
d="m 142.8022,107 v -2"
id="path45-6-9" /><path
d="m 146.0022,108.4375 h -1.7625"
id="path46-4-4" /><path
d="M 141.6397,103.8375 V 103.4"
id="path47-8-2" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g52-9-9"><path
d="m 147.0022,111.8 -0.8,0.8"
id="path48-9-4" /><path
d="M 147.0022,111.075 V 111.8"
id="path49-3-3" /><path
d="m 146.2022,112.6 h -5"
id="path50-6-5" /><path
d="M 145.0022,103.6375 144.7647,103.4"
id="path51-6-8" /><path
d="m 145.0022,105.8 v -2.1625"
id="path52-9-4" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g54-6-2"><path
d="m 148.0772,108.4375 h -2.075"
id="path53-6-4" /><path
d="m 150.2022,110.5625 -2.125,-2.125"
id="path54-6-7" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g57-0-3"><path
d="m 148.4022,105.8 h -0.4"
id="path55-5-2" /><path
d="M 150.0397,107.4375 148.4022,105.8"
id="path56-8-8" /><path
d="m 150.2022,107.4375 h -0.1625"
id="path57-9-4" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g60-3-7"><path
d="m 150.7647,110.5625 h -0.5625"
id="path58-0-0" /><path
d="m 151.7422,111.54 -0.9775,-0.9775"
id="path59-5-5" /><path
d="m 153.5022,111.54 h -1.76"
id="path60-7-9" /></g><g
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="g63-9-7"><path
d="m 140.8022,112.2 0.4,0.4"
id="path61-2-0" /><path
d="M 140.8022,108.995 V 112.2"
id="path62-7-3" /><path
style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 155.9022,101.8 h -17.6 V 114 h 17.6 z"
id="path63-1-1" /></g></g></g></svg>

After

Width:  |  Height:  |  Size: 47 KiB

5
hardware/sym-lib-table Executable file
View File

@ -0,0 +1,5 @@
(sym_lib_table
(version 7)
(lib (name "IP2326-BMS-2S-3S")(type "KiCad")(uri "${KIPRJMOD}/IP2326-BMS-2S-3S.kicad_sym")(options "")(descr ""))
(lib (name "Power")(type "KiCad")(uri "${KIPRJMOD}/Power.kicad_sym")(options "")(descr ""))
)