Repo re-org
6
hardware/fw/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
*.expand
|
||||
*.map
|
||||
*.lst
|
||||
*.hex
|
||||
*.elf
|
||||
*.bin
|
||||
111
hardware/fw/Makefile
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
# Megumin LED display firmware
|
||||
# Copyright (C) 2018 Sebastian Götte <code@jaseg.net>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
CUBE_PATH ?= $(wildcard ~)/resource/STM32CubeF0
|
||||
CMSIS_PATH ?= $(CUBE_PATH)/Drivers/CMSIS
|
||||
CMSIS_DEV_PATH ?= $(CMSIS_PATH)/Device/ST/STM32F0xx
|
||||
HAL_PATH ?= $(CUBE_PATH)/Drivers/STM32F0xx_HAL_Driver
|
||||
|
||||
MAC_ADDR ?= 0xdeadbeef
|
||||
|
||||
CC := arm-none-eabi-gcc
|
||||
LD := arm-none-eabi-ld
|
||||
OBJCOPY := arm-none-eabi-objcopy
|
||||
OBJDUMP := arm-none-eabi-objdump
|
||||
SIZE := arm-none-eabi-size
|
||||
|
||||
CFLAGS = -g -Wall -Wextra -std=gnu11 -O0 -fdump-rtl-expand
|
||||
CFLAGS += -mlittle-endian -mcpu=cortex-m0 -march=armv6-m -mthumb
|
||||
#CFLAGS += -ffunction-sections -fdata-sections
|
||||
LDFLAGS = -nostartfiles
|
||||
#LDFLAGS += -specs=rdimon.specs -DSEMIHOSTING
|
||||
LDFLAGS += -Wl,-Map=main.map -nostdlib
|
||||
#LDFLAGS += -Wl,--gc-sections
|
||||
LIBS = -lgcc
|
||||
#LIBS += -lrdimon
|
||||
|
||||
# Technically we're using an STM32F030F4, but apart from the TSSOP20 package that one is largely identical to the
|
||||
# STM32F030*6 and there is no separate device header provided for it, so we're faking a *6 device here. This is
|
||||
# even documented in stm32f0xx.h. Thanks ST!
|
||||
CFLAGS += -DSTM32F030x6 -DHSE_VALUE=19440000
|
||||
|
||||
LDFLAGS += -Tstm32_flash.ld
|
||||
CFLAGS += -I$(CMSIS_DEV_PATH)/Include -I$(CMSIS_PATH)/Include -I$(HAL_PATH)/Inc -Iconfig -Wno-unused -I../common
|
||||
LDFLAGS += -L$(CMSIS_PATH)/Lib/GCC -larm_cortexM0l_math
|
||||
|
||||
###################################################
|
||||
|
||||
.PHONY: program clean
|
||||
|
||||
all: main.elf
|
||||
|
||||
.clang:
|
||||
echo flags = $(CFLAGS) > .clang
|
||||
|
||||
cmsis_exports.c: $(CMSIS_DEV_PATH)/Include/stm32f030x6.h $(CMSIS_PATH)/Include/core_cm0.h
|
||||
python3 tools/gen_cmsis_exports.py $^ > $@
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -c $(CFLAGS) -o $@ $^
|
||||
# $(CC) -E $(CFLAGS) -o $(@:.o=.pp) $^
|
||||
|
||||
%.o: %.s
|
||||
$(CC) -c $(CFLAGS) -o $@ $^
|
||||
# $(CC) -E $(CFLAGS) -o $(@:.o=.pp) $^
|
||||
|
||||
%.dot: %.elf
|
||||
r2 -a arm -qc 'aa;agC' $< 2>/dev/null >$@
|
||||
|
||||
sources.tar.xz: main.c Makefile
|
||||
tar -caf $@ $^
|
||||
|
||||
# don't ask...
|
||||
sources.tar.xz.zip: sources.tar.xz
|
||||
zip $@ $^
|
||||
|
||||
sources.c: sources.tar.xz.zip
|
||||
xxd -i $< | head -n -1 | sed 's/=/__attribute__((section(".source_tarball"))) =/' > $@
|
||||
|
||||
main.elf: main.c adc.c serial.c cobs.c startup_stm32f030x6.s system_stm32f0xx.c $(HAL_PATH)/Src/stm32f0xx_ll_utils.c base.c cmsis_exports.c
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
$(OBJCOPY) -O ihex $@ $(@:.elf=.hex)
|
||||
$(OBJCOPY) -O binary $@ $(@:.elf=.bin)
|
||||
$(OBJDUMP) -St $@ >$(@:.elf=.lst)
|
||||
$(SIZE) $@
|
||||
|
||||
program: main.elf openocd.cfg
|
||||
openocd -f openocd.cfg -c "program $< verify reset exit"
|
||||
|
||||
8b10b_test_encode: 8b10b_test_encode.c 8b10b.c
|
||||
gcc -o $@ $^
|
||||
|
||||
8b10b_test_decode: 8b10b_test_decode.c 8b10b.c
|
||||
gcc -o $@ $^
|
||||
|
||||
protocol_test: protocol.c protocol_test.c
|
||||
gcc -o $@ -O0 -Wall -Wextra -g -I../common $^
|
||||
|
||||
clean:
|
||||
rm -f **.o
|
||||
rm -f main.elf main.hex main.bin main.map main.lst
|
||||
rm -f **.expand
|
||||
rm -f cmsis_exports.c
|
||||
rm -f sources.tar.xz
|
||||
rm -f sources.tar.xz.zip
|
||||
rm -f sources.c
|
||||
rm -f *.dot
|
||||
rm -f protocol_test
|
||||
|
||||
906
hardware/fw/Scope.ipynb
Normal file
136
hardware/fw/adc.c
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
/* Megumin LED display firmware
|
||||
* Copyright (C) 2018 Sebastian Götte <code@jaseg.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "adc.h"
|
||||
#include "serial.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
static struct __attribute__((__packed__)) hl_adc_pkt {
|
||||
struct ll_pkt ll;
|
||||
uint16_t seq;
|
||||
int32_t gps_1pps_period_sysclk;
|
||||
volatile uint16_t data[32];
|
||||
} adc_pkt[2];
|
||||
static uint16_t current_seq = 0;
|
||||
static int current_buf = 0;
|
||||
|
||||
static void adc_dma_init(void);
|
||||
static void adc_dma_launch(void);
|
||||
|
||||
|
||||
/* Mode that can be used for debugging */
|
||||
void adc_init() {
|
||||
adc_dma_init();
|
||||
|
||||
/* Clock from PCLK/4 instead of the internal exclusive high-speed RC oscillator. */
|
||||
ADC1->CFGR2 = (2<<ADC_CFGR2_CKMODE_Pos); /* Use PCLK/4=12MHz */
|
||||
/* Sampling time 239.5 ADC clock cycles -> total conversion time 38.5us*/
|
||||
ADC1->SMPR = (7<<ADC_SMPR_SMP_Pos);
|
||||
|
||||
/* Setup DMA and triggering */
|
||||
/* Trigger from TIM1 TRGO */
|
||||
ADC1->CFGR1 = ADC_CFGR1_DMAEN | ADC_CFGR1_DMACFG | (2<<ADC_CFGR1_EXTEN_Pos) | (1<<ADC_CFGR1_EXTSEL_Pos);
|
||||
ADC1->CHSELR = ADC_CHSELR_CHSEL2;
|
||||
/* Perform self-calibration */
|
||||
ADC1->CR |= ADC_CR_ADCAL;
|
||||
while (ADC1->CR & ADC_CR_ADCAL)
|
||||
;
|
||||
/* Enable conversion */
|
||||
ADC1->CR |= ADC_CR_ADEN;
|
||||
ADC1->CR |= ADC_CR_ADSTART;
|
||||
}
|
||||
|
||||
static void adc_dma_init() {
|
||||
/* Configure DMA 1 Channel 1 to get rid of all the data */
|
||||
DMA1_Channel1->CPAR = (unsigned int)&ADC1->DR;
|
||||
DMA1_Channel1->CCR = (0<<DMA_CCR_PL_Pos);
|
||||
DMA1_Channel1->CCR |=
|
||||
(1<<DMA_CCR_MSIZE_Pos) /* 16 bit */
|
||||
| (1<<DMA_CCR_PSIZE_Pos) /* 16 bit */
|
||||
| DMA_CCR_MINC
|
||||
| DMA_CCR_TCIE; /* Enable transfer complete interrupt. */
|
||||
|
||||
/* triggered on half-transfer and on transfer completion. We use this to send out the ADC data and to trap into GDB. */
|
||||
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
|
||||
NVIC_SetPriority(DMA1_Channel1_IRQn, 2<<5);
|
||||
|
||||
adc_dma_launch();
|
||||
}
|
||||
|
||||
void adc_dma_launch() {
|
||||
DMA1_Channel1->CCR &= ~DMA_CCR_EN; /* Disable channel */
|
||||
current_buf = !current_buf;
|
||||
DMA1_Channel1->CMAR = (unsigned int)&(adc_pkt[current_buf].data);
|
||||
DMA1_Channel1->CNDTR = ARRAY_LEN(adc_pkt[current_buf].data);
|
||||
DMA1_Channel1->CCR |= DMA_CCR_EN; /* Enable channel */
|
||||
}
|
||||
|
||||
void adc_timer_init(int psc, int ivl) {
|
||||
TIM1->BDTR = TIM_BDTR_MOE; /* MOE is needed even though we only "output" a chip-internal signal */
|
||||
TIM1->CCMR2 = (6<<TIM_CCMR2_OC4M_Pos); /* PWM Mode 1 to get a clean trigger signal */
|
||||
TIM1->CCER = TIM_CCER_CC4E; /* Enable capture/compare unit 4 connected to ADC */
|
||||
TIM1->CCR4 = 1; /* Trigger at start of timer cycle */
|
||||
/* Set prescaler and interval */
|
||||
TIM1->PSC = psc-1;
|
||||
TIM1->ARR = ivl-1;
|
||||
/* Preload all values */
|
||||
TIM1->EGR = TIM_EGR_UG;
|
||||
TIM1->CR1 = TIM_CR1_ARPE;
|
||||
/* And... go! */
|
||||
TIM1->CR1 |= TIM_CR1_CEN;
|
||||
}
|
||||
|
||||
/* This acts as a no-op that provides a convenient point to set a breakpoint for the debug scope logic */
|
||||
static void gdb_dump(void) {
|
||||
}
|
||||
|
||||
void DMA1_Channel1_IRQHandler(void) {
|
||||
uint32_t isr = DMA1->ISR;
|
||||
/* Clear the interrupt flag */
|
||||
DMA1->IFCR |= DMA_IFCR_CGIF1;
|
||||
adc_dma_launch();
|
||||
|
||||
gdb_dump();
|
||||
|
||||
adc_pkt[!current_buf].seq = current_seq++;
|
||||
adc_pkt[!current_buf].gps_1pps_period_sysclk = gps_1pps_period_sysclk;
|
||||
/* Ignore return value since we can't do anything here. Overruns are logged in serial.c. */
|
||||
usart_send_packet_nonblocking(&adc_pkt[!current_buf].ll, sizeof(adc_pkt[!current_buf]));
|
||||
|
||||
/*
|
||||
static int debug_buf_pos = 0;
|
||||
if (st->sync) {
|
||||
if (debug_buf_pos < NCH) {
|
||||
debug_buf_pos = NCH;
|
||||
} else {
|
||||
adc_buf[debug_buf_pos++] = symbol;
|
||||
|
||||
if (debug_buf_pos >= sizeof(adc_buf)/sizeof(adc_buf[0])) {
|
||||
debug_buf_pos = 0;
|
||||
st->sync = 0;
|
||||
gdb_dump();
|
||||
for (int i=0; i<sizeof(adc_buf)/sizeof(adc_buf[0]); i++)
|
||||
adc_buf[i] = -255;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
26
hardware/fw/adc.h
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/* Megumin LED display firmware
|
||||
* Copyright (C) 2018 Sebastian Götte <code@jaseg.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ADC_H__
|
||||
#define __ADC_H__
|
||||
|
||||
#include "global.h"
|
||||
|
||||
void adc_init();
|
||||
void adc_timer_init(int psc, int ivl);
|
||||
|
||||
#endif/*__ADC_H__*/
|
||||
25
hardware/fw/base.c
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
int __errno = 0;
|
||||
void *_impure_ptr = NULL;
|
||||
|
||||
void __sinit(void) {
|
||||
}
|
||||
|
||||
void *memset(void *s, int c, size_t n) {
|
||||
char *end = (char *)s + n;
|
||||
for (char *p = (char *)s; p < end; p++)
|
||||
*p = (char)c;
|
||||
return s;
|
||||
}
|
||||
|
||||
size_t strlen(const char *s) {
|
||||
const char *start = s;
|
||||
while (*s++);
|
||||
return s - start - 1;
|
||||
}
|
||||
|
||||
void __assert_func(bool value) {
|
||||
}
|
||||
48
hardware/fw/cmsis_exports.c
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef __GENERATED_CMSIS_HEADER_EXPORTS__
|
||||
#define __GENERATED_CMSIS_HEADER_EXPORTS__
|
||||
|
||||
#include <stm32f030x6.h>
|
||||
|
||||
/* stm32f030x6.h */
|
||||
TIM_TypeDef *tim3 = TIM3;
|
||||
TIM_TypeDef *tim14 = TIM14;
|
||||
RTC_TypeDef *rtc = RTC;
|
||||
WWDG_TypeDef *wwdg = WWDG;
|
||||
IWDG_TypeDef *iwdg = IWDG;
|
||||
I2C_TypeDef *i2c1 = I2C1;
|
||||
PWR_TypeDef *pwr = PWR;
|
||||
SYSCFG_TypeDef *syscfg = SYSCFG;
|
||||
EXTI_TypeDef *exti = EXTI;
|
||||
ADC_TypeDef *adc1 = ADC1;
|
||||
ADC_Common_TypeDef *adc1_common = ADC1_COMMON;
|
||||
ADC_Common_TypeDef *adc = ADC;
|
||||
TIM_TypeDef *tim1 = TIM1;
|
||||
SPI_TypeDef *spi1 = SPI1;
|
||||
USART_TypeDef *usart1 = USART1;
|
||||
TIM_TypeDef *tim16 = TIM16;
|
||||
TIM_TypeDef *tim17 = TIM17;
|
||||
DBGMCU_TypeDef *dbgmcu = DBGMCU;
|
||||
DMA_TypeDef *dma1 = DMA1;
|
||||
DMA_Channel_TypeDef *dma1_channel1 = DMA1_Channel1;
|
||||
DMA_Channel_TypeDef *dma1_channel2 = DMA1_Channel2;
|
||||
DMA_Channel_TypeDef *dma1_channel3 = DMA1_Channel3;
|
||||
DMA_Channel_TypeDef *dma1_channel4 = DMA1_Channel4;
|
||||
DMA_Channel_TypeDef *dma1_channel5 = DMA1_Channel5;
|
||||
FLASH_TypeDef *flash = FLASH;
|
||||
OB_TypeDef *ob = OB;
|
||||
RCC_TypeDef *rcc = RCC;
|
||||
CRC_TypeDef *crc = CRC;
|
||||
GPIO_TypeDef *gpioa = GPIOA;
|
||||
GPIO_TypeDef *gpiob = GPIOB;
|
||||
GPIO_TypeDef *gpioc = GPIOC;
|
||||
GPIO_TypeDef *gpiod = GPIOD;
|
||||
GPIO_TypeDef *gpiof = GPIOF;
|
||||
|
||||
#include <core_cm0.h>
|
||||
|
||||
/* core_cm0.h */
|
||||
SCB_Type *scb = SCB;
|
||||
SysTick_Type *systick = SysTick;
|
||||
NVIC_Type *nvic = NVIC;
|
||||
|
||||
#endif//__GENERATED_CMSIS_HEADER_EXPORTS__
|
||||
212
hardware/fw/cobs.c
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
|
||||
#include "serial.h"
|
||||
#include "cobs.h"
|
||||
|
||||
int cobs_encode_usart(int (*output)(char), char *src, size_t srclen) {
|
||||
if (srclen > 254)
|
||||
return -1;
|
||||
|
||||
size_t p = 0;
|
||||
while (p <= srclen) {
|
||||
|
||||
char val;
|
||||
if (p != 0 && src[p-1] != 0) {
|
||||
val = src[p-1];
|
||||
|
||||
} else {
|
||||
size_t q = p;
|
||||
while (q < srclen && src[q] != 0)
|
||||
q++;
|
||||
val = (char)q-p+1;
|
||||
}
|
||||
|
||||
int rv = output(val);
|
||||
if (rv)
|
||||
return rv;
|
||||
p++;
|
||||
}
|
||||
|
||||
int rv = output(0);
|
||||
if (rv)
|
||||
return rv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*@ requires \valid(dst + (0..dstlen-1));
|
||||
@ requires \valid_read(src + (0..srclen-1));
|
||||
@ requires \separated(dst + (0..dstlen-1), src + (0..srclen-1));
|
||||
@
|
||||
@ behavior maybe_valid_frame:
|
||||
@ assumes 1 <= srclen <= dstlen <= 65535;
|
||||
@ assumes \exists integer j; j > 0 && \forall integer i; 0 <= i < j ==> src[i] != 0;
|
||||
@ assumes \exists integer i; 0 <= i < srclen && src[i] == 0;
|
||||
@ assigns dst[0..dstlen-1];
|
||||
@ ensures \result >= 0 || \result == -3;
|
||||
@ ensures \result >= 0 ==> src[\result+1] == 0;
|
||||
@ ensures \result >= 0 ==> (\forall integer i; 0 <= i < \result ==> src[i] != 0);
|
||||
@
|
||||
@ behavior invalid_frame:
|
||||
@ assumes 1 <= srclen <= dstlen <= 65535;
|
||||
@ assumes src[0] == 0 || \forall integer i; 0 <= i < srclen ==> src[i] != 0;
|
||||
@ assigns dst[0..dstlen-1];
|
||||
@ ensures \result == -2;
|
||||
@
|
||||
@ behavior invalid_buffers:
|
||||
@ assumes dstlen < 0 || dstlen > 65535
|
||||
@ || srclen < 1 || srclen > 65535
|
||||
@ || dstlen < srclen;
|
||||
@ assigns \nothing;
|
||||
@ ensures \result == -1;
|
||||
@
|
||||
@ complete behaviors;
|
||||
@ disjoint behaviors;
|
||||
@*/
|
||||
ssize_t cobs_decode(char *dst, size_t dstlen, char *src, size_t srclen) {
|
||||
if (dstlen > 65535 || srclen > 65535)
|
||||
return -1;
|
||||
|
||||
if (srclen < 1)
|
||||
return -1;
|
||||
|
||||
if (dstlen < srclen)
|
||||
return -1;
|
||||
|
||||
size_t p = 1;
|
||||
size_t c = (unsigned char)src[0];
|
||||
//@ assert 0 <= c < 256;
|
||||
//@ assert 0 <= c;
|
||||
//@ assert c < 256;
|
||||
if (c == 0)
|
||||
return -2; /* invalid framing. An empty frame would be [...] 00 01 00, not [...] 00 00 */
|
||||
//@ assert c >= 0;
|
||||
//@ assert c != 0;
|
||||
//@ assert c <= 257;
|
||||
//@ assert c > 0;
|
||||
//@ assert c >= 0 && c != 0 ==> c > 0;
|
||||
|
||||
/*@ //loop invariant \forall integer i; 0 <= i <= p ==> (i == srclen || src[i] != 0);
|
||||
@ loop invariant \forall integer i; 1 <= i < p ==> src[i] != 0;
|
||||
@ loop invariant c > 0;
|
||||
@ loop invariant 1 <= p <= srclen <= dstlen <= 65535;
|
||||
@ loop invariant \separated(dst + (0..dstlen-1), src + (0..srclen-1));
|
||||
@ loop invariant \valid_read(src + (0..srclen-1));
|
||||
@ loop invariant \forall integer i; 1 <= i <= srclen ==> \valid(dst + i - 1);
|
||||
@ loop assigns dst[0..dstlen-1], p, c;
|
||||
@ loop variant srclen-p;
|
||||
@*/
|
||||
while (p < srclen && src[p]) {
|
||||
char val;
|
||||
c--;
|
||||
|
||||
//@ assert src[p] != 0;
|
||||
if (c == 0) {
|
||||
c = (unsigned char)src[p];
|
||||
val = 0;
|
||||
} else {
|
||||
val = src[p];
|
||||
}
|
||||
|
||||
//@ assert 0 <= p-1 <= dstlen-1;
|
||||
dst[p-1] = val;
|
||||
p++;
|
||||
}
|
||||
|
||||
if (p == srclen)
|
||||
return -2; /* Invalid framing. The terminating null byte should always be present in the input buffer. */
|
||||
|
||||
if (c != 1)
|
||||
return -3; /* Invalid framing. The skip counter does not hit the end of the frame. */
|
||||
|
||||
//@ assert 0 < p <= srclen <= 65535;
|
||||
//@ assert src[p] == 0;
|
||||
//@ assert \forall integer i; 1 <= i < p ==> src[i] != 0;
|
||||
return p-1;
|
||||
}
|
||||
|
||||
void cobs_decode_incremental_initialize(struct cobs_decode_state *state) {
|
||||
state->p = 0;
|
||||
state->c = 0;
|
||||
}
|
||||
|
||||
int cobs_decode_incremental(struct cobs_decode_state *state, char *dst, size_t dstlen, char src) {
|
||||
if (state->p == 0) {
|
||||
if (src == 0)
|
||||
goto empty_errout; /* invalid framing. An empty frame would be [...] 00 01 00, not [...] 00 00 */
|
||||
state->c = (unsigned char)src;
|
||||
state->p++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!src) {
|
||||
if (state->c != 1)
|
||||
goto errout; /* Invalid framing. The skip counter does not hit the end of the frame. */
|
||||
int rv = state->p-1;
|
||||
cobs_decode_incremental_initialize(state);
|
||||
return rv;
|
||||
}
|
||||
|
||||
char val;
|
||||
state->c--;
|
||||
|
||||
if (state->c == 0) {
|
||||
state->c = (unsigned char)src;
|
||||
val = 0;
|
||||
} else {
|
||||
val = src;
|
||||
}
|
||||
|
||||
size_t pos = state->p-1;
|
||||
if (pos >= dstlen)
|
||||
return -2; /* output buffer too small */
|
||||
dst[pos] = val;
|
||||
state->p++;
|
||||
return 0;
|
||||
|
||||
errout:
|
||||
cobs_decode_incremental_initialize(state);
|
||||
return -1;
|
||||
|
||||
empty_errout:
|
||||
cobs_decode_incremental_initialize(state);
|
||||
return -3;
|
||||
}
|
||||
|
||||
#ifdef VALIDATION
|
||||
/*@
|
||||
@ requires 0 <= d < 256;
|
||||
@ assigns \nothing;
|
||||
@*/
|
||||
size_t test(char foo, unsigned int d) {
|
||||
unsigned int c = (unsigned char)foo;
|
||||
if (c != 0) {
|
||||
//@ assert c < 256;
|
||||
//@ assert c >= 0;
|
||||
//@ assert c != 0;
|
||||
//@ assert c > 0;
|
||||
}
|
||||
if (d != 0) {
|
||||
//@ assert d >= 0;
|
||||
//@ assert d != 0;
|
||||
//@ assert d > 0;
|
||||
}
|
||||
return c + d;
|
||||
}
|
||||
|
||||
#include <__fc_builtin.h>
|
||||
|
||||
void main(void) {
|
||||
char inbuf[254];
|
||||
char cobsbuf[256];
|
||||
char outbuf[256];
|
||||
|
||||
size_t range = Frama_C_interval(0, sizeof(inbuf));
|
||||
Frama_C_make_unknown((char *)inbuf, range);
|
||||
|
||||
cobs_encode(cobsbuf, sizeof(cobsbuf), inbuf, sizeof(inbuf));
|
||||
cobs_decode(outbuf, sizeof(outbuf), cobsbuf, sizeof(cobsbuf));
|
||||
|
||||
//@ assert \forall integer i; 0 <= i < sizeof(inbuf) ==> outbuf[i] == inbuf[i];
|
||||
}
|
||||
#endif//VALIDATION
|
||||
|
||||
23
hardware/fw/cobs.h
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef __COBS_H__
|
||||
#define __COBS_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
struct cobs_decode_state {
|
||||
size_t p;
|
||||
size_t c;
|
||||
};
|
||||
|
||||
|
||||
ssize_t cobs_encode(char *dst, size_t dstlen, char *src, size_t srclen);
|
||||
ssize_t cobs_decode(char *dst, size_t dstlen, char *src, size_t srclen);
|
||||
|
||||
int cobs_encode_usart(int (*output)(char), char *src, size_t srclen);
|
||||
|
||||
void cobs_decode_incremental_initialize(struct cobs_decode_state *state);
|
||||
int cobs_decode_incremental(struct cobs_decode_state *state, char *dst, size_t dstlen, char src);
|
||||
|
||||
#endif//__COBS_H__
|
||||
79
hardware/fw/crctest.py
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
custom_crc_table = {}
|
||||
|
||||
def generate_crc32_table(_poly):
|
||||
|
||||
global custom_crc_table
|
||||
|
||||
for i in range(256):
|
||||
c = i << 24
|
||||
|
||||
for j in range(8):
|
||||
c = (c << 1) ^ _poly if (c & 0x80000000) else c << 1
|
||||
|
||||
custom_crc_table[i] = c & 0xffffffff
|
||||
|
||||
|
||||
def crc32_stm(bytes_arr):
|
||||
|
||||
length = len(bytes_arr)
|
||||
crc = 0xffffffff
|
||||
|
||||
k = 0
|
||||
while length >= 4:
|
||||
|
||||
v = ((bytes_arr[k] << 24) & 0xFF000000) | ((bytes_arr[k+1] << 16) & 0xFF0000) | \
|
||||
((bytes_arr[k+2] << 8) & 0xFF00) | (bytes_arr[k+3] & 0xFF)
|
||||
|
||||
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ v)]
|
||||
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 8))]
|
||||
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 16))]
|
||||
crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 24))]
|
||||
|
||||
k += 4
|
||||
length -= 4
|
||||
|
||||
if length > 0:
|
||||
v = 0
|
||||
|
||||
for i in range(length):
|
||||
v |= (bytes_arr[k+i] << 24-i*8)
|
||||
|
||||
if length == 1:
|
||||
v &= 0xFF000000
|
||||
|
||||
elif length == 2:
|
||||
v &= 0xFFFF0000
|
||||
|
||||
elif length == 3:
|
||||
v &= 0xFFFFFF00
|
||||
|
||||
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v ) )];
|
||||
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 8) )];
|
||||
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 16) )];
|
||||
crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 24) )];
|
||||
|
||||
return crc
|
||||
|
||||
poly = 0x04C11DB7
|
||||
buf = bytes(reversed([1, 2, 3, 4]))
|
||||
|
||||
generate_crc32_table(poly)
|
||||
print(hex(crc32_stm(bytearray(buf))))
|
||||
|
||||
from crccheck import crc
|
||||
import struct
|
||||
|
||||
def rev_bits_in_word(w):
|
||||
return sum( ((w>>i)&1) << (31-i) for i in range(32) )
|
||||
|
||||
import zlib
|
||||
def crc32stm(inbytes):
|
||||
crc32 = crc.Crc32.calc(inbytes)^0xffffffff
|
||||
#crc32 = zlib.crc32(inbytes)^0xffffffff
|
||||
crc32 = rev_bits_in_word(crc32)
|
||||
return crc32
|
||||
|
||||
#data = [0x80,0x40,0xc0,0x20]
|
||||
data = [0x00, 0, 0, 0x80, 0, 0, 0, 0x80]
|
||||
print(hex(crc32stm(bytes(data))))
|
||||
print(hex(zlib.crc32(bytes([0, 0, 0, 1]))^0xffffffff))
|
||||
62
hardware/fw/global.h
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/* Megumin LED display firmware
|
||||
* Copyright (C) 2018 Sebastian Götte <code@jaseg.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GLOBAL_H__
|
||||
#define __GLOBAL_H__
|
||||
|
||||
/* Workaround for sub-par ST libraries */
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#include <stm32f0xx.h>
|
||||
#include <stm32f0xx_ll_utils.h>
|
||||
#include <stm32f0xx_ll_spi.h>
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#include <system_stm32f0xx.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Microcontroller part number: STM32F030F4P6 */
|
||||
|
||||
/* Things used for module status reporting. */
|
||||
#define FIRMWARE_VERSION 1
|
||||
#define HARDWARE_VERSION 0
|
||||
|
||||
#define TS_CAL1 (*(uint16_t *)0x1FFFF7B8)
|
||||
#define VREFINT_CAL (*(uint16_t *)0x1FFFF7BA)
|
||||
|
||||
#define ARRAY_LEN(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
|
||||
|
||||
extern volatile unsigned int sys_time;
|
||||
extern volatile unsigned int sys_time_seconds;
|
||||
|
||||
#define UNUSED(var) ((void)var)
|
||||
|
||||
union leds {
|
||||
struct {
|
||||
unsigned int pps, sd_card, usb, ocxo, error, _nc1, _nc2, _nc3;
|
||||
};
|
||||
unsigned int arr[8];
|
||||
};
|
||||
|
||||
extern volatile union leds leds;
|
||||
extern volatile int32_t gps_1pps_period_sysclk;
|
||||
|
||||
#endif/*__GLOBAL_H__*/
|
||||
3699
hardware/fw/grid_scope.ipynb
Normal file
241
hardware/fw/main.c
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
/* Megumin LED display firmware
|
||||
* Copyright (C) 2018 Sebastian Götte <code@jaseg.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "global.h"
|
||||
#include "adc.h"
|
||||
#include "serial.h"
|
||||
|
||||
|
||||
volatile unsigned int sys_time_seconds = 0;
|
||||
volatile union leds leds;
|
||||
volatile int32_t gps_1pps_period_sysclk = -1;
|
||||
|
||||
int main(void) {
|
||||
/* Get GPIOA and SPI1 up to flash status LEDs */
|
||||
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
|
||||
|
||||
GPIOA->MODER |=
|
||||
(3<<GPIO_MODER_MODER2_Pos) /* PA2 - LINE_MEAS */
|
||||
| (1<<GPIO_MODER_MODER3_Pos) /* PA3 - LED_STB */
|
||||
| (1<<GPIO_MODER_MODER4_Pos) /* PA4 - SD_CS */
|
||||
| (2<<GPIO_MODER_MODER5_Pos) /* PA5 - SCK */
|
||||
| (2<<GPIO_MODER_MODER6_Pos) /* PA6 - MISO */
|
||||
| (2<<GPIO_MODER_MODER7_Pos) /* PA7 - MOSI */
|
||||
| (2<<GPIO_MODER_MODER9_Pos) /* PA9 - HOST_RX */
|
||||
| (2<<GPIO_MODER_MODER10_Pos);/* PA10 - HOST_TX */
|
||||
|
||||
/* Set shift register IO GPIO output speed */
|
||||
GPIOA->OSPEEDR |=
|
||||
(2<<GPIO_OSPEEDR_OSPEEDR3_Pos) /* LED_STB */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR4_Pos) /* SD_CS */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR5_Pos) /* SCK */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR7_Pos) /* MOSI */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR9_Pos); /* HOST_RX */
|
||||
|
||||
GPIOA->AFR[0] = (0<<GPIO_AFRL_AFRL5_Pos) | (0<<GPIO_AFRL_AFRL6_Pos) | (0<<GPIO_AFRL_AFRL7_Pos);
|
||||
GPIOA->AFR[1] = (1<<8) | (1<<4);
|
||||
|
||||
SPI1->CR1 =
|
||||
SPI_CR1_SSM
|
||||
| SPI_CR1_SSI
|
||||
| SPI_CR1_CPOL
|
||||
| SPI_CR1_CPHA
|
||||
| (4<<SPI_CR1_BR_Pos) /* /32 ~1.5MHz */
|
||||
| SPI_CR1_MSTR;
|
||||
SPI1->CR2 = (7<<SPI_CR2_DS_Pos);
|
||||
SPI1->CR1 |= SPI_CR1_SPE;
|
||||
*((volatile uint8_t*)&(SPI1->DR)) = 0xff;
|
||||
|
||||
/* Wait for OCXO to settle */
|
||||
for (int i=0; i<1000000; i++)
|
||||
;
|
||||
|
||||
/* Switch clock to PLL based on OCXO input */
|
||||
RCC->CR |= RCC_CR_HSEBYP;
|
||||
RCC->CR |= RCC_CR_HSEON;
|
||||
RCC->CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk & ~RCC_CFGR_PPRE_Msk & ~RCC_CFGR_HPRE_Msk;
|
||||
/* PLL config: 19.44MHz /2 x5 -> 48.6MHz */
|
||||
RCC->CFGR |= ((5-2)<<RCC_CFGR_PLLMUL_Pos) | RCC_CFGR_PLLSRC_HSE_PREDIV;
|
||||
RCC->CFGR2 = ((2-1)<<RCC_CFGR2_PREDIV_Pos);
|
||||
RCC->CR |= RCC_CR_PLLON;
|
||||
while (!(RCC->CR&RCC_CR_PLLRDY));
|
||||
RCC->CFGR |= (2<<RCC_CFGR_SW_Pos);
|
||||
SystemCoreClockUpdate();
|
||||
|
||||
/* Start systick */
|
||||
SysTick_Config(SystemCoreClock/10); /* 100ms interval */
|
||||
NVIC_EnableIRQ(SysTick_IRQn);
|
||||
NVIC_SetPriority(SysTick_IRQn, 3<<5);
|
||||
|
||||
/* Turn on rest of periphery */
|
||||
RCC->AHBENR |= RCC_AHBENR_DMAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_FLITFEN | RCC_AHBENR_CRCEN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_ADCEN | RCC_APB2ENR_DBGMCUEN |\
|
||||
RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM16EN | RCC_APB2ENR_USART1EN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM14EN;
|
||||
|
||||
GPIOB->MODER |=
|
||||
(2<<GPIO_MODER_MODER1_Pos); /* PB0 - GPS 1pps input */
|
||||
GPIOB->AFR[0] = (0<<GPIO_AFRL_AFRL1_Pos);
|
||||
GPIOB->PUPDR = 2<<GPIO_PUPDR_PUPDR1_Pos;
|
||||
|
||||
/* Configure TIM16 for LED update via SPI */
|
||||
TIM16->CR2 = 0;
|
||||
TIM16->DIER = TIM_DIER_UIE | TIM_DIER_CC1IE;
|
||||
TIM16->CCMR1 = 0;
|
||||
TIM16->CCR1 = 32;
|
||||
TIM16->PSC = 48-1; /* 1us */
|
||||
TIM16->ARR = 1000-1; /* 1ms */
|
||||
TIM16->CR1 = TIM_CR1_CEN;
|
||||
NVIC_EnableIRQ(TIM16_IRQn);
|
||||
|
||||
/* Configure TIM14 for GPS 1pps input capture */
|
||||
TIM14->CCMR1 = (1<<TIM_CCMR1_CC1S_Pos) | (3<<TIM_CCMR1_IC1F_Pos);
|
||||
TIM14->CCER = TIM_CCER_CC1E;
|
||||
TIM14->PSC = 1;
|
||||
TIM14->ARR = 0xffff;
|
||||
TIM14->DIER = TIM_DIER_CC1IE | TIM_DIER_UIE;
|
||||
TIM14->EGR = TIM_EGR_UG;
|
||||
TIM14->CR1 |= TIM_CR1_CEN;
|
||||
NVIC_EnableIRQ(TIM14_IRQn);
|
||||
|
||||
adc_init(1000000);
|
||||
adc_timer_init(243, 200); /* 19.44 MHz / 243 -> 200 kHz; /200 -> 1 kHz */
|
||||
|
||||
usart_dma_init();
|
||||
|
||||
while (42) {
|
||||
/* Do nothing and let the interrupts do all the work. */
|
||||
}
|
||||
}
|
||||
|
||||
void tim14_sr_cc1of(void) {} /* gdb hook */
|
||||
|
||||
void TIM14_IRQHandler(void) {
|
||||
static uint32_t gps_1pps_period = 0;
|
||||
static uint32_t update_inc = 0;
|
||||
static bool in_sync = false;
|
||||
|
||||
uint32_t sr = TIM14->SR;
|
||||
if (sr & TIM_SR_CC1OF) {
|
||||
TIM14->SR &= ~(TIM_SR_CC1IF | TIM_SR_CC1OF);
|
||||
tim14_sr_cc1of();
|
||||
|
||||
}
|
||||
if (sr & TIM_SR_UIF) {
|
||||
TIM14->SR &= ~TIM_SR_UIF;
|
||||
if (in_sync) {
|
||||
gps_1pps_period += update_inc;
|
||||
if (gps_1pps_period > 30000000) { /* Signal out of range */
|
||||
in_sync = false;
|
||||
gps_1pps_period_sysclk = -1;
|
||||
gps_1pps_period = (uint32_t)-1;
|
||||
}
|
||||
}
|
||||
update_inc = 0x10000;
|
||||
}
|
||||
|
||||
if (sr & TIM_SR_CC1IF) { /* CC1 event (GPS 1pps input) */
|
||||
/* Don't reset update event: If update event arrives while CC1 event is being processed leave UIF set to process
|
||||
* update event immediately after return from ISR. */
|
||||
uint16_t ccr = TIM14->CCR1;
|
||||
if (in_sync) {
|
||||
uint32_t new_period = gps_1pps_period + ccr;
|
||||
if (new_period < 20000000 || new_period > 30000000) { /* Signal out of range */
|
||||
in_sync = false;
|
||||
gps_1pps_period_sysclk = -1;
|
||||
gps_1pps_period = (uint32_t)-1;
|
||||
} else {
|
||||
if ((sr & TIM_SR_UIF) /* we processed an update event in this ISR */
|
||||
&& (ccr > 0xc000) /* and the capture happened late in the cycle */
|
||||
) {
|
||||
gps_1pps_period_sysclk = new_period - 0x10000;
|
||||
update_inc = 0x10000;
|
||||
gps_1pps_period = 0x10000 - ccr;
|
||||
} else {
|
||||
gps_1pps_period_sysclk = new_period;
|
||||
update_inc = 0x10000 - ccr; /* remaining cycles in this period */
|
||||
gps_1pps_period = 0;
|
||||
}
|
||||
leds.pps = 200; /* ms */
|
||||
}
|
||||
} else {
|
||||
gps_1pps_period = 0;
|
||||
update_inc = 0x10000 - ccr; /* remaining cycles in this period */
|
||||
in_sync = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void TIM16_IRQHandler(void) {
|
||||
static int leds_update_counter = 0;
|
||||
if (TIM16->SR & TIM_SR_UIF) {
|
||||
TIM16->SR &= ~TIM_SR_UIF;
|
||||
|
||||
uint8_t bits = 0, mask = 1;
|
||||
for (int i=0; i<8; i++) {
|
||||
if (leds.arr[i]) {
|
||||
leds.arr[i]--;
|
||||
bits |= mask;
|
||||
}
|
||||
mask <<= 1;
|
||||
}
|
||||
|
||||
if (leds_update_counter++ == 10) {
|
||||
leds_update_counter = 0;
|
||||
|
||||
/* Workaround for SPI hardware bug: Even if configured to 8-bit mode, the SPI will do a 16-bit transfer if the
|
||||
* data register is accessed through a 16-bit write. Unfortunately, the STMCube register defs define DR as an
|
||||
* uint16_t, so we have to do some magic here to force an 8-bit write. */
|
||||
*((volatile uint8_t*)&(SPI1->DR)) = bits;
|
||||
GPIOA->BRR = 1<<3;
|
||||
}
|
||||
} else {
|
||||
TIM16->SR &= ~TIM_SR_CC1IF;
|
||||
GPIOA->BSRR = 1<<3;
|
||||
}
|
||||
}
|
||||
|
||||
void NMI_Handler(void) {
|
||||
asm volatile ("bkpt");
|
||||
}
|
||||
|
||||
void HardFault_Handler(void) __attribute__((naked));
|
||||
void HardFault_Handler() {
|
||||
asm volatile ("bkpt");
|
||||
}
|
||||
|
||||
void SVC_Handler(void) {
|
||||
asm volatile ("bkpt");
|
||||
}
|
||||
|
||||
|
||||
void PendSV_Handler(void) {
|
||||
asm volatile ("bkpt");
|
||||
}
|
||||
|
||||
void SysTick_Handler(void) {
|
||||
static int n = 0;
|
||||
if (n++ == 10) {
|
||||
n = 0;
|
||||
sys_time_seconds++;
|
||||
if (gps_1pps_period_sysclk < 0)
|
||||
leds.pps = 200; /* ms */
|
||||
}
|
||||
}
|
||||
|
||||
162
hardware/fw/main.c.bak
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
/* Megumin LED display firmware
|
||||
* Copyright (C) 2018 Sebastian Götte <code@jaseg.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "global.h"
|
||||
|
||||
#include "adc.h"
|
||||
|
||||
volatile unsigned int sys_time = 0;
|
||||
volatile unsigned int sys_time_seconds = 0;
|
||||
|
||||
void TIM1_BRK_UP_TRG_COM_Handler() {
|
||||
TIM1->SR &= ~TIM_SR_UIF_Msk;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
RCC->CR |= RCC_CR_HSEON;
|
||||
while (!(RCC->CR&RCC_CR_HSERDY));
|
||||
RCC->CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk & ~RCC_CFGR_PPRE_Msk & ~RCC_CFGR_HPRE_Msk;
|
||||
RCC->CFGR |= ((6-2)<<RCC_CFGR_PLLMUL_Pos) | RCC_CFGR_PLLSRC_HSE_PREDIV; /* PLL x6 -> 48.0MHz */
|
||||
RCC->CR |= RCC_CR_PLLON;
|
||||
while (!(RCC->CR&RCC_CR_PLLRDY));
|
||||
RCC->CFGR |= (2<<RCC_CFGR_SW_Pos);
|
||||
SystemCoreClockUpdate();
|
||||
SysTick_Config(SystemCoreClock/1000); /* 1ms interval */
|
||||
|
||||
/* Turn on lots of neat things */
|
||||
RCC->AHBENR |= RCC_AHBENR_DMAEN | RCC_AHBENR_GPIOAEN | RCC_AHBENR_FLITFEN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_ADCEN| RCC_APB2ENR_DBGMCUEN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM1EN;;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
|
||||
|
||||
GPIOA->MODER |=
|
||||
(3<<GPIO_MODER_MODER0_Pos) /* PA0 - Vmeas_A to ADC */
|
||||
| (3<<GPIO_MODER_MODER1_Pos) /* PA1 - Vmeas_B to ADC */
|
||||
| (1<<GPIO_MODER_MODER2_Pos) /* PA2 - LOAD */
|
||||
| (1<<GPIO_MODER_MODER3_Pos) /* PA3 - CH0 */
|
||||
| (1<<GPIO_MODER_MODER4_Pos) /* PA4 - CH3 */
|
||||
| (0<<GPIO_MODER_MODER5_Pos) /* PA5 - TP1 */
|
||||
| (1<<GPIO_MODER_MODER6_Pos) /* PA6 - CH2 */
|
||||
| (1<<GPIO_MODER_MODER7_Pos) /* PA7 - CH1 */
|
||||
| (0<<GPIO_MODER_MODER9_Pos) /* PA9 - TP2 */
|
||||
| (0<<GPIO_MODER_MODER10_Pos);/* PA10 - TP3 */
|
||||
|
||||
/* Set shift register IO GPIO output speed */
|
||||
GPIOA->OSPEEDR |=
|
||||
(2<<GPIO_OSPEEDR_OSPEEDR2_Pos) /* LOAD */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR3_Pos) /* CH0 */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR4_Pos) /* CH3 */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR6_Pos) /* CH2 */
|
||||
| (2<<GPIO_OSPEEDR_OSPEEDR7_Pos); /* CH1 */
|
||||
|
||||
/* Setup CC1 and CC2. CC2 generates the LED drivers' STROBE, CC1 triggers the IRQ handler */
|
||||
TIM1->BDTR = TIM_BDTR_MOE;
|
||||
TIM1->CCMR2 = (6<<TIM_CCMR2_OC4M_Pos); /* PWM Mode 1 */
|
||||
TIM1->CCER = TIM_CCER_CC4E;
|
||||
TIM1->CCR4 = 1;
|
||||
TIM1->DIER = TIM_DIER_UIE;
|
||||
|
||||
TIM1->PSC = SystemCoreClock/500000 - 1; /* 0.5us/tick */
|
||||
TIM1->ARR = 25-1;
|
||||
/* Preload all values */
|
||||
TIM1->EGR |= TIM_EGR_UG;
|
||||
TIM1->CR1 = TIM_CR1_ARPE;
|
||||
/* And... go! */
|
||||
TIM1->CR1 |= TIM_CR1_CEN;
|
||||
|
||||
void set_outputs(uint8_t val) {
|
||||
int a=!!(val&1), b=!!(val&2), c=!!(val&4), d=!!(val&8);
|
||||
GPIOA->ODR &= ~(!a<<3 | !b<<7 | c<<6 | d<<4);
|
||||
GPIOA->ODR |= a<<3 | b<<7 | !c<<6 | !d<<4;
|
||||
}
|
||||
set_outputs(0);
|
||||
|
||||
adc_init();
|
||||
|
||||
uint8_t out_state = 0x01;
|
||||
#define DEBOUNCE 100
|
||||
int debounce_ctr = 0;
|
||||
int val_last = 0;
|
||||
int ctr = 0;
|
||||
#define RESET 1000
|
||||
int reset_ctr = 0;
|
||||
while (42) {
|
||||
#define FOO 500000
|
||||
if (reset_ctr)
|
||||
reset_ctr--;
|
||||
else
|
||||
set_outputs(0);
|
||||
|
||||
if (debounce_ctr) {
|
||||
debounce_ctr--;
|
||||
} else {
|
||||
int val = !!(GPIOA->IDR & 1);
|
||||
debounce_ctr = DEBOUNCE;
|
||||
|
||||
if (val != val_last) {
|
||||
if (val)
|
||||
set_outputs(out_state & 0xf);
|
||||
else
|
||||
set_outputs(out_state >> 4);
|
||||
reset_ctr = RESET;
|
||||
val_last = val;
|
||||
ctr++;
|
||||
|
||||
if (ctr == 100) {
|
||||
ctr = 0;
|
||||
out_state = out_state<<1 | out_state>>7;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
for (int i=0; i<FOO; i++) ;
|
||||
set_outputs(0x1);
|
||||
for (int i=0; i<FOO; i++) ;
|
||||
set_outputs(0x2);
|
||||
for (int i=0; i<FOO; i++) ;
|
||||
set_outputs(0x4);
|
||||
for (int i=0; i<FOO; i++) ;
|
||||
set_outputs(0x8);
|
||||
*/
|
||||
//for (int i=0; i<8*FOO; i++) ;
|
||||
//GPIOA->ODR ^= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void NMI_Handler(void) {
|
||||
}
|
||||
|
||||
void HardFault_Handler(void) __attribute__((naked));
|
||||
void HardFault_Handler() {
|
||||
asm volatile ("bkpt");
|
||||
}
|
||||
|
||||
void SVC_Handler(void) {
|
||||
}
|
||||
|
||||
|
||||
void PendSV_Handler(void) {
|
||||
}
|
||||
|
||||
void SysTick_Handler(void) {
|
||||
static int n = 0;
|
||||
sys_time++;
|
||||
if (n++ == 1000) {
|
||||
n = 0;
|
||||
sys_time_seconds++;
|
||||
}
|
||||
}
|
||||
|
||||
17
hardware/fw/openocd.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
telnet_port 4445
|
||||
gdb_port 3334
|
||||
tcl_port 6667
|
||||
|
||||
source [find interface/stlink-v2.cfg]
|
||||
#interface jlink
|
||||
#interface stlink-v2
|
||||
#adapter_khz 10000
|
||||
#transport select swd
|
||||
|
||||
#source /usr/share/openocd/scripts/target/stm32f0x.cfg
|
||||
source [find target/stm32f0x_stlink.cfg]
|
||||
|
||||
init
|
||||
arm semihosting enable
|
||||
|
||||
#flash bank sysflash.alias stm32f0x 0x00000000 0 0 0 $_TARGETNAME
|
||||
46
hardware/fw/packet_interface.c
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
#include "packet_interface.h"
|
||||
#include "cobs.h"
|
||||
|
||||
void usart2_isr(void) {
|
||||
TRACING_SET(TR_HOST_IF_USART_IRQ);
|
||||
static struct cobs_decode_state host_cobs_state = {0};
|
||||
if (USART2_SR & USART_SR_ORE) { /* Overrun handling */
|
||||
LOG_PRINTF("USART2 data register overrun\n");
|
||||
/* Clear interrupt flag */
|
||||
(void)USART2_DR; /* FIXME make sure this read is not optimized out */
|
||||
host_packet_length = -1;
|
||||
TRACING_CLEAR(TR_HOST_IF_USART_IRQ);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t data = USART2_DR; /* This automatically acknowledges the IRQ */
|
||||
|
||||
if (host_packet_length) {
|
||||
LOG_PRINTF("USART2 COBS buffer overrun\n");
|
||||
host_packet_length = -1;
|
||||
TRACING_CLEAR(TR_HOST_IF_USART_IRQ);
|
||||
return;
|
||||
}
|
||||
|
||||
ssize_t rv = cobs_decode_incremental(&host_cobs_state, (char *)host_packet_buf, sizeof(host_packet_buf), data);
|
||||
if (rv == -2) {
|
||||
LOG_PRINTF("Host interface COBS packet too large\n");
|
||||
host_packet_length = -1;
|
||||
} else if (rv == -3) {
|
||||
LOG_PRINTF("Got double null byte from host\n");
|
||||
} else if (rv < 0) {
|
||||
LOG_PRINTF("Host interface COBS framing error\n");
|
||||
host_packet_length = -1;
|
||||
} else if (rv > 0) {
|
||||
host_packet_length = rv;
|
||||
} /* else just return and wait for next byte */
|
||||
TRACING_CLEAR(TR_HOST_IF_USART_IRQ);
|
||||
}
|
||||
|
||||
void send_packet(struct dma_usart_file *f, const uint8_t *data, size_t len) {
|
||||
/* ignore return value as putf is blocking and always succeeds */
|
||||
(void)cobs_encode_incremental(f, putf, (char *)data, len);
|
||||
flush(f);
|
||||
}
|
||||
|
||||
6
hardware/fw/packet_interface.h
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#ifndef __PACKET_INTERFACE_H__
|
||||
#define __PACKET_INTERFACE_H__
|
||||
|
||||
void send_packet(struct dma_usart_file *f, const uint8_t *data, size_t len);
|
||||
|
||||
#endif
|
||||
30
hardware/fw/reader.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import struct
|
||||
|
||||
import sqlite3
|
||||
|
||||
import serial
|
||||
from cobs import cobs
|
||||
|
||||
if __name__ == '__main__':
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-b', '--baudrate', type=int, default=250000)
|
||||
parser.add_argument('port')
|
||||
parser.add_argument('dbfile')
|
||||
args = parser.parse_args()
|
||||
|
||||
db = sqlite3.connect(args.db)
|
||||
ser = serial.Serial(args.port, args.baudrate)
|
||||
|
||||
while True:
|
||||
packet = ser.read_until(b'\0')
|
||||
try:
|
||||
packet = cobs.decode(packet)
|
||||
crc, seq, struct.decode('IBxH', packet[:8])
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
12
hardware/fw/scope.gdb
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
target remote 192.168.178.103:3334
|
||||
set pagination off
|
||||
file main.elf
|
||||
load
|
||||
|
||||
break gdb_dump
|
||||
command 1
|
||||
dump binary value /tmp/scope_dump.bin adc_buf
|
||||
continue
|
||||
end
|
||||
|
||||
continue
|
||||
251
hardware/fw/serial.c
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
#include "global.h"
|
||||
#include "serial.h"
|
||||
#include "cobs.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
volatile struct dma_tx_buf usart_tx_buf;
|
||||
|
||||
static uint32_t tx_overruns=0, rx_overruns=0;
|
||||
static uint32_t rx_framing_errors=0, rx_protocol_errors=0;
|
||||
|
||||
static struct cobs_decode_state cobs_state;
|
||||
|
||||
static volatile uint8_t rx_buf[32];
|
||||
|
||||
|
||||
static void usart_schedule_dma(void);
|
||||
static int usart_putc_nonblocking(uint8_t c);
|
||||
|
||||
|
||||
void usart_dma_reset() {
|
||||
usart_tx_buf.xfr_start = -1;
|
||||
usart_tx_buf.xfr_end = 0;
|
||||
usart_tx_buf.wr_pos = 0;
|
||||
usart_tx_buf.wr_idx = 0;
|
||||
usart_tx_buf.xfr_next = 0;
|
||||
usart_tx_buf.wraparound = false;
|
||||
usart_tx_buf.ack = true;
|
||||
|
||||
for (size_t i=0; i<ARRAY_LEN(usart_tx_buf.packet_end); i++)
|
||||
usart_tx_buf.packet_end[i] = -1;
|
||||
|
||||
cobs_decode_incremental_initialize(&cobs_state);
|
||||
}
|
||||
|
||||
void usart_dma_init() {
|
||||
usart_dma_reset();
|
||||
|
||||
/* Configure DMA 1 Channel 2 to handle uart transmission */
|
||||
DMA1_Channel2->CPAR = (uint32_t)&(USART1->TDR);
|
||||
DMA1_Channel2->CCR = (0<<DMA_CCR_PL_Pos)
|
||||
| DMA_CCR_DIR
|
||||
| (0<<DMA_CCR_MSIZE_Pos) /* 8 bit */
|
||||
| (0<<DMA_CCR_PSIZE_Pos) /* 8 bit */
|
||||
| DMA_CCR_MINC
|
||||
| DMA_CCR_TCIE; /* Enable transfer complete interrupt. */
|
||||
|
||||
DMA1_Channel3->CMAR = (uint32_t)&(CRC->DR);
|
||||
DMA1_Channel3->CCR = (1<<DMA_CCR_PL_Pos)
|
||||
| (0<<DMA_CCR_MSIZE_Pos) /* 8 bit */
|
||||
| (0<<DMA_CCR_PSIZE_Pos) /* 8 bit */
|
||||
| DMA_CCR_PINC
|
||||
| DMA_CCR_TCIE; /* Enable transfer complete interrupt. */
|
||||
|
||||
/* triggered on transfer completion. We use this to process the ADC data */
|
||||
NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
|
||||
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2<<5);
|
||||
|
||||
USART1->CR1 = /* 8-bit -> M1, M0 clear */
|
||||
/* OVER8 clear. Use default 16x oversampling */
|
||||
/* CMIF clear */
|
||||
USART_CR1_MME
|
||||
/* WAKE clear */
|
||||
/* PCE, PS clear */
|
||||
| USART_CR1_RXNEIE /* Enable receive interrupt */
|
||||
/* other interrupts clear */
|
||||
| USART_CR1_TE
|
||||
| USART_CR1_RE;
|
||||
/* Set divider for 115.2kBd @48MHz system clock. */
|
||||
//USART1->BRR = 417;
|
||||
|
||||
//USART1->BRR = 48; /* 1MBd */
|
||||
//USART1->BRR = 96; /* 500kBd */
|
||||
USART1->BRR = 192; /* 250kBd */
|
||||
//USART1->BRR = 208; /* 230400 */
|
||||
|
||||
USART1->CR2 = USART_CR2_TXINV | USART_CR2_RXINV;
|
||||
|
||||
USART1->CR3 |= USART_CR3_DMAT; /* TX DMA enable */
|
||||
|
||||
/* Enable receive interrupt */
|
||||
NVIC_EnableIRQ(USART1_IRQn);
|
||||
NVIC_SetPriority(USART1_IRQn, 1<<5);
|
||||
|
||||
/* And... go! */
|
||||
USART1->CR1 |= USART_CR1_UE;
|
||||
}
|
||||
|
||||
void USART1_IRQHandler() {
|
||||
uint32_t isr = USART1->ISR;
|
||||
|
||||
if (isr & USART_ISR_ORE) {
|
||||
USART1->ICR = USART_ICR_ORECF;
|
||||
rx_overruns++;
|
||||
return;
|
||||
}
|
||||
|
||||
if (isr & USART_ISR_RXNE) {
|
||||
uint8_t c = USART1->RDR;
|
||||
|
||||
int rc = cobs_decode_incremental(&cobs_state, (char *)rx_buf, sizeof(rx_buf), c);
|
||||
if (rc == 0) /* packet still incomplete */
|
||||
return;
|
||||
|
||||
if (rc < 0) {
|
||||
rx_framing_errors++;
|
||||
return;
|
||||
}
|
||||
|
||||
/* A complete frame received */
|
||||
if (rc != 2) {
|
||||
rx_protocol_errors++;
|
||||
return;
|
||||
}
|
||||
|
||||
volatile struct ctrl_pkt *pkt = (volatile struct ctrl_pkt *)rx_buf;
|
||||
|
||||
switch (pkt->type) {
|
||||
case CTRL_PKT_RESET:
|
||||
usart_dma_reset();
|
||||
break;
|
||||
|
||||
case CTRL_PKT_ACK:
|
||||
usart_tx_buf.ack = true;
|
||||
if (!(DMA1_Channel2->CCR & DMA_CCR_EN))
|
||||
usart_schedule_dma();
|
||||
break;
|
||||
|
||||
default:
|
||||
rx_protocol_errors++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void usart_schedule_dma() {
|
||||
volatile struct dma_tx_buf *buf = &usart_tx_buf;
|
||||
|
||||
ssize_t xfr_start, xfr_end, xfr_len;
|
||||
if (buf->wraparound) {
|
||||
buf->wraparound = false;
|
||||
xfr_start = 0;
|
||||
xfr_len = buf->xfr_end;
|
||||
xfr_end = buf->xfr_end;
|
||||
|
||||
} else if (buf->ack) {
|
||||
if (buf->packet_end[buf->xfr_next] == -1)
|
||||
return; /* Nothing to trasnmit */
|
||||
|
||||
buf->ack = false;
|
||||
|
||||
xfr_start = buf->xfr_end;
|
||||
xfr_end = buf->packet_end[buf->xfr_next];
|
||||
buf->packet_end[buf->xfr_next] = -1;
|
||||
buf->xfr_next = (buf->xfr_next + 1) % ARRAY_LEN(buf->packet_end);
|
||||
|
||||
if (xfr_end > xfr_start) { /* no wraparound */
|
||||
xfr_len = xfr_end - xfr_start;
|
||||
|
||||
} else { /* wraparound */
|
||||
if (xfr_end != 0)
|
||||
buf->wraparound = true;
|
||||
xfr_len = sizeof(buf->data) - xfr_start;
|
||||
}
|
||||
|
||||
} else {
|
||||
/* retransmit */
|
||||
/* First, send a zero to delimit any garbage from the following good packet */
|
||||
USART1->TDR = 0x00;
|
||||
|
||||
xfr_start = buf->xfr_start;
|
||||
xfr_end = buf->xfr_end;
|
||||
|
||||
if (xfr_end > xfr_start) { /* no wraparound */
|
||||
xfr_len = xfr_end - xfr_start;
|
||||
|
||||
} else { /* wraparound */
|
||||
if (xfr_end != 0)
|
||||
buf->wraparound = true;
|
||||
xfr_len = sizeof(buf->data) - xfr_start;
|
||||
}
|
||||
|
||||
leds.error = 250;
|
||||
}
|
||||
|
||||
buf->xfr_start = xfr_start;
|
||||
buf->xfr_end = xfr_end;
|
||||
|
||||
/* initiate transmission of new buffer */
|
||||
DMA1_Channel2->CMAR = (uint32_t)(buf->data + xfr_start);
|
||||
DMA1_Channel2->CNDTR = xfr_len;
|
||||
DMA1_Channel2->CCR |= DMA_CCR_EN;
|
||||
}
|
||||
|
||||
int usart_putc_nonblocking(uint8_t c) {
|
||||
volatile struct dma_tx_buf *buf = &usart_tx_buf;
|
||||
|
||||
if (buf->wr_pos == buf->xfr_start)
|
||||
return -EBUSY;
|
||||
|
||||
buf->data[buf->wr_pos] = c;
|
||||
buf->wr_pos = (buf->wr_pos + 1) % sizeof(buf->data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void DMA1_Channel2_3_IRQHandler(void) {
|
||||
/* Transfer complete */
|
||||
DMA1->IFCR |= DMA_IFCR_CTCIF2;
|
||||
|
||||
DMA1_Channel2->CCR &= ~DMA_CCR_EN;
|
||||
if (usart_tx_buf.wraparound)
|
||||
usart_schedule_dma();
|
||||
}
|
||||
|
||||
/* len is the packet length including headers */
|
||||
int usart_send_packet_nonblocking(struct ll_pkt *pkt, size_t pkt_len) {
|
||||
|
||||
if (usart_tx_buf.packet_end[usart_tx_buf.wr_idx] != -1) {
|
||||
/* Find a free slot for this packet */
|
||||
tx_overruns++;
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
pkt->pid = usart_tx_buf.wr_idx;
|
||||
pkt->_pad = usart_tx_buf.xfr_next;
|
||||
|
||||
/* make the value this wonky-ass CRC implementation produces match zlib etc. */
|
||||
CRC->CR = CRC_CR_REV_OUT | (1<<CRC_CR_REV_IN_Pos) | CRC_CR_RESET;
|
||||
for (size_t i=offsetof(struct ll_pkt, pid); i<pkt_len; i++)
|
||||
CRC->DR = ((uint8_t *)pkt)[i];
|
||||
|
||||
pkt->crc32 = ~CRC->DR;
|
||||
|
||||
int rc = cobs_encode_usart((int (*)(char))usart_putc_nonblocking, (char *)pkt, pkt_len);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
usart_tx_buf.packet_end[usart_tx_buf.wr_idx] = usart_tx_buf.wr_pos;
|
||||
usart_tx_buf.wr_idx = (usart_tx_buf.wr_idx + 1) % ARRAY_LEN(usart_tx_buf.packet_end);
|
||||
|
||||
leds.usb = 100;
|
||||
|
||||
if (!(DMA1_Channel2->CCR & DMA_CCR_EN))
|
||||
usart_schedule_dma();
|
||||
return 0;
|
||||
}
|
||||
|
||||
75
hardware/fw/serial.h
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* This file is part of the libusbhost library
|
||||
* hosted at http://github.com/libusbhost/libusbhost
|
||||
*
|
||||
* Copyright (C) 2015 Amir Hammad <amir.hammad@hotmail.com>
|
||||
*
|
||||
*
|
||||
* libusbhost is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SERIAL_H__
|
||||
#define __SERIAL_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "global.h"
|
||||
|
||||
struct dma_tx_buf {
|
||||
/* The following fields are accessed only from DMA ISR */
|
||||
ssize_t xfr_start; /* Start index of running DMA transfer */
|
||||
ssize_t xfr_end; /* End index of running DMA transfer plus one */
|
||||
bool wraparound;
|
||||
ssize_t xfr_next;
|
||||
bool ack;
|
||||
|
||||
|
||||
/* The following fields are written only from non-interrupt code */
|
||||
ssize_t wr_pos; /* Next index to be written */
|
||||
ssize_t wr_idx;
|
||||
ssize_t packet_end[8];
|
||||
|
||||
/* The following may be accessed by anything */
|
||||
uint8_t data[512];
|
||||
};
|
||||
|
||||
struct __attribute__((__packed__)) ll_pkt {
|
||||
uint32_t crc32;
|
||||
/* CRC computed over entire packet starting here */
|
||||
uint8_t pid;
|
||||
uint8_t _pad;
|
||||
uint8_t data[];
|
||||
};
|
||||
|
||||
enum ctrl_pkt_type {
|
||||
CTRL_PKT_RESET = 1,
|
||||
CTRL_PKT_ACK = 2,
|
||||
};
|
||||
|
||||
struct __attribute__((__packed__)) ctrl_pkt {
|
||||
uint8_t type;
|
||||
uint8_t orig_id;
|
||||
};
|
||||
|
||||
extern volatile struct dma_tx_buf usart_tx_buf;
|
||||
|
||||
void usart_dma_init(void);
|
||||
int usart_send_packet_nonblocking(struct ll_pkt *pkt, size_t pkt_len);
|
||||
int usart_ack_packet(uint8_t idx);
|
||||
|
||||
#endif // __SERIAL_H__
|
||||
273
hardware/fw/startup_stm32f030x6.s
Normal file
|
|
@ -0,0 +1,273 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f030x6.s
|
||||
* copied from: STM32Cube/Drivers/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc
|
||||
* @author MCD Application Team
|
||||
* @version V2.3.1
|
||||
* @date 04-November-2016
|
||||
* @brief STM32F030x4/STM32F030x6 devices vector table for Atollic TrueSTUDIO toolchain.
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* After Reset the Cortex-M0 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
******************************************************************************
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m0
|
||||
.fpu softvfp
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
ldr r0, =_estack
|
||||
mov sp, r0 /* set stack pointer */
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2]
|
||||
adds r2, r2, #4
|
||||
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
/* Call static constructors */
|
||||
// bl __libc_init_array
|
||||
/* Call the application's entry point.*/
|
||||
bl main
|
||||
|
||||
LoopForever:
|
||||
b LoopForever
|
||||
|
||||
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
*
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M0. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
.word WWDG_IRQHandler /* Window WatchDog */
|
||||
.word 0 /* Reserved */
|
||||
.word RTC_IRQHandler /* RTC through the EXTI line */
|
||||
.word FLASH_IRQHandler /* FLASH */
|
||||
.word RCC_IRQHandler /* RCC */
|
||||
.word EXTI0_1_IRQHandler /* EXTI Line 0 and 1 */
|
||||
.word EXTI2_3_IRQHandler /* EXTI Line 2 and 3 */
|
||||
.word EXTI4_15_IRQHandler /* EXTI Line 4 to 15 */
|
||||
.word 0 /* Reserved */
|
||||
.word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
|
||||
.word DMA1_Channel2_3_IRQHandler /* DMA1 Channel 2 and Channel 3 */
|
||||
.word DMA1_Channel4_5_IRQHandler /* DMA1 Channel 4 and Channel 5 */
|
||||
.word ADC1_IRQHandler /* ADC1 */
|
||||
.word TIM1_BRK_UP_TRG_COM_IRQHandler /* TIM1 Break, Update, Trigger and Commutation */
|
||||
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
|
||||
.word 0 /* Reserved */
|
||||
.word TIM3_IRQHandler /* TIM3 */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word TIM14_IRQHandler /* TIM14 */
|
||||
.word 0 /* Reserved */
|
||||
.word TIM16_IRQHandler /* TIM16 */
|
||||
.word TIM17_IRQHandler /* TIM17 */
|
||||
.word I2C1_IRQHandler /* I2C1 */
|
||||
.word 0 /* Reserved */
|
||||
.word SPI1_IRQHandler /* SPI1 */
|
||||
.word 0 /* Reserved */
|
||||
.word USART1_IRQHandler /* USART1 */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
.word 0 /* Reserved */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
.weak NMI_Handler
|
||||
.thumb_set NMI_Handler,Default_Handler
|
||||
|
||||
.weak HardFault_Handler
|
||||
.thumb_set HardFault_Handler,Default_Handler
|
||||
|
||||
.weak SVC_Handler
|
||||
.thumb_set SVC_Handler,Default_Handler
|
||||
|
||||
.weak PendSV_Handler
|
||||
.thumb_set PendSV_Handler,Default_Handler
|
||||
|
||||
.weak SysTick_Handler
|
||||
.thumb_set SysTick_Handler,Default_Handler
|
||||
|
||||
.weak WWDG_IRQHandler
|
||||
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||
|
||||
.weak RTC_IRQHandler
|
||||
.thumb_set RTC_IRQHandler,Default_Handler
|
||||
|
||||
.weak FLASH_IRQHandler
|
||||
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||
|
||||
.weak RCC_IRQHandler
|
||||
.thumb_set RCC_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI0_1_IRQHandler
|
||||
.thumb_set EXTI0_1_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI2_3_IRQHandler
|
||||
.thumb_set EXTI2_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak EXTI4_15_IRQHandler
|
||||
.thumb_set EXTI4_15_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Channel1_IRQHandler
|
||||
.thumb_set DMA1_Channel1_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Channel2_3_IRQHandler
|
||||
.thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler
|
||||
|
||||
.weak DMA1_Channel4_5_IRQHandler
|
||||
.thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler
|
||||
|
||||
.weak ADC1_IRQHandler
|
||||
.thumb_set ADC1_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_BRK_UP_TRG_COM_IRQHandler
|
||||
.thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM1_CC_IRQHandler
|
||||
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM3_IRQHandler
|
||||
.thumb_set TIM3_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM14_IRQHandler
|
||||
.thumb_set TIM14_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM16_IRQHandler
|
||||
.thumb_set TIM16_IRQHandler,Default_Handler
|
||||
|
||||
.weak TIM17_IRQHandler
|
||||
.thumb_set TIM17_IRQHandler,Default_Handler
|
||||
|
||||
.weak I2C1_IRQHandler
|
||||
.thumb_set I2C1_IRQHandler,Default_Handler
|
||||
|
||||
.weak SPI1_IRQHandler
|
||||
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||
|
||||
.weak USART1_IRQHandler
|
||||
.thumb_set USART1_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
||||
136
hardware/fw/stm32_flash.ld
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
MEMORY {
|
||||
FLASH (rx): ORIGIN = 0x08000000, LENGTH = 0x3C00
|
||||
CONFIGFLASH (rw): ORIGIN = 0x08003C00, LENGTH = 0x400
|
||||
RAM (xrw): ORIGIN = 0x20000000, LENGTH = 4K
|
||||
}
|
||||
|
||||
/* highest address of the user mode stack */
|
||||
_estack = 0x20001000;
|
||||
|
||||
SECTIONS {
|
||||
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
|
||||
.isr_vector : {
|
||||
. = ALIGN(4);
|
||||
KEEP(*(.isr_vector)) /* Startup code */
|
||||
. = ALIGN(4);
|
||||
} >FLASH
|
||||
|
||||
/* the program code is stored in the .text section, which goes to Flash */
|
||||
.text : {
|
||||
. = ALIGN(4);
|
||||
|
||||
*(.text) /* normal code */
|
||||
*(.text.*) /* -ffunction-sections code */
|
||||
*(.rodata) /* read-only data (constants) */
|
||||
*(.rodata*) /* -fdata-sections read only data */
|
||||
*(.glue_7) /* TBD - needed ? */
|
||||
*(.glue_7t) /* TBD - needed ? */
|
||||
|
||||
*(.source_tarball)
|
||||
|
||||
/* Necessary KEEP sections (see http://sourceware.org/ml/newlib/2005/msg00255.html) */
|
||||
KEEP (*(.init))
|
||||
KEEP (*(.fini))
|
||||
KEEP (*(.source_tarball))
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
/* This is used by the startup in order to initialize the .data section */
|
||||
_sidata = _etext;
|
||||
} >FLASH
|
||||
|
||||
/*
|
||||
.configflash : {
|
||||
. = ALIGN(0x400);
|
||||
*(.configdata)
|
||||
_econfig = .;
|
||||
} >FLASH
|
||||
*/
|
||||
|
||||
/* This is the initialized data section
|
||||
The program executes knowing that the data is in the RAM
|
||||
but the loader puts the initial values in the FLASH (inidata).
|
||||
It is one task of the startup to copy the initial values from FLASH to RAM. */
|
||||
.data : AT ( _sidata ) {
|
||||
. = ALIGN(4);
|
||||
/* This is used by the startup in order to initialize the .data secion */
|
||||
_sdata = . ;
|
||||
_data = . ;
|
||||
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.RAMtext)
|
||||
|
||||
. = ALIGN(4);
|
||||
/* This is used by the startup in order to initialize the .data secion */
|
||||
_edata = . ;
|
||||
} >RAM
|
||||
|
||||
/* This is the uninitialized data section */
|
||||
.bss : {
|
||||
. = ALIGN(4);
|
||||
/* This is used by the startup in order to initialize the .bss secion */
|
||||
_sbss = .;
|
||||
_bss = .;
|
||||
|
||||
*(.bss)
|
||||
*(.bss.*) /* patched by elias - allows the use of -fdata-sections */
|
||||
*(COMMON)
|
||||
|
||||
. = ALIGN(4);
|
||||
/* This is used by the startup in order to initialize the .bss secion */
|
||||
_ebss = . ;
|
||||
} >RAM
|
||||
|
||||
PROVIDE ( end = _ebss);
|
||||
PROVIDE (_end = _ebss);
|
||||
|
||||
__exidx_start = .;
|
||||
__exidx_end = .;
|
||||
|
||||
/* after that it's only debugging information. */
|
||||
|
||||
/* remove the debugging information from the standard libraries */
|
||||
/* /DISCARD/ : {
|
||||
libc.a ( * )
|
||||
libm.a ( * )
|
||||
libgcc.a ( * )
|
||||
}*/
|
||||
|
||||
/* Stabs debugging sections. */
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
.stab.excl 0 : { *(.stab.excl) }
|
||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||
.stab.index 0 : { *(.stab.index) }
|
||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||
.comment 0 : { *(.comment) }
|
||||
/* DWARF debug sections.
|
||||
Symbols in the DWARF debugging sections are relative to the beginning
|
||||
of the section so we begin them at 0. */
|
||||
/* DWARF 1 */
|
||||
.debug 0 : { *(.debug) }
|
||||
.line 0 : { *(.line) }
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame) }
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
}
|
||||
336
hardware/fw/system_stm32f0xx.c
Normal file
|
|
@ -0,0 +1,336 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* @file system_stm32f0xx.c
|
||||
* copied from: STM32Cube/Drivers/CMSIS/Device/ST/STM32F0xx/Source/Templates
|
||||
* @author MCD Application Team
|
||||
* @version V2.3.1
|
||||
* @date 04-November-2016
|
||||
* @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File.
|
||||
*
|
||||
* 1. This file provides two functions and one global variable to be called from
|
||||
* user application:
|
||||
* - SystemInit(): This function is called at startup just after reset and
|
||||
* before branch to main program. This call is made inside
|
||||
* the "startup_stm32f0xx.s" file.
|
||||
*
|
||||
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
|
||||
* by the user application to setup the SysTick
|
||||
* timer or configure other parameters.
|
||||
*
|
||||
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
|
||||
* be called whenever the core clock is changed
|
||||
* during program execution.
|
||||
*
|
||||
* 2. After each device reset the HSI (8 MHz) is used as system clock source.
|
||||
* Then SystemInit() function is called, in "startup_stm32f0xx.s" file, to
|
||||
* configure the system clock before to branch to main program.
|
||||
*
|
||||
* 3. This file configures the system clock as follows:
|
||||
*=============================================================================
|
||||
* Supported STM32F0xx device
|
||||
*-----------------------------------------------------------------------------
|
||||
* System Clock source | HSI
|
||||
*-----------------------------------------------------------------------------
|
||||
* SYSCLK(Hz) | 8000000
|
||||
*-----------------------------------------------------------------------------
|
||||
* HCLK(Hz) | 8000000
|
||||
*-----------------------------------------------------------------------------
|
||||
* AHB Prescaler | 1
|
||||
*-----------------------------------------------------------------------------
|
||||
* APB1 Prescaler | 1
|
||||
*-----------------------------------------------------------------------------
|
||||
*=============================================================================
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/** @addtogroup CMSIS
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup stm32f0xx_system
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_Includes
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "stm32f0xx.h"
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_TypesDefinitions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_Defines
|
||||
* @{
|
||||
*/
|
||||
#if !defined (HSE_VALUE)
|
||||
#define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz.
|
||||
This value can be provided and adapted by the user application. */
|
||||
#endif /* HSE_VALUE */
|
||||
|
||||
#if !defined (HSI_VALUE)
|
||||
#define HSI_VALUE ((uint32_t)8000000) /*!< Default value of the Internal oscillator in Hz.
|
||||
This value can be provided and adapted by the user application. */
|
||||
#endif /* HSI_VALUE */
|
||||
|
||||
#if !defined (HSI48_VALUE)
|
||||
#define HSI48_VALUE ((uint32_t)48000000) /*!< Default value of the HSI48 Internal oscillator in Hz.
|
||||
This value can be provided and adapted by the user application. */
|
||||
#endif /* HSI48_VALUE */
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_Macros
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_Variables
|
||||
* @{
|
||||
*/
|
||||
/* This variable is updated in three ways:
|
||||
1) by calling CMSIS function SystemCoreClockUpdate()
|
||||
2) by calling HAL API function HAL_RCC_GetHCLKFreq()
|
||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
|
||||
Note: If you use this function to configure the system clock there is no need to
|
||||
call the 2 first functions listed above, since SystemCoreClock variable is
|
||||
updated automatically.
|
||||
*/
|
||||
uint32_t SystemCoreClock = 8000000;
|
||||
|
||||
const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
|
||||
const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F0xx_System_Private_Functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Setup the microcontroller system.
|
||||
* Initialize the default HSI clock source, vector table location and the PLL configuration is reset.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void SystemInit(void)
|
||||
{
|
||||
/* Reset the RCC clock configuration to the default reset state ------------*/
|
||||
/* Set HSION bit */
|
||||
RCC->CR |= (uint32_t)0x00000001U;
|
||||
|
||||
#if defined (STM32F051x8) || defined (STM32F058x8)
|
||||
/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
|
||||
RCC->CFGR &= (uint32_t)0xF8FFB80CU;
|
||||
#else
|
||||
/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */
|
||||
RCC->CFGR &= (uint32_t)0x08FFB80CU;
|
||||
#endif /* STM32F051x8 or STM32F058x8 */
|
||||
|
||||
/* Reset HSEON, CSSON and PLLON bits */
|
||||
RCC->CR &= (uint32_t)0xFEF6FFFFU;
|
||||
|
||||
/* Reset HSEBYP bit */
|
||||
RCC->CR &= (uint32_t)0xFFFBFFFFU;
|
||||
|
||||
/* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
|
||||
RCC->CFGR &= (uint32_t)0xFFC0FFFFU;
|
||||
|
||||
/* Reset PREDIV[3:0] bits */
|
||||
RCC->CFGR2 &= (uint32_t)0xFFFFFFF0U;
|
||||
|
||||
#if defined (STM32F072xB) || defined (STM32F078xx)
|
||||
/* Reset USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW, USBSW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFFCFE2CU;
|
||||
#elif defined (STM32F071xB)
|
||||
/* Reset USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFFFCEACU;
|
||||
#elif defined (STM32F091xC) || defined (STM32F098xx)
|
||||
/* Reset USART3SW[1:0], USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFF0FEACU;
|
||||
#elif defined (STM32F030x6) || defined (STM32F030x8) || defined (STM32F031x6) || defined (STM32F038xx) || defined (STM32F030xC)
|
||||
/* Reset USART1SW[1:0], I2C1SW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFFFFEECU;
|
||||
#elif defined (STM32F051x8) || defined (STM32F058xx)
|
||||
/* Reset USART1SW[1:0], I2C1SW, CECSW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFFFFEACU;
|
||||
#elif defined (STM32F042x6) || defined (STM32F048xx)
|
||||
/* Reset USART1SW[1:0], I2C1SW, CECSW, USBSW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFFFFE2CU;
|
||||
#elif defined (STM32F070x6) || defined (STM32F070xB)
|
||||
/* Reset USART1SW[1:0], I2C1SW, USBSW and ADCSW bits */
|
||||
RCC->CFGR3 &= (uint32_t)0xFFFFFE6CU;
|
||||
/* Set default USB clock to PLLCLK, since there is no HSI48 */
|
||||
RCC->CFGR3 |= (uint32_t)0x00000080U;
|
||||
#else
|
||||
#warning "No target selected"
|
||||
#endif
|
||||
|
||||
/* Reset HSI14 bit */
|
||||
RCC->CR2 &= (uint32_t)0xFFFFFFFEU;
|
||||
|
||||
/* Disable all interrupts */
|
||||
RCC->CIR = 0x00000000U;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Update SystemCoreClock variable according to Clock Register Values.
|
||||
* The SystemCoreClock variable contains the core clock (HCLK), it can
|
||||
* be used by the user application to setup the SysTick timer or configure
|
||||
* other parameters.
|
||||
*
|
||||
* @note Each time the core clock (HCLK) changes, this function must be called
|
||||
* to update SystemCoreClock variable value. Otherwise, any configuration
|
||||
* based on this variable will be incorrect.
|
||||
*
|
||||
* @note - The system frequency computed by this function is not the real
|
||||
* frequency in the chip. It is calculated based on the predefined
|
||||
* constant and the selected clock source:
|
||||
*
|
||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
|
||||
*
|
||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
|
||||
*
|
||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
|
||||
* or HSI_VALUE(*) multiplied/divided by the PLL factors.
|
||||
*
|
||||
* (*) HSI_VALUE is a constant defined in stm32f0xx_hal.h file (default value
|
||||
* 8 MHz) but the real value may vary depending on the variations
|
||||
* in voltage and temperature.
|
||||
*
|
||||
* (**) HSE_VALUE is a constant defined in stm32f0xx_hal.h file (default value
|
||||
* 8 MHz), user has to ensure that HSE_VALUE is same as the real
|
||||
* frequency of the crystal used. Otherwise, this function may
|
||||
* have wrong result.
|
||||
*
|
||||
* - The result of this function could be not correct when using fractional
|
||||
* value for HSE crystal.
|
||||
*
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void SystemCoreClockUpdate (void)
|
||||
{
|
||||
uint32_t tmp = 0, pllmull = 0, pllsource = 0, predivfactor = 0;
|
||||
|
||||
/* Get SYSCLK source -------------------------------------------------------*/
|
||||
tmp = RCC->CFGR & RCC_CFGR_SWS;
|
||||
|
||||
switch (tmp)
|
||||
{
|
||||
case RCC_CFGR_SWS_HSI: /* HSI used as system clock */
|
||||
SystemCoreClock = HSI_VALUE;
|
||||
break;
|
||||
case RCC_CFGR_SWS_HSE: /* HSE used as system clock */
|
||||
SystemCoreClock = HSE_VALUE;
|
||||
break;
|
||||
case RCC_CFGR_SWS_PLL: /* PLL used as system clock */
|
||||
/* Get PLL clock source and multiplication factor ----------------------*/
|
||||
pllmull = RCC->CFGR & RCC_CFGR_PLLMUL;
|
||||
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
|
||||
pllmull = ( pllmull >> 18) + 2;
|
||||
predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1;
|
||||
|
||||
if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV)
|
||||
{
|
||||
/* HSE used as PLL clock source : SystemCoreClock = HSE/PREDIV * PLLMUL */
|
||||
SystemCoreClock = (HSE_VALUE/predivfactor) * pllmull;
|
||||
}
|
||||
#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F091xC) || defined(STM32F098xx)
|
||||
else if (pllsource == RCC_CFGR_PLLSRC_HSI48_PREDIV)
|
||||
{
|
||||
/* HSI48 used as PLL clock source : SystemCoreClock = HSI48/PREDIV * PLLMUL */
|
||||
SystemCoreClock = (HSI48_VALUE/predivfactor) * pllmull;
|
||||
}
|
||||
#endif /* STM32F042x6 || STM32F048xx || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx */
|
||||
else
|
||||
{
|
||||
#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F070x6) \
|
||||
|| defined(STM32F078xx) || defined(STM32F071xB) || defined(STM32F072xB) \
|
||||
|| defined(STM32F070xB) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
|
||||
/* HSI used as PLL clock source : SystemCoreClock = HSI/PREDIV * PLLMUL */
|
||||
SystemCoreClock = (HSI_VALUE/predivfactor) * pllmull;
|
||||
#else
|
||||
/* HSI used as PLL clock source : SystemCoreClock = HSI/2 * PLLMUL */
|
||||
SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
|
||||
#endif /* STM32F042x6 || STM32F048xx || STM32F070x6 ||
|
||||
STM32F071xB || STM32F072xB || STM32F078xx || STM32F070xB ||
|
||||
STM32F091xC || STM32F098xx || STM32F030xC */
|
||||
}
|
||||
break;
|
||||
default: /* HSI used as system clock */
|
||||
SystemCoreClock = HSI_VALUE;
|
||||
break;
|
||||
}
|
||||
/* Compute HCLK clock frequency ----------------*/
|
||||
/* Get HCLK prescaler */
|
||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
|
||||
/* HCLK clock frequency */
|
||||
SystemCoreClock >>= tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
||||
41
hardware/fw/test.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import serial
|
||||
import time
|
||||
|
||||
#ser = serial.Serial('/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0', 230400)
|
||||
ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 250000)
|
||||
#while True:
|
||||
# ser.write(bytes(range(256)))
|
||||
start = time.time()
|
||||
|
||||
last_val = None
|
||||
run = 0
|
||||
total_errors = 0
|
||||
rx_bytes = 0
|
||||
last_print = time.time()
|
||||
while True:
|
||||
bytes = ser.read(256)
|
||||
for byte in bytes:
|
||||
if last_val is not None and byte != (last_val + 1) % 256:
|
||||
if run > 0:
|
||||
print(f'{time.time()-start:>8.3f} {run} {last_val:02x} {byte:02x}')
|
||||
run = 0
|
||||
total_errors += 1
|
||||
else:
|
||||
run += 1
|
||||
rx_bytes += 1
|
||||
|
||||
if time.time() - last_print > 5:
|
||||
last_print = time.time()
|
||||
print(f'{time.time()-start:>8.3f} {run} [all good] err={total_errors}@rx={rx_bytes}B',
|
||||
f'(rate 1/{rx_bytes/total_errors:.5g})' if total_errors > 0 else 'rate unknown')
|
||||
last_val = byte
|
||||
|
||||
#while True:
|
||||
# data = ser.read_until(b'\0')
|
||||
# print(f'{time.time()-start:>8.3f} {len(data)}')
|
||||
|
||||
# while True:
|
||||
# data = ser.read(256)
|
||||
# print('YES' if b'\0' in data else 'NO ', data)
|
||||
30
hardware/fw/tools/gen_cmsis_exports.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
#!/usr/bin/env python3
|
||||
import re
|
||||
import os
|
||||
|
||||
if __name__ == '__main__':
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('cmsis_device_header', nargs='+', type=argparse.FileType('rb'))
|
||||
args = parser.parse_args()
|
||||
|
||||
print('#ifndef __GENERATED_CMSIS_HEADER_EXPORTS__')
|
||||
print('#define __GENERATED_CMSIS_HEADER_EXPORTS__')
|
||||
print()
|
||||
for header in args.cmsis_device_header:
|
||||
lines = header.readlines()
|
||||
name = os.path.basename(header.name)
|
||||
print('#include <{}>'.format(name))
|
||||
print()
|
||||
|
||||
print('/* {} */'.format(name))
|
||||
for l in lines:
|
||||
match = re.match(b'^#define (\w+)\s+\W*(\w+_TypeDef|\w+_Type).*$', l)
|
||||
if match:
|
||||
inst, typedef = match.groups()
|
||||
inst, typedef = inst.decode(), typedef.decode()
|
||||
print('{} *{} = {};'.format(typedef, inst.lower(), inst))
|
||||
print()
|
||||
print('#endif//__GENERATED_CMSIS_HEADER_EXPORTS__')
|
||||
|
||||
450
hardware/fw/tw_test.c
Normal file
|
|
@ -0,0 +1,450 @@
|
|||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <asm/termbits.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <assert.h>
|
||||
#include <sys/epoll.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <sqlite3.h>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
int set_interface_attribs (int fd, int baudrate) {
|
||||
struct termios2 tio;
|
||||
memset (&tio, 0, sizeof(tio));
|
||||
if (ioctl (fd, TCGETS2, &tio) != 0) {
|
||||
fprintf(stderr, "Could not request termios for given port\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* FIXME set baudrate */
|
||||
|
||||
tio.c_cflag = (tio.c_cflag & ~CSIZE) | CS8; /* 8 bit */
|
||||
/* disable IGNBRK for mismatched speed tests; otherwise receive break as \000 chars */
|
||||
tio.c_iflag &= ~IGNBRK; /* disable break processing */
|
||||
tio.c_lflag = 0; /* no signaling chars, no echo, no canonical processing */
|
||||
tio.c_oflag = 0; /* no remapping, no delays */
|
||||
|
||||
tio.c_iflag &= ~(IXON | IXOFF | IXANY); /* shut off xon/xoff ctrl */
|
||||
|
||||
tio.c_cflag |= (CLOCAL | CREAD);/* ignore modem controls, enable reading */
|
||||
tio.c_cflag &= ~(PARENB | PARODD); /* no parity */
|
||||
tio.c_cflag &= ~CSTOPB;
|
||||
tio.c_cflag &= ~CRTSCTS;
|
||||
|
||||
tio.c_cflag &= ~(CBAUD | CBAUDEX);
|
||||
tio.c_cflag |= BOTHER;
|
||||
tio.c_ospeed = baudrate;
|
||||
tio.c_cflag &= ~((CBAUD | CBAUDEX) << IBSHIFT);
|
||||
tio.c_cflag |= (B0 << IBSHIFT); /* same as output baudrate */
|
||||
|
||||
tio.c_cc[VMIN] = 0; /* non-blocking mode */
|
||||
tio.c_cc[VTIME] = 10; /* 1000ms seconds read timeout */
|
||||
|
||||
if (ioctl (fd, TCSETS2, &tio)) {
|
||||
fprintf(stderr, "Could not set serial port attributes: Error %d in tcsetattr (\"%s\")\n", errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t cobs_decode(char *dst, size_t dstlen, char *src, size_t srclen) {
|
||||
size_t p = 1;
|
||||
size_t c = (unsigned char)src[0];
|
||||
if (c == 0)
|
||||
return -5; /* invalid framing. An empty frame would be [...] 00 01 00, not [...] 00 00 */
|
||||
|
||||
while (p < srclen && src[p]) {
|
||||
char val;
|
||||
c--;
|
||||
|
||||
if (c == 0) {
|
||||
c = (unsigned char)src[p];
|
||||
val = 0;
|
||||
} else {
|
||||
val = src[p];
|
||||
}
|
||||
|
||||
if (p > dstlen)
|
||||
return -4; /* Destination buffer too small */
|
||||
dst[p-1] = val;
|
||||
p++;
|
||||
}
|
||||
|
||||
if (p == srclen)
|
||||
return -2; /* Invalid framing. The terminating null byte should always be present in the input buffer. */
|
||||
|
||||
if (c != 1)
|
||||
return -3; /* Invalid framing. The skip counter does not hit the end of the frame. */
|
||||
|
||||
return p-1;
|
||||
}
|
||||
|
||||
int cobs_encode(char *dst, char *src, size_t srclen) {
|
||||
if (srclen > 254)
|
||||
return -1;
|
||||
|
||||
size_t p = 0;
|
||||
while (p <= srclen) {
|
||||
|
||||
char val;
|
||||
if (p != 0 && src[p-1] != 0) {
|
||||
val = src[p-1];
|
||||
|
||||
} else {
|
||||
size_t q = p;
|
||||
while (q < srclen && src[q] != 0)
|
||||
q++;
|
||||
val = (char)q-p+1;
|
||||
}
|
||||
|
||||
|
||||
*dst++ = val;
|
||||
p++;
|
||||
}
|
||||
|
||||
*dst++ = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void print_usage(char *prog) {
|
||||
fprintf(stderr, "Usage: %s [-p /dev/serial/some_port] [-b baudrate] dbfile.sqilte3\n", prog);
|
||||
}
|
||||
|
||||
void hexdump(const void* data, size_t size) {
|
||||
char ascii[17];
|
||||
size_t i, j;
|
||||
ascii[16] = '\0';
|
||||
for (i = 0; i < size; ++i) {
|
||||
printf("%02X ", ((unsigned char*)data)[i]);
|
||||
if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') {
|
||||
ascii[i % 16] = ((unsigned char*)data)[i];
|
||||
} else {
|
||||
ascii[i % 16] = '.';
|
||||
}
|
||||
if ((i+1) % 8 == 0 || i+1 == size) {
|
||||
printf(" ");
|
||||
if ((i+1) % 16 == 0) {
|
||||
printf("| %s \n", ascii);
|
||||
} else if (i+1 == size) {
|
||||
ascii[(i+1) % 16] = '\0';
|
||||
if ((i+1) % 16 <= 8) {
|
||||
printf(" ");
|
||||
}
|
||||
for (j = (i+1) % 16; j < 16; ++j) {
|
||||
printf(" ");
|
||||
}
|
||||
printf("| %s \n", ascii);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
int opt;
|
||||
int baudrate = 250000;
|
||||
char *endptr = NULL;
|
||||
char *port = NULL;
|
||||
char *dbfile = NULL;
|
||||
while ((opt = getopt(argc, argv, "p:b:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'p':
|
||||
port = optarg;
|
||||
break;
|
||||
case 'b':
|
||||
baudrate = strtol(optarg, &endptr, 10);
|
||||
if (errno == ERANGE || endptr == NULL || *endptr != '\0') {
|
||||
fprintf(stderr, "Invalid baudrate \"%s\"\n", optarg);
|
||||
print_usage(argv[0]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
print_usage(argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
if (port == NULL) {
|
||||
DIR *le_dir = opendir("/dev/serial/by-id");
|
||||
if (le_dir == NULL) {
|
||||
fprintf(stderr, "No serial port given and could not find any in /dev/serial\n");
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
}
|
||||
|
||||
struct dirent *de;
|
||||
while ((de = readdir(le_dir))) {
|
||||
if (de == NULL) {
|
||||
fprintf(stderr, "No serial port given and could not find any in /dev/serial\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (!strncmp(de->d_name, ".", sizeof(de->d_name)) ||
|
||||
!strncmp(de->d_name, "..", sizeof(de->d_name)))
|
||||
continue;
|
||||
|
||||
if (port != NULL) {
|
||||
fprintf(stderr, "No serial port given and found multiple candidates in /dev/serial\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
const char *prefix = "/dev/serial/by-id/";
|
||||
port = malloc(strlen(prefix) + sizeof(de->d_name) + 1);
|
||||
if (port == NULL) {
|
||||
fprintf(stderr, "Could not allocate memory\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
strcpy(port, prefix);
|
||||
strncat(port, de->d_name, sizeof(de->d_name));
|
||||
}
|
||||
fprintf(stderr, "No port given, defaulting to %s\n", port);
|
||||
closedir(le_dir);
|
||||
}
|
||||
|
||||
if (optind != argc - 1) {
|
||||
fprintf(stderr, "Too few arguments\n");
|
||||
print_usage(argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
dbfile = argv[optind];
|
||||
printf("Using database file %s\n", dbfile);
|
||||
fflush(stdout);
|
||||
|
||||
int fd = open(port, O_RDWR|O_NOCTTY|O_SYNC);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "Cannot open serial port: %s\n", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (set_interface_attribs (fd, baudrate))
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
sqlite3 *db;
|
||||
if (sqlite3_open(dbfile, &db) != SQLITE_OK) {
|
||||
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
||||
sqlite3_close(db);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
char *errmsg;
|
||||
if (sqlite3_exec(db,
|
||||
"CREATE TABLE IF NOT EXISTS measurements (rx_time INTEGER, tx_seq INTEGER, rx_seq INTEGER, data BLOB);",
|
||||
NULL, NULL, &errmsg) != SQLITE_OK) {
|
||||
fprintf(stderr, "Error initializing databse: %s\n", errmsg);
|
||||
sqlite3_close(db);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
const char *insert_sql = "INSERT INTO measurements VALUES (?, ?, ?, ?)";
|
||||
sqlite3_stmt *insert_stmt;
|
||||
if (sqlite3_prepare_v2(db, insert_sql, strlen(insert_sql), &insert_stmt, NULL) != SQLITE_OK) {
|
||||
fprintf(stderr, "Error compiling SQL: %s\n", sqlite3_errmsg(db));
|
||||
sqlite3_close(db);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
char buf [1024];
|
||||
int in_sync = 0, wpos = 0;
|
||||
struct __attribute__((__packed__)) {
|
||||
uint32_t crc;
|
||||
uint8_t pid;
|
||||
uint8_t _pad;
|
||||
uint16_t seq;
|
||||
uint16_t data[32];
|
||||
} packet;
|
||||
struct __attribute__((__packed__)) {
|
||||
uint8_t type;
|
||||
uint8_t pid;
|
||||
} wpacket;
|
||||
char wbuf[4];
|
||||
|
||||
int epollfd = epoll_create1(0);
|
||||
if (epollfd < 0)
|
||||
goto epoll_err;
|
||||
|
||||
#define MAX_EVENTS 10
|
||||
struct epoll_event ev, events[MAX_EVENTS];
|
||||
ev.events = EPOLLIN;
|
||||
ev.data.fd = fd;
|
||||
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) < 0)
|
||||
goto epoll_err;
|
||||
|
||||
wpacket.type = 1;
|
||||
wpacket.pid = 0;
|
||||
cobs_encode(wbuf, (char *)&wpacket, sizeof(wpacket));
|
||||
write(fd, wbuf, sizeof(wbuf));
|
||||
|
||||
/* FIXME begin debug code */
|
||||
for (int i=0; i<32; i++) {
|
||||
wpacket.type = 2;
|
||||
wpacket.pid = packet.pid;
|
||||
cobs_encode(wbuf, (char *)&wpacket, sizeof(wpacket));
|
||||
write(fd, wbuf, sizeof(wbuf));
|
||||
usleep(20);
|
||||
}
|
||||
/* FIXME end debug code */
|
||||
|
||||
int current_seq = -1;
|
||||
uint64_t local_seq = 0;
|
||||
while (23) {
|
||||
int nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
|
||||
if (nfds == -1)
|
||||
goto epoll_err;
|
||||
|
||||
if (nfds == 0)
|
||||
continue;
|
||||
|
||||
ssize_t n = read(fd, buf+wpos, sizeof(buf)-wpos);
|
||||
printf("--- read wpos=%d n=%ld\n", wpos, n);
|
||||
hexdump(buf+wpos, n);
|
||||
if (n<0) {
|
||||
if (errno == EAGAIN || errno == EINTR)
|
||||
continue;
|
||||
|
||||
fprintf(stderr, "Error reading from port: %s\n", strerror(errno));
|
||||
goto loop_err;
|
||||
}
|
||||
//printf("--- debug: read n=%d bytes at wpos=%d\n", n, wpos);
|
||||
//fflush(stdout);
|
||||
wpos += n;
|
||||
|
||||
while (23) {
|
||||
void *first_nul = memchr(buf, 0, wpos) ;
|
||||
ssize_t first_nul_offx = first_nul - (void*)buf;
|
||||
ssize_t remaining = wpos - first_nul_offx;
|
||||
|
||||
if (!in_sync) {
|
||||
if (first_nul) {
|
||||
memmove(buf, first_nul+1, remaining-1);
|
||||
wpos = remaining-1;
|
||||
in_sync = 1;
|
||||
continue;
|
||||
|
||||
} else {
|
||||
wpos = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!first_nul)
|
||||
break;
|
||||
|
||||
printf("--- debug: first_nul=%p (idx=%ld) wpos=%d remaining=%ld\n", first_nul, first_nul_offx, wpos, remaining);
|
||||
hexdump(buf, 80);
|
||||
|
||||
int rc = cobs_decode((char *)&packet, sizeof(packet), buf, wpos);
|
||||
if (rc < 0) {
|
||||
printf("Framing error: rc=%d\n", rc);
|
||||
goto it_err;
|
||||
}
|
||||
|
||||
/* Use zlib to calculate CRC32. The STM32 code calculates the CRC byte-wise, so we emulate this here. */
|
||||
uint32_t our_crc = 0;
|
||||
if (rc > 0) {
|
||||
uint8_t buf[4] = {0};
|
||||
for (int i=4; i<rc; i++) {
|
||||
buf[3] = ((uint8_t *)&packet)[i];
|
||||
our_crc = crc32(our_crc, buf, sizeof(buf));
|
||||
}
|
||||
}
|
||||
|
||||
bool error = false;
|
||||
/* Check CRC */
|
||||
if (our_crc != packet.crc) {
|
||||
printf("CRC mismatch: seq=%d packet=%08x computed=%08x\n", packet.pid, packet.crc, our_crc);
|
||||
error = true;
|
||||
}
|
||||
|
||||
/* Check device sequence number */
|
||||
int last_seq = current_seq;
|
||||
int predicted_seq = (last_seq+1) % 0xffff;
|
||||
if (!error)
|
||||
current_seq = packet.seq;
|
||||
if (last_seq >= 0 && packet.seq != predicted_seq) {
|
||||
printf("SEQ mismatch: packet=%d computed=%d\n", packet.seq, predicted_seq);
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (error)
|
||||
goto it_err;
|
||||
|
||||
/* Write to database */
|
||||
struct timespec ts;
|
||||
if (clock_gettime(CLOCK_REALTIME, &ts)) {
|
||||
fprintf(stderr, "Error getting current wall-clock time: %s\n", strerror(errno));
|
||||
goto loop_err;
|
||||
}
|
||||
uint64_t timestamp = ts.tv_sec*1000 + ts.tv_nsec/1000000;
|
||||
|
||||
if (sqlite3_bind_int(insert_stmt, 1, timestamp) != SQLITE_OK)
|
||||
goto write_err;
|
||||
|
||||
if (sqlite3_bind_int(insert_stmt, 2, packet.seq) != SQLITE_OK)
|
||||
goto write_err;
|
||||
|
||||
if (sqlite3_bind_int(insert_stmt, 3, local_seq) != SQLITE_OK)
|
||||
goto write_err;
|
||||
|
||||
if (sqlite3_bind_blob(insert_stmt, 4, packet.data, sizeof(packet.data), SQLITE_STATIC) != SQLITE_OK)
|
||||
goto write_err;
|
||||
|
||||
while ((rc = sqlite3_step(insert_stmt)) == SQLITE_BUSY)
|
||||
;
|
||||
if (rc != SQLITE_DONE)
|
||||
goto write_err;
|
||||
|
||||
if (sqlite3_reset(insert_stmt) != SQLITE_OK)
|
||||
goto write_err;
|
||||
|
||||
if (sqlite3_clear_bindings(insert_stmt) != SQLITE_OK)
|
||||
goto write_err;
|
||||
|
||||
local_seq++;
|
||||
|
||||
printf("OK: seq=%d crc=%08x\n", current_seq, packet.crc);
|
||||
|
||||
/* send ACK reply */
|
||||
wpacket.type = 2;
|
||||
wpacket.pid = packet.pid;
|
||||
cobs_encode(wbuf, (char *)&wpacket, sizeof(wpacket));
|
||||
write(fd, wbuf, sizeof(wbuf));
|
||||
|
||||
it_err:
|
||||
/* Fixup buffer for next iteration */
|
||||
if (remaining-1 > 0) {
|
||||
printf(" ---memmove(buf=%p, first_nul+1=%p, remaining-1=%ld);-->\n", buf, first_nul+1, remaining-1);
|
||||
memmove(buf, first_nul+1, remaining-1);
|
||||
}
|
||||
//hexdump(buf, 80);
|
||||
fflush(stdout);
|
||||
printf("--- continuing wpos=%d->%d\n", wpos, (int)(remaining-1));
|
||||
wpos = remaining-1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
write_err:
|
||||
fprintf(stderr, "Error writing to database: %s\n", sqlite3_errmsg(db));
|
||||
sqlite3_close(db);
|
||||
return EXIT_FAILURE;
|
||||
|
||||
epoll_err:
|
||||
fprintf(stderr, "epoll error: %s\n", strerror(errno));
|
||||
|
||||
loop_err:
|
||||
sqlite3_close(db);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
139
hardware/fw/tw_test.py
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
from time import time
|
||||
from binascii import hexlify
|
||||
import enum
|
||||
import struct
|
||||
import zlib
|
||||
import sys
|
||||
import sqlite3
|
||||
|
||||
import serial
|
||||
from cobs import cobs
|
||||
|
||||
|
||||
class CtrlPacketTypes(enum.Enum):
|
||||
RESET = 1
|
||||
ACK = 2
|
||||
RETRANSMIT = 3
|
||||
|
||||
def unpack_head(fmt, data):
|
||||
split = struct.calcsize(fmt)
|
||||
return [ *struct.unpack(fmt, data[:split]), data[split:] ]
|
||||
|
||||
def ctrl_packet(ptype, pid=0):
|
||||
return cobs.encode(struct.pack('BB', ptype.value, pid)) + b'\0'
|
||||
|
||||
ctrl_reset = lambda: ctrl_packet(CtrlPacketTypes.RESET)
|
||||
ctrl_ack = lambda pid: ctrl_packet(CtrlPacketTypes.ACK, pid)
|
||||
ctrl_retransmit = lambda pid: ctrl_packet(CtrlPacketTypes.RETRANSMIT, pid)
|
||||
|
||||
if __name__ == '__main__':
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument('-b', '--baudrate', type=int, default=250000)
|
||||
parser.add_argument('port', nargs='?', default=None)
|
||||
parser.add_argument('dbfile')
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.port is None:
|
||||
try:
|
||||
candidate, = os.listdir('/dev/serial/by-id')
|
||||
args.port = os.path.join('/dev/serial/by-id', candidate)
|
||||
print(f'No port given, guessing {args.port}')
|
||||
|
||||
except:
|
||||
print('No port given and could not guess port. Exiting.')
|
||||
sys.exit(1)
|
||||
|
||||
ser = serial.Serial(args.port, args.baudrate, timeout=1.0)
|
||||
db = sqlite3.connect(args.dbfile)
|
||||
db.execute('CREATE TABLE IF NOT EXISTS measurements (run_id INTEGER, rx_ts INTEGER, seq INTEGER, data BLOB)')
|
||||
db.execute('''CREATE TABLE IF NOT EXISTS errors (
|
||||
run_id INTEGER,
|
||||
rx_ts INTEGER,
|
||||
type TEXT,
|
||||
seq INTEGER,
|
||||
pid INTEGER,
|
||||
pid_expected INTEGER,
|
||||
crc32 INTEGER,
|
||||
crc32_expected INTEGER,
|
||||
data BLOB)''')
|
||||
run_id, = db.execute('SELECT IFNULL(MAX(run_id), -1) + 1 FROM measurements').fetchone()
|
||||
|
||||
ser.flushInput()
|
||||
ser.write(ctrl_reset())
|
||||
ser.flushOutput()
|
||||
|
||||
last_pid = None
|
||||
lines_written = 0
|
||||
cur = db.cursor()
|
||||
capture_start = time()
|
||||
while True:
|
||||
#ser.write(cobs.encode(b'\x01\xff') + b'\0')
|
||||
data = ser.read_until(b'\0')
|
||||
for data in data.split(b'\0')[:-1]: # data always ends on \0 due to read_until, so split off the trailing empty bytes()
|
||||
try:
|
||||
if not data:
|
||||
#print(f'{time():>7.3f} Timeout: resetting')
|
||||
#ser.write(cobs.encode(b'\x01\xff') + b'\0') # reset
|
||||
ser.write(ctrl_ack(0)) # FIXME delet this
|
||||
cur.execute('INSERT INTO errors(run_id, rx_ts, type) VALUES (?, ?, "retransmission")',
|
||||
(run_id, int(time()*1000)))
|
||||
continue
|
||||
|
||||
crc32, payload = unpack_head('I', cobs.decode(data))
|
||||
pid, seq, data = unpack_head('xBH', payload)
|
||||
ts = time()
|
||||
|
||||
# Calculate byte-wise CRC32
|
||||
our_crc = zlib.crc32(bytes(b for x in payload for b in (0, 0, 0, x)))
|
||||
#log.append((time(), seq, crc32, our_crc, pid, data))
|
||||
bars = '\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588'
|
||||
sparkline = ''.join(bars[int(x/4096*8)] for x in struct.unpack('<32H', data))
|
||||
print(f'\033[38;5;249m{ts-capture_start:>10.3f}',
|
||||
f'\033[94m{seq:05d}',
|
||||
f'\033[38;5;243m{crc32:08x}',
|
||||
f'\033[38;5;243m{our_crc:08x}',
|
||||
f'\033[38;5;243m{pid}',
|
||||
f'\033[0m{hexlify(data).decode()}',
|
||||
f'\033[94m{sparkline}\033[0m', end='')
|
||||
|
||||
error = False
|
||||
suppress_ack = False
|
||||
if crc32 != our_crc:
|
||||
print(' \033[1;91mCRC ERROR\033[0m', end='')
|
||||
suppress_ack = True
|
||||
error = True
|
||||
|
||||
if last_pid is not None and pid != (last_pid+1)%8:
|
||||
print(' \033[1;93mPID ERROR\033[0m', end='')
|
||||
error = True
|
||||
else:
|
||||
last_pid = pid
|
||||
|
||||
if not suppress_ack:
|
||||
ser.write(ctrl_ack(pid))
|
||||
ser.flushOutput()
|
||||
|
||||
if not suppress_ack:
|
||||
cur.execute('INSERT INTO measurements VALUES (?, ?, ?, ?)', (run_id, int(ts*1000), seq, data))
|
||||
if error:
|
||||
cur.execute('INSERT INTO errors VALUES (?, ?, "pid", ?, ?, ?, ?, ?, ?)',
|
||||
(run_id, int(ts*1000), seq, pid, (last_pid+1)%8, crc32, our_crc, data))
|
||||
|
||||
print()
|
||||
lines_written += 1
|
||||
if lines_written == 80:
|
||||
lines_written = 0
|
||||
print('\033[2J\033[H', end='')
|
||||
delta = ts-capture_start
|
||||
print(f'\033[7mRun {run_id}, capturing for {delta//3600//24:> 3.0f}:{delta//3600%24:02.0f}:{delta//60%60:02.0f}:{delta%60:06.3f}\033[0m')
|
||||
db.commit()
|
||||
|
||||
except Exception as e:
|
||||
print(e, len(data))
|
||||
ser.write(ctrl_ack(0)) # FIXME delet this
|
||||
|
||||
2934
hardware/grid-recorder/board_shape.dxf
Normal file
1610
hardware/grid-recorder/board_shape.slvs
Normal file
BIN
hardware/grid-recorder/bottom_overlay.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
hardware/grid-recorder/case_label.pdf
Normal file
636
hardware/grid-recorder/case_label.svg
Normal file
|
|
@ -0,0 +1,636 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg30061"
|
||||
inkscape:version="0.92.4 (unknown)"
|
||||
sodipodi:docname="case_label.svg">
|
||||
<defs
|
||||
id="defs30055">
|
||||
<clipPath
|
||||
id="clipPath32902"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32900"
|
||||
d="M 0,0 H 382.677 V 134.646 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath32940"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32938"
|
||||
d="M 0,0 H 382.677 V 134.646 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath32958"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32956"
|
||||
d="M 0,0 H 382.677 V 134.646 H 0 Z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.3003694"
|
||||
inkscape:cx="370.0435"
|
||||
inkscape:cy="789.27304"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1030"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="50"
|
||||
inkscape:window-maximized="0"
|
||||
showguides="false"
|
||||
inkscape:snap-global="false" />
|
||||
<metadata
|
||||
id="metadata30058">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff9900;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect30606-2"
|
||||
width="69.900002"
|
||||
height="99.900002"
|
||||
x="29.174892"
|
||||
y="-151.87256"
|
||||
transform="rotate(90)" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="M 146.92279,43.12507 H 122.92271 V 29.124893 H 80.922687 V 43.12507 H 56.922603 v 131.99969 h 24.000084 v 14.00018 h 42.000023 v -14.00018 h 24.00008 z"
|
||||
id="rect30606-0" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#bfbfbf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect30606-5"
|
||||
width="158"
|
||||
height="88"
|
||||
x="30.124813"
|
||||
y="-145.92256"
|
||||
rx="2.5"
|
||||
ry="2.5"
|
||||
transform="rotate(90)" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.09999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect30606"
|
||||
width="158"
|
||||
height="88"
|
||||
x="30.124817"
|
||||
y="-145.92256"
|
||||
rx="2.5"
|
||||
ry="2.5"
|
||||
transform="rotate(90)" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot30813-3"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-31.788989,29.337233)"><flowRegion
|
||||
id="flowRegion30815-7"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"><rect
|
||||
id="rect30817-5"
|
||||
width="188.21428"
|
||||
height="113.21429"
|
||||
x="479.28571"
|
||||
y="293.23398"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'" /></flowRegion><flowPara
|
||||
id="flowPara30821-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'">Power</flowPara></flowRoot> <circle
|
||||
style="opacity:1;vector-effect:none;fill:#cc0000;fill-opacity:1;stroke:none;stroke-width:0.09999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path30688-2-0"
|
||||
cx="109.12482"
|
||||
cy="-120.62611"
|
||||
r="5"
|
||||
transform="rotate(90)" />
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:#cc0000;fill-opacity:1;stroke:none;stroke-width:0.09999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path30688"
|
||||
cx="-123.18111"
|
||||
cy="120.62611"
|
||||
r="3.5999999"
|
||||
transform="rotate(-90)" />
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:#00cc00;fill-opacity:1;stroke:none;stroke-width:0.09999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path30688-1-8"
|
||||
cx="-133.85524"
|
||||
cy="120.63043"
|
||||
r="3.6000004"
|
||||
transform="rotate(-90)" />
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:#00cc00;fill-opacity:1;stroke:none;stroke-width:0.09999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path30688-1-7"
|
||||
cx="-144.52936"
|
||||
cy="120.63043"
|
||||
r="3.6000004"
|
||||
transform="rotate(-90)" />
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:#00cc00;fill-opacity:1;stroke:none;stroke-width:0.09999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path30688-1-9"
|
||||
cx="-155.20348"
|
||||
cy="120.63043"
|
||||
r="3.6000004"
|
||||
transform="rotate(-90)" />
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:#00cc00;fill-opacity:1;stroke:none;stroke-width:0.09999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path30688-1-2"
|
||||
cx="-165.87759"
|
||||
cy="120.63043"
|
||||
r="3.6000004"
|
||||
transform="rotate(-90)" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot30813"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-29.742602,43.393528)"><flowRegion
|
||||
id="flowRegion30815"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"><rect
|
||||
id="rect30817"
|
||||
width="188.21428"
|
||||
height="113.21429"
|
||||
x="479.28571"
|
||||
y="293.23398"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'" /></flowRegion><flowPara
|
||||
id="flowPara30821"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'">Error</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot30813-3-2"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-28.348517,85.640493)"><flowRegion
|
||||
id="flowRegion30815-7-2"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"><rect
|
||||
id="rect30817-5-8"
|
||||
width="188.21428"
|
||||
height="113.21429"
|
||||
x="479.28571"
|
||||
y="293.23398"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'" /></flowRegion><flowPara
|
||||
id="flowPara30821-9-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'">1pps</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot30813-3-2-7"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-33.107792,75.496203)"><flowRegion
|
||||
id="flowRegion30815-7-2-3"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"><rect
|
||||
id="rect30817-5-8-6"
|
||||
width="188.21428"
|
||||
height="113.21429"
|
||||
x="479.28571"
|
||||
y="293.23398"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'" /></flowRegion><flowPara
|
||||
id="flowPara30821-9-9-1"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'">SD Card</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot30813-3-2-7-2"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-27.321107,64.734772)"><flowRegion
|
||||
id="flowRegion30815-7-2-3-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"><rect
|
||||
id="rect30817-5-8-6-3"
|
||||
width="188.21428"
|
||||
height="113.21429"
|
||||
x="479.28571"
|
||||
y="293.23398"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'" /></flowRegion><flowPara
|
||||
id="flowPara30821-9-9-1-1"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'">USB</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot30813-3-2-7-2-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-38.239262,54.238465)"><flowRegion
|
||||
id="flowRegion30815-7-2-3-9-4"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"><rect
|
||||
id="rect30817-5-8-6-3-7"
|
||||
width="188.21428"
|
||||
height="113.21429"
|
||||
x="479.28571"
|
||||
y="293.23398"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'" /></flowRegion><flowPara
|
||||
id="flowPara30821-9-9-1-1-8">OCXO Lock</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.21068575,0,0,0.21068575,159.96044,-443.75581)"
|
||||
style="font-style:normal;font-weight:normal;font-size:26.79082298px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#404040;fill-opacity:1;stroke:none;stroke-width:1.25581968px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot4703"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:0.10406005px"
|
||||
id="flowRegion4705"><rect
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:1.25581968px"
|
||||
y="2403.8843"
|
||||
x="-438.99573"
|
||||
height="1421.0145"
|
||||
width="3218.6084"
|
||||
id="rect4707" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:26.79082298px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';fill:#404040;fill-opacity:1;stroke-width:1.25581968px"
|
||||
id="flowPara4711">Grid Measurement Platform</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.21068575,0,0,0.21068575,159.79926,-436.66485)"
|
||||
style="font-style:normal;font-weight:normal;font-size:26.79082298px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#404040;fill-opacity:1;stroke:none;stroke-width:1.25581968px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot4703-3"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:0.10406005px"
|
||||
id="flowRegion4705-6"><rect
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:1.25581968px"
|
||||
y="2403.8843"
|
||||
x="-438.99573"
|
||||
height="1421.0145"
|
||||
width="3218.6084"
|
||||
id="rect4707-7" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:26.79082298px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';fill:#404040;fill-opacity:1;stroke-width:1.25581968px"
|
||||
id="flowPara4711-5">Frequency Recorder v0.1</flowPara></flowRoot> <path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 108.32738,109.10123 h 5.11686"
|
||||
id="path32464"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 108.32738,123.18111 h 5.11686"
|
||||
id="path32464-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 108.32738,133.85524 h 5.11686"
|
||||
id="path32464-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 108.32738,144.52936 h 5.11686"
|
||||
id="path32464-43"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 108.32738,155.20348 h 5.11686"
|
||||
id="path32464-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 108.32738,165.87759 h 5.11686"
|
||||
id="path32464-78"
|
||||
inkscape:connector-curvature="0" />
|
||||
<flowRoot
|
||||
transform="matrix(0.12486648,0,0,0.12486648,122.24337,-222.31832)"
|
||||
style="font-style:normal;font-weight:normal;font-size:22.60192108px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#404040;fill-opacity:1;stroke:none;stroke-width:2.11892986px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot4703-3-6"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-size:22.60192108px;fill:#404040;fill-opacity:1;stroke-width:0.17557929px"
|
||||
id="flowRegion4705-6-8"><rect
|
||||
style="font-size:22.60192108px;fill:#404040;fill-opacity:1;stroke-width:2.11892986px"
|
||||
y="2403.8843"
|
||||
x="-438.99573"
|
||||
height="1421.0145"
|
||||
width="3218.6084"
|
||||
id="rect4707-7-8" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:22.60192108px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';fill:#404040;fill-opacity:1;stroke-width:2.11892986px"
|
||||
id="flowPara4711-5-4">master@jaseg.de</flowPara></flowRoot> <g
|
||||
id="g32629"
|
||||
transform="translate(-62.290318,1.6200773)">
|
||||
<circle
|
||||
r="2.95"
|
||||
cy="121.56103"
|
||||
cx="182.91643"
|
||||
id="path32538"
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<g
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
id="g32576">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
id="path32555"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
id="path32555-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g32635"
|
||||
transform="translate(-50.998711,-24.406418)">
|
||||
<circle
|
||||
r="4"
|
||||
cy="133.53123"
|
||||
cx="171.62482"
|
||||
id="path32538-3"
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<g
|
||||
style="fill:none;stroke:#000000;stroke-width:0.1249138;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
transform="matrix(0.80055208,0,0,0.80055208,23.642356,37.76364)"
|
||||
id="g32576-4">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1249138;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
id="path32555-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1249138;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
id="path32555-1-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-62.285992,12.294211)"
|
||||
id="g32629-6">
|
||||
<circle
|
||||
r="2.95"
|
||||
cy="121.56103"
|
||||
cx="182.91643"
|
||||
id="path32538-8"
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<g
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
id="g32576-9">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
id="path32555-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
id="path32555-1-6"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-62.285992,22.968329)"
|
||||
id="g32629-64">
|
||||
<circle
|
||||
r="2.95"
|
||||
cy="121.56103"
|
||||
cx="182.91643"
|
||||
id="path32538-9"
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<g
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
id="g32576-5">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
id="path32555-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
id="path32555-1-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-62.285992,33.642447)"
|
||||
id="g32629-8">
|
||||
<circle
|
||||
r="2.95"
|
||||
cy="121.56103"
|
||||
cx="182.91643"
|
||||
id="path32538-7"
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<g
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
id="g32576-1">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
id="path32555-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
id="path32555-1-27"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-62.285992,44.316565)"
|
||||
id="g32629-5">
|
||||
<circle
|
||||
r="2.95"
|
||||
cy="121.56103"
|
||||
cx="182.91643"
|
||||
id="path32538-94"
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<g
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
id="g32576-90">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
id="path32555-91"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
id="path32555-1-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.11623658,0,0,-0.11623658,79.67495,58.481293)"
|
||||
inkscape:label="002_Logo_1c"
|
||||
id="g32894"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
id="g32896"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
clip-path="url(#clipPath32902)"
|
||||
id="g32898"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
transform="translate(103.5419,75.0928)"
|
||||
id="g32904"
|
||||
style="stroke-width:3.03499794">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32906"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 0,0 H -1.087 L -5.856,12.265 H -6.543 L -11.502,0 h -0.992 v -0.725 h 3.643 V 0 h -1.583 l 1.393,3.433 4.883,-0.019 1.335,-3.433 H -4.349 V -0.725 H 0 Z m -8.679,4.33 2.155,5.36 2.041,-5.36 z M 8.03,1.202 H 7.344 V 0.038 H 4.139 V 7.325 H 5.57 V 8.088 H 1.259 V 7.325 h 1.43 V -0.019 H 1.259 V -0.725 H 8.03 Z M 16.137,1.049 H 15.431 V 0.038 H 12.188 V 3.376 H 14.63 V 2.422 h 0.706 V 5.074 L 14.63,5.055 V 4.139 h -2.442 v 3.186 h 3.129 V 6.333 h 0.686 V 8.469 H 15.298 V 8.088 H 9.308 V 7.382 h 1.431 V -0.019 H 9.308 v -0.706 h 6.829 z m 10.338,-1.068 h -1.03 l -2.937,3.987 2.823,3.357 h 1.03 V 8.088 H 23.29 V 7.325 h 1.087 L 22.069,4.559 20.028,7.325 h 1.125 V 8.088 H 17.415 V 7.325 h 1.011 l 2.785,-3.777 -2.995,-3.567 h -0.954 v -0.706 h 3.071 v 0.706 H 19.17 l 2.479,2.976 2.213,-2.976 h -1.164 v -0.706 h 3.777 z m 9.232,0 h -0.801 l -3.51,8.393 H 30.9 l -3.662,-8.393 h -0.725 v -0.706 h 2.671 v 0.706 h -1.088 l 0.916,2.079 h 3.471 l 0.859,-2.079 h -0.839 v -0.706 h 3.204 z m -6.371,2.823 1.45,3.357 1.392,-3.357 z M 45.53,7.325 h 1.431 V 8.088 H 43.127 V 7.325 h 1.45 V 1.869 l -5.36,6.219 H 36.756 V 7.325 h 1.335 l 0.382,-0.496 v -6.848 h -1.431 v -0.706 h 3.834 v 0.706 h -1.45 v 5.627 l 5.532,-6.485 h 0.572 z m 3.567,-8.05 h 4.521 c 2.632,0 4.616,1.889 4.616,4.406 0,2.461 -2.022,4.407 -4.616,4.407 H 49.097 V 7.382 h 1.431 v -7.401 h -1.431 z m 2.881,0.763 v 7.287 h 1.506 c 1.755,0 3.11,-1.603 3.11,-3.663 0,-2.06 -1.355,-3.624 -3.129,-3.624 z M 67.104,1.049 H 66.398 V 0.038 h -3.243 v 3.338 h 2.442 V 2.422 h 0.705 V 5.074 L 65.597,5.055 V 4.139 h -2.442 v 3.186 h 3.128 V 6.333 H 66.97 V 8.469 H 66.264 V 8.088 H 60.275 V 7.382 h 1.43 v -7.401 h -1.43 v -0.706 h 6.829 z m 10.929,-1.068 h -0.534 c -0.42,0 -0.763,0.229 -1.106,0.706 l -1.774,2.594 c 1.259,0.229 2.041,1.163 2.041,2.441 0,1.545 -0.992,2.366 -2.842,2.366 H 69.316 V 7.325 h 1.431 v -7.344 h -1.431 v -0.706 h 4.311 v 0.706 h -1.431 v 3.166 h 0.935 l 2.041,-3.071 c 0.477,-0.725 0.629,-0.801 1.469,-0.801 h 1.392 z m -5.837,7.344 h 1.336 c 0.991,0 1.526,-0.592 1.526,-1.66 0,-1.049 -0.592,-1.755 -1.507,-1.755 h -1.355 z m 18.712,0 h 0.801 V 8.088 H 88.944 V 7.325 h 1.087 l -2.404,-5.894 -2.46,5.894 h 1.201 v 0.763 h -3.7 V 7.325 h 0.935 l 3.433,-8.279 h 0.458 z m 6.142,-8.298 c 2.404,0 4.502,2.175 4.502,4.673 0,2.461 -2.098,4.617 -4.502,4.617 -2.441,0 -4.54,-2.137 -4.54,-4.617 0,-2.517 2.099,-4.673 4.54,-4.673 m -0.019,8.488 c 1.602,0 2.899,-1.697 2.899,-3.834 0,-2.155 -1.278,-3.853 -2.899,-3.853 -1.602,0 -2.88,1.717 -2.88,3.872 0,2.118 1.278,3.815 2.88,3.815 m 15.26,-0.19 h 1.43 v 0.763 h -3.834 V 7.325 h 1.45 V 1.869 l -5.36,6.219 h -2.461 V 7.325 h 1.336 l 0.381,-0.496 v -6.848 h -1.431 v -0.706 h 3.834 v 0.706 h -1.449 v 5.627 l 5.531,-6.485 h 0.573 z m 21.516,-7.344 h -1.45 v 11.178 h 1.45 v 0.705 h -4.54 v -0.705 h 1.431 V 6.085 h -7.153 v 5.074 h 1.43 v 0.705 h -4.54 v -0.705 h 1.431 V -0.019 h -1.431 v -0.706 h 4.54 v 0.706 h -1.43 v 5.245 h 7.153 v -5.245 h -1.431 v -0.706 h 4.54 z m 12.112,8.107 h -3.834 V 7.325 h 1.431 V 2.556 c 0,-1.545 -1.031,-2.651 -2.461,-2.651 -1.393,0 -2.327,1.068 -2.327,2.632 v 4.788 h 1.449 v 0.763 h -4.329 V 7.325 h 1.449 V 2.136 c 0,-1.793 1.488,-3.109 3.529,-3.109 2.174,0 3.662,1.412 3.662,3.472 v 4.826 h 1.431 z m 13.734,-8.107 h -1.431 v 7.344 h 1.431 v 0.763 h -2.976 l -3.071,-6.448 -3.014,6.448 h -2.861 V 7.325 h 1.43 v -7.344 h -1.43 v -0.706 h 3.834 v 0.706 h -1.431 V 5.97 l 3.186,-6.828 3.452,7.21 v -6.371 h -1.43 v -0.706 h 4.311 z m 7.286,-0.706 c 1.812,0 2.861,0.839 2.861,2.308 0,1.431 -1.049,2.289 -2.88,2.346 1.392,0 2.403,0.821 2.403,1.965 0,1.335 -1.03,2.194 -2.651,2.194 h -4.654 V 7.382 h 1.43 v -7.401 h -1.43 v -0.706 z m -2.041,4.197 h 1.373 c 1.259,0 1.889,-0.611 1.889,-1.793 0,-1.088 -0.649,-1.641 -1.908,-1.641 h -1.354 z m 0,3.853 h 1.354 c 0.935,0 1.431,-0.534 1.431,-1.488 0,-0.973 -0.611,-1.602 -1.564,-1.602 h -1.221 z m 11.158,-8.298 c 2.404,0 4.502,2.175 4.502,4.673 0,2.461 -2.098,4.617 -4.502,4.617 -2.441,0 -4.539,-2.137 -4.539,-4.617 0,-2.517 2.098,-4.673 4.539,-4.673 m -0.019,8.488 c 1.602,0 2.9,-1.697 2.9,-3.834 0,-2.155 -1.278,-3.853 -2.9,-3.853 -1.602,0 -2.88,1.717 -2.88,3.872 0,2.118 1.278,3.815 2.88,3.815 M 189.37,1.202 h -0.687 V 0.038 h -3.204 v 7.287 h 1.431 v 0.763 h -4.311 V 7.325 h 1.43 v -7.344 h -1.43 v -0.706 h 6.771 z m 1.278,-1.927 h 4.521 c 2.632,0 4.616,1.889 4.616,4.406 0,2.461 -2.022,4.407 -4.616,4.407 h -4.521 V 7.382 h 1.431 v -7.401 h -1.431 z m 2.88,0.763 v 7.287 h 1.507 c 1.755,0 3.109,-1.603 3.109,-3.663 0,-2.06 -1.354,-3.624 -3.128,-3.624 z m 13.6,-0.057 h -1.621 v 7.344 h 2.785 V 6.256 h 0.706 v 2.213 h -0.706 V 8.088 h -7.02 v 0.381 h -0.686 V 6.256 h 0.686 v 1.069 h 2.785 v -7.344 h -1.621 v -0.706 h 4.692 z" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(104.5316,31.5149)"
|
||||
id="g32908"
|
||||
style="stroke-width:3.03499794">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32910"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 0,0 V 10.487 H -1.981 V 0.604 c 0,-1.981 -0.145,-2.537 -0.919,-3.383 -0.797,-0.894 -1.957,-1.377 -3.334,-1.377 -1.378,0 -2.538,0.483 -3.335,1.377 -0.773,0.846 -0.918,1.402 -0.918,3.383 v 9.883 h -1.982 V 0 c 0,-2.078 0.532,-3.359 1.861,-4.446 1.184,-0.967 2.682,-1.474 4.398,-1.474 1.715,0 3.189,0.507 4.374,1.474 C -0.507,-3.359 0,-2.126 0,0 M 17.93,-5.606 V 10.487 H 15.948 V -3.021 c -0.048,0.097 -0.072,0.194 -0.096,0.242 -0.169,0.459 -0.194,0.483 -0.29,0.725 -0.073,0.145 -0.145,0.29 -0.218,0.387 L 7.443,10.487 H 4.857 V -5.461 H 6.838 V 8.361 C 6.935,8.047 6.983,7.926 7.08,7.757 7.104,7.66 7.177,7.563 7.273,7.394 7.394,7.153 7.515,6.959 7.588,6.839 l 8.046,-12.445 z m 18.606,8.192 c 0,4.591 -3.359,7.901 -8.022,7.901 H 23.197 V -5.461 h 5.292 c 2.779,0 4.447,0.652 5.897,2.32 1.377,1.57 2.15,3.648 2.15,5.727 M 34.458,2.61 c 0,-1.74 -0.797,-3.722 -1.957,-4.954 -1.015,-1.039 -2.199,-1.45 -4.302,-1.45 h -3.02 V 8.82 h 3.02 c 3.601,0 6.259,-2.658 6.259,-6.21 m 24.213,-7.467 v 6.524 h -1.982 v -5.316 c -1.28,-0.266 -1.836,-0.338 -2.634,-0.338 -3.987,0 -6.935,2.827 -6.935,6.669 0,1.571 0.58,3.093 1.571,4.253 1.232,1.426 2.682,2.03 4.929,2.03 1.281,0 2.538,-0.242 3.456,-0.628 0.193,-0.097 0.459,-0.218 0.846,-0.435 l 0.749,1.643 c -0.87,0.483 -1.233,0.652 -1.933,0.846 -0.846,0.217 -2.175,0.362 -3.311,0.362 -4.857,0 -8.433,-3.48 -8.433,-8.216 0,-4.712 3.697,-8.312 8.506,-8.312 1.329,0 2.923,0.193 4.011,0.531 0.266,0.073 0.652,0.194 1.16,0.387 M 72.71,-5.461 v 1.667 h -7.201 v 5.63 h 5.775 V 3.504 H 65.509 V 8.82 h 6.984 v 1.667 H 63.528 V -5.461 Z M 85.517,9.424 c -0.894,0.532 -1.281,0.725 -1.933,0.943 -0.822,0.265 -1.764,0.386 -2.683,0.386 -3.165,0 -5.267,-1.691 -5.267,-4.229 0,-1.643 1.014,-2.899 3.407,-4.18 1.498,-0.822 2.392,-1.281 2.658,-1.426 0.628,-0.362 1.087,-0.821 1.353,-1.305 0.169,-0.29 0.242,-0.676 0.242,-1.135 0,-1.523 -1.136,-2.417 -3.021,-2.417 -0.821,0 -1.595,0.145 -2.295,0.411 -0.556,0.217 -0.943,0.435 -1.837,1.039 L 75.126,-4.06 c 1.039,-0.7 1.45,-0.942 2.054,-1.184 0.846,-0.338 1.861,-0.531 2.948,-0.531 3.214,0 5.244,1.715 5.244,4.446 0,1.16 -0.459,2.247 -1.233,2.9 -0.579,0.507 -1.425,1.039 -2.513,1.619 -3.238,1.715 -3.938,2.319 -3.938,3.504 0,1.353 1.232,2.247 3.044,2.247 0.629,0 1.595,-0.145 2.199,-0.338 0.508,-0.17 0.846,-0.339 1.668,-0.822 z M 98.638,-5.461 v 1.667 h -7.201 v 5.63 h 5.775 V 3.504 H 91.437 V 8.82 h 6.984 v 1.667 H 89.456 V -5.461 Z m 12.952,0 v 1.667 h -7.129 V 10.487 H 102.48 V -5.461 Z m 11.961,0 v 1.667 h -7.128 v 14.281 h -1.982 V -5.461 Z m 11.816,14.885 c -0.894,0.532 -1.28,0.725 -1.933,0.943 -0.821,0.265 -1.764,0.386 -2.682,0.386 -3.166,0 -5.268,-1.691 -5.268,-4.229 0,-1.643 1.015,-2.899 3.407,-4.18 1.498,-0.822 2.392,-1.281 2.658,-1.426 0.629,-0.362 1.088,-0.821 1.354,-1.305 0.169,-0.29 0.241,-0.676 0.241,-1.135 0,-1.523 -1.136,-2.417 -3.02,-2.417 -0.822,0 -1.595,0.145 -2.296,0.411 -0.556,0.217 -0.942,0.435 -1.837,1.039 l -1.014,-1.571 c 1.039,-0.7 1.449,-0.942 2.054,-1.184 0.845,-0.338 1.86,-0.531 2.948,-0.531 3.213,0 5.243,1.715 5.243,4.446 0,1.16 -0.459,2.247 -1.232,2.9 -0.58,0.507 -1.426,1.039 -2.513,1.619 -3.238,1.715 -3.939,2.319 -3.939,3.504 0,1.353 1.232,2.247 3.045,2.247 0.628,0 1.595,-0.145 2.199,-0.338 0.507,-0.17 0.845,-0.339 1.667,-0.822 z m 15.369,-0.169 c -0.798,0.556 -1.136,0.749 -1.837,0.991 -0.942,0.362 -1.957,0.531 -2.996,0.531 -4.567,0 -8.023,-3.528 -8.023,-8.191 0,-4.906 3.407,-8.361 8.216,-8.361 0.749,0 1.402,0.072 2.199,0.266 0.798,0.193 1.184,0.338 2.151,0.773 l -0.556,1.546 c -1.281,-0.531 -2.32,-0.749 -3.673,-0.749 -3.745,0 -6.186,2.634 -6.186,6.645 0,3.649 2.416,6.259 5.799,6.259 1.547,0 2.707,-0.362 3.915,-1.208 z m 16.552,-14.716 v 15.948 h -1.981 V 3.649 h -9.4 v 6.838 h -1.982 V -5.461 h 1.982 v 7.297 h 9.4 v -7.297 z m 16.819,0 -5.921,16.407 h -2.126 l -5.945,-16.407 h 2.127 l 1.643,4.712 h 6.452 l 1.643,-4.712 z m -4.398,6.524 h -5.196 l 2.61,7.298 z m 16.189,7.757 v 1.667 h -8.965 V -5.461 h 1.982 v 7.128 h 5.775 v 1.692 h -5.775 V 8.82 Z m 13.822,0 v 1.667 H 197.106 V 8.82 h 5.317 V -5.461 h 1.981 V 8.82 Z" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32912"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 93.997,65.686 H 92.016 V 49.738 h 1.981 z m 18.341,-16.094 v 16.094 h -1.982 V 52.178 c -0.048,0.096 -0.072,0.193 -0.096,0.241 -0.17,0.46 -0.194,0.484 -0.29,0.725 -0.073,0.145 -0.145,0.29 -0.218,0.387 L 101.85,65.686 H 99.265 V 49.737 h 1.981 v 13.822 c 0.097,-0.314 0.145,-0.435 0.242,-0.604 0.024,-0.097 0.097,-0.193 0.193,-0.362 0.121,-0.242 0.242,-0.435 0.314,-0.556 l 8.047,-12.445 z m 14.232,15.03 c -0.894,0.532 -1.28,0.725 -1.933,0.943 -0.821,0.266 -1.764,0.387 -2.682,0.387 -3.166,0 -5.268,-1.692 -5.268,-4.229 0,-1.643 1.015,-2.9 3.407,-4.181 1.498,-0.821 2.392,-1.28 2.658,-1.425 0.629,-0.363 1.088,-0.822 1.353,-1.305 0.17,-0.29 0.242,-0.677 0.242,-1.136 0,-1.522 -1.136,-2.416 -3.02,-2.416 -0.822,0 -1.595,0.145 -2.296,0.41 -0.556,0.218 -0.942,0.435 -1.837,1.039 l -1.014,-1.57 c 1.039,-0.701 1.449,-0.943 2.054,-1.184 0.845,-0.339 1.86,-0.532 2.948,-0.532 3.213,0 5.243,1.716 5.243,4.446 0,1.16 -0.459,2.248 -1.232,2.9 -0.58,0.508 -1.426,1.039 -2.513,1.619 -3.238,1.716 -3.939,2.32 -3.939,3.504 0,1.353 1.232,2.247 3.045,2.247 0.628,0 1.595,-0.145 2.199,-0.338 0.507,-0.169 0.845,-0.338 1.667,-0.822 z m 14.112,-0.604 v 1.668 h -12.614 v -1.668 h 5.317 V 49.737 h 1.981 v 14.281 z m 4.833,1.668 h -1.981 V 49.738 h 1.981 z m 15.44,-1.668 v 1.668 h -12.613 v -1.668 h 5.316 V 49.737 h 1.981 v 14.281 z m 14.91,-8.82 v 10.488 h -1.982 v -9.884 c 0,-1.981 -0.145,-2.537 -0.918,-3.383 -0.798,-0.894 -1.957,-1.377 -3.335,-1.377 -1.377,0 -2.537,0.483 -3.335,1.377 -0.773,0.846 -0.918,1.402 -0.918,3.383 v 9.884 h -1.981 V 55.198 c 0,-2.078 0.531,-3.358 1.86,-4.446 1.184,-0.966 2.683,-1.474 4.398,-1.474 1.716,0 3.19,0.508 4.374,1.474 1.329,1.088 1.837,2.32 1.837,4.446 m 15.03,8.82 v 1.668 h -12.614 v -1.668 h 5.316 V 49.737 h 1.982 v 14.281 z m 17.857,0 v 1.668 h -8.965 V 49.737 h 1.981 v 7.129 h 5.776 v 1.691 h -5.776 v 5.461 z m 13.29,4.132 c 0,0.677 -0.532,1.209 -1.208,1.209 -0.677,0 -1.208,-0.532 -1.208,-1.209 0,-0.676 0.531,-1.208 1.208,-1.208 0.676,0 1.208,0.532 1.208,1.208 m -4.881,0 c 0,0.677 -0.532,1.209 -1.208,1.209 -0.677,0 -1.209,-0.532 -1.209,-1.209 0,-0.676 0.532,-1.208 1.209,-1.208 0.676,0 1.208,0.532 1.208,1.208 m 7.297,-12.952 v 10.488 h -1.981 v -9.884 c 0,-1.981 -0.145,-2.537 -0.918,-3.383 -0.798,-0.894 -1.958,-1.377 -3.335,-1.377 -1.377,0 -2.537,0.483 -3.335,1.377 -0.773,0.846 -0.918,1.402 -0.918,3.383 v 9.884 H 211.99 V 55.198 c 0,-2.078 0.531,-3.358 1.86,-4.446 1.184,-0.966 2.682,-1.474 4.398,-1.474 1.716,0 3.19,0.508 4.374,1.474 1.329,1.088 1.836,2.32 1.836,4.446 m 15.635,-5.461 -4.712,7.129 c 1.184,0.266 1.764,0.555 2.416,1.208 0.894,0.846 1.402,2.054 1.402,3.31 0,1.209 -0.484,2.369 -1.257,3.118 -0.918,0.894 -1.836,1.184 -3.77,1.184 h -4.857 V 49.737 h 1.982 v 6.839 h 2.126 l 4.398,-6.839 z m -3.021,11.623 c 0,-2.054 -1.087,-3.117 -3.19,-3.117 h -2.585 v 5.775 h 2.585 c 1.426,0 1.837,-0.072 2.32,-0.459 0.58,-0.459 0.87,-1.184 0.87,-2.199 m 14.378,4.326 h -1.981 V 49.738 h 1.981 z m 18.34,-16.094 v 16.094 h -1.981 V 52.178 c -0.048,0.096 -0.073,0.193 -0.097,0.241 -0.169,0.46 -0.193,0.484 -0.29,0.725 -0.072,0.145 -0.145,0.29 -0.217,0.387 l -7.902,12.155 h -2.586 V 49.737 h 1.982 v 13.822 c 0.097,-0.314 0.145,-0.435 0.242,-0.604 0.024,-0.097 0.096,-0.193 0.193,-0.362 0.121,-0.242 0.242,-0.435 0.314,-0.556 l 8.047,-12.445 z m 15.441,14.426 v 1.668 h -12.614 v -1.668 h 5.316 V 49.737 h 1.982 v 14.281 z m 12.034,-14.281 v 1.668 h -7.201 v 5.63 h 5.775 v 1.667 h -5.775 v 5.316 h 6.983 v 1.668 h -8.965 V 49.737 Z m 14.619,0 -4.712,7.129 c 1.184,0.266 1.764,0.555 2.416,1.208 0.894,0.846 1.402,2.054 1.402,3.31 0,1.209 -0.484,2.369 -1.257,3.118 -0.918,0.894 -1.836,1.184 -3.769,1.184 h -4.858 V 49.737 h 1.982 v 6.839 h 2.126 l 4.398,-6.839 z m -3.021,11.623 c 0,-2.054 -1.087,-3.117 -3.189,-3.117 h -2.586 v 5.775 h 2.586 c 1.425,0 1.836,-0.072 2.319,-0.459 0.58,-0.459 0.87,-1.184 0.87,-2.199 M 328.291,49.592 V 65.686 H 326.31 V 52.178 c -0.048,0.096 -0.073,0.193 -0.097,0.241 -0.169,0.46 -0.193,0.484 -0.29,0.725 -0.072,0.145 -0.145,0.29 -0.217,0.387 l -7.902,12.155 h -2.586 V 49.737 h 1.982 v 13.822 c 0.097,-0.314 0.145,-0.435 0.242,-0.604 0.024,-0.097 0.096,-0.193 0.193,-0.362 0.121,-0.242 0.242,-0.435 0.314,-0.556 l 8.047,-12.445 z m 14.45,0.145 v 1.668 h -7.201 v 5.63 h 5.776 v 1.667 h -5.776 v 5.316 h 6.984 v 1.668 h -8.965 V 49.737 Z m 14.015,14.281 v 1.668 h -12.613 v -1.668 h 5.316 V 49.737 h 1.981 v 14.281 z" />
|
||||
<g
|
||||
transform="translate(26.0438,59.5232)"
|
||||
id="g32914"
|
||||
style="stroke-width:3.03499794">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32916"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 0,0 c 0,-0.006 -0.001,-0.012 -0.001,-0.019 0,-18.626 9.962,-33.839 27.075,-33.839 17.099,0 27.075,15.213 27.075,33.839 0,0.007 -10e-4,0.013 -10e-4,0.019 z" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32918"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 44.569,50.357 h 17.077 v 2.049 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32920"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 44.569,54.484 h 17.077 v 2.049 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32922"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 44.569,37.975 h 17.077 v 2.049 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32924"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 44.569,42.103 h 17.077 v 2.049 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32926"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 44.569,46.23 h 17.077 v 2.049 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32928"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 44.569,29.721 H 61.646 V 31.77 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32930"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 44.569,33.848 h 17.077 v 2.049 H 44.569 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32932"
|
||||
style="fill:#a7a5a6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 80.204,61.599 H 54.161 v 26.043 h 26.043 z" />
|
||||
<g
|
||||
id="g32934"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
clip-path="url(#clipPath32940)"
|
||||
id="g32936"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
transform="translate(60.3389,74.6067)"
|
||||
id="g32942"
|
||||
style="stroke-width:3.03499794">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32944"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 0,0 c 0,3.802 3.07,6.872 6.843,6.872 3.802,0 6.844,-3.07 6.844,-6.872 0,-3.774 -3.042,-6.843 -6.844,-6.843 C 3.07,-6.843 0,-3.774 0,0 m 11.828,0 c 0,2.76 -2.225,4.985 -4.985,4.985 C 4.112,4.985 1.859,2.76 1.859,0 c 0,-2.732 2.253,-4.957 4.984,-4.957 2.76,0 4.985,2.225 4.985,4.957" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32946"
|
||||
style="fill:#656263;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 52.086,61.599 H 26.043 v 26.043 h 26.043 z" />
|
||||
<g
|
||||
transform="translate(35.5144,69.5322)"
|
||||
id="g32948"
|
||||
style="stroke-width:3.03499794">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32950"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="M 0,0 H 2.577 V 10.177 H 0 V 11.15 H 7.1 V 10.177 H 4.55 V 0 H 7.1 V -0.973 H 0 Z" />
|
||||
</g>
|
||||
<g
|
||||
id="g32952"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
clip-path="url(#clipPath32958)"
|
||||
id="g32954"
|
||||
style="stroke-width:3.03499794">
|
||||
<g
|
||||
transform="translate(69.6443,104.3782)"
|
||||
id="g32960"
|
||||
style="stroke-width:3.03499794">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32962"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 0,0 h -11.099 c -0.507,1.839 -1.833,4.224 -5.32,4.224 -3.486,0 -4.826,-2.385 -5.344,-4.224 H -32.874 V -2.135 H 0 Z" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32964"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 36.77,90.413 h 2.135 v 10.531 H 36.77 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32966"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 42.107,90.413 h 2.135 v 10.531 h -2.135 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32968"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 47.444,90.413 h 2.135 v 10.531 h -2.135 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32970"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 56.836,90.413 h 2.135 v 10.531 h -2.135 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32972"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 62.173,90.413 h 2.135 v 10.531 h -2.135 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32974"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
d="m 67.51,90.413 h 2.135 v 10.531 H 67.51 Z" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 46 KiB |
BIN
hardware/grid-recorder/case_label_print.pdf
Normal file
573
hardware/grid-recorder/case_label_print.svg
Normal file
|
|
@ -0,0 +1,573 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg1080"
|
||||
inkscape:version="0.92.4 (unknown)"
|
||||
sodipodi:docname="case_label_print.svg">
|
||||
<defs
|
||||
id="defs1074">
|
||||
<clipPath
|
||||
id="clipPath32902"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32900"
|
||||
d="M 0,0 H 382.677 V 134.646 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath32940"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32938"
|
||||
d="M 0,0 H 382.677 V 134.646 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath32958"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32956"
|
||||
d="M 0,0 H 382.677 V 134.646 H 0 Z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="441.29108"
|
||||
inkscape:cy="726.82755"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1030"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="50"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata1077">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
id="g2017"
|
||||
transform="rotate(-90,22.111604,129.74548)">
|
||||
<rect
|
||||
transform="rotate(90)"
|
||||
ry="2.5"
|
||||
rx="2.5"
|
||||
y="-139.7619"
|
||||
x="134.33328"
|
||||
height="86"
|
||||
width="156"
|
||||
id="rect30606-3"
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.09999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<flowRoot
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-36.949646,132.54568)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot30813-3"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"
|
||||
id="flowRegion30815-7"><rect
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"
|
||||
y="293.23398"
|
||||
x="479.28571"
|
||||
height="113.21429"
|
||||
width="188.21428"
|
||||
id="rect30817-5" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"
|
||||
id="flowPara30821-9">Power</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-34.903258,146.60198)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot30813"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"
|
||||
id="flowRegion30815"><rect
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"
|
||||
y="293.23398"
|
||||
x="479.28571"
|
||||
height="113.21429"
|
||||
width="188.21428"
|
||||
id="rect30817" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold'"
|
||||
id="flowPara30821">Error</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-33.509174,188.84894)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot30813-3-2"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowRegion30815-7-2"><rect
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
y="293.23398"
|
||||
x="479.28571"
|
||||
height="113.21429"
|
||||
width="188.21428"
|
||||
id="rect30817-5-8" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowPara30821-9-9">1pps</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-38.268449,178.70466)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot30813-3-2-7"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowRegion30815-7-2-3"><rect
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
y="293.23398"
|
||||
x="479.28571"
|
||||
height="113.21429"
|
||||
width="188.21428"
|
||||
id="rect30817-5-8-6" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowPara30821-9-9-1">SD Card</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-32.481765,167.94322)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot30813-3-2-7-2"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowRegion30815-7-2-3-9"><rect
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
y="293.23398"
|
||||
x="479.28571"
|
||||
height="113.21429"
|
||||
width="188.21428"
|
||||
id="rect30817-5-8-6-3" /></flowRegion><flowPara
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowPara30821-9-9-1-1">USB</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-43.399918,157.44692)"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="flowRoot30813-3-2-7-2-9"
|
||||
xml:space="preserve"><flowRegion
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
id="flowRegion30815-7-2-3-9-4"><rect
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light'"
|
||||
y="293.23398"
|
||||
x="479.28571"
|
||||
height="113.21429"
|
||||
width="188.21428"
|
||||
id="rect30817-5-8-6-3-7" /></flowRegion><flowPara
|
||||
id="flowPara30821-9-9-1-1-8">OCXO Lock</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4703"
|
||||
style="font-style:normal;font-weight:normal;font-size:26.79082298px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#404040;fill-opacity:1;stroke:none;stroke-width:1.25581968px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.21068575,0,0,0.21068575,154.79978,-340.54735)"><flowRegion
|
||||
id="flowRegion4705"
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:0.10406005px"><rect
|
||||
id="rect4707"
|
||||
width="3218.6084"
|
||||
height="1421.0145"
|
||||
x="-438.99573"
|
||||
y="2403.8843"
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:1.25581968px" /></flowRegion><flowPara
|
||||
id="flowPara4711"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:26.79082298px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Bold';fill:#404040;fill-opacity:1;stroke-width:1.25581968px">Grid Measurement Platform</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4703-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:26.79082298px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#404040;fill-opacity:1;stroke:none;stroke-width:1.25581968px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.21068575,0,0,0.21068575,154.6386,-333.45638)"><flowRegion
|
||||
id="flowRegion4705-6"
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:0.10406005px"><rect
|
||||
id="rect4707-7"
|
||||
width="3218.6084"
|
||||
height="1421.0145"
|
||||
x="-438.99573"
|
||||
y="2403.8843"
|
||||
style="font-size:26.79082298px;fill:#404040;fill-opacity:1;stroke-width:1.25581968px" /></flowRegion><flowPara
|
||||
id="flowPara4711-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:26.79082298px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';fill:#404040;fill-opacity:1;stroke-width:1.25581968px">Frequency Recorder v0.1</flowPara></flowRoot> <path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32464"
|
||||
d="m 103.16673,212.30968 h 5.11686"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32464-7"
|
||||
d="m 103.16673,226.38956 h 5.11686"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32464-4"
|
||||
d="m 103.16673,237.06369 h 5.11686"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32464-43"
|
||||
d="m 103.16673,247.73781 h 5.11686"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32464-0"
|
||||
d="m 103.16673,258.41193 h 5.11686"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32464-78"
|
||||
d="m 103.16673,269.08604 h 5.11686"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4703-3-6"
|
||||
style="font-style:normal;font-weight:normal;font-size:22.60192108px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#404040;fill-opacity:1;stroke:none;stroke-width:2.11892986px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.12486648,0,0,0.12486648,117.08272,-119.10986)"><flowRegion
|
||||
id="flowRegion4705-6-8"
|
||||
style="font-size:22.60192108px;fill:#404040;fill-opacity:1;stroke-width:0.17557929px"><rect
|
||||
id="rect4707-7-8"
|
||||
width="3218.6084"
|
||||
height="1421.0145"
|
||||
x="-438.99573"
|
||||
y="2403.8843"
|
||||
style="font-size:22.60192108px;fill:#404040;fill-opacity:1;stroke-width:2.11892986px" /></flowRegion><flowPara
|
||||
id="flowPara4711-5-4"
|
||||
style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:22.60192108px;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Light';fill:#404040;fill-opacity:1;stroke-width:2.11892986px">master@jaseg.de</flowPara></flowRoot> <g
|
||||
transform="translate(-67.450979,104.82853)"
|
||||
id="g32629">
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path32538"
|
||||
cx="182.91643"
|
||||
cy="121.56103"
|
||||
r="2.95" />
|
||||
<g
|
||||
id="g32576"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-1"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-56.159369,78.802034)"
|
||||
id="g32635">
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path32538-3"
|
||||
cx="171.62482"
|
||||
cy="133.53123"
|
||||
r="4" />
|
||||
<g
|
||||
id="g32576-4"
|
||||
transform="matrix(0.80055208,0,0,0.80055208,23.642356,37.76364)"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.1249138;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-9"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1249138;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-1-2"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.1249138;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g32629-6"
|
||||
transform="translate(-67.446649,115.50266)">
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path32538-8"
|
||||
cx="182.91643"
|
||||
cy="121.56103"
|
||||
r="2.95" />
|
||||
<g
|
||||
id="g32576-9"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-2"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-1-6"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g32629-64"
|
||||
transform="translate(-67.446649,126.17678)">
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path32538-9"
|
||||
cx="182.91643"
|
||||
cy="121.56103"
|
||||
r="2.95" />
|
||||
<g
|
||||
id="g32576-5"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-0"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-1-4"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g32629-8"
|
||||
transform="translate(-67.446649,136.8509)">
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path32538-7"
|
||||
cx="182.91643"
|
||||
cy="121.56103"
|
||||
r="2.95" />
|
||||
<g
|
||||
id="g32576-1"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-7"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-1-27"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g32629-5"
|
||||
transform="translate(-67.446649,147.52502)">
|
||||
<circle
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path32538-94"
|
||||
cx="182.91643"
|
||||
cy="121.56103"
|
||||
r="2.95" />
|
||||
<g
|
||||
id="g32576-90"
|
||||
transform="matrix(0.60801424,0,0,0.60801424,70.524675,48.826151)"
|
||||
style="stroke-width:0.16446982;stroke-miterlimit:4;stroke-dasharray:none">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-91"
|
||||
d="m 184.85051,114.69284 v 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path32555-1-7"
|
||||
d="m 179.91642,119.62693 h 9.86819"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16446982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32894"
|
||||
inkscape:label="002_Logo_1c"
|
||||
transform="matrix(0.11623658,0,0,-0.11623658,74.514296,161.68975)">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32896">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32898"
|
||||
clip-path="url(#clipPath32902)">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32904"
|
||||
transform="translate(103.5419,75.0928)">
|
||||
<path
|
||||
d="M 0,0 H -1.087 L -5.856,12.265 H -6.543 L -11.502,0 h -0.992 v -0.725 h 3.643 V 0 h -1.583 l 1.393,3.433 4.883,-0.019 1.335,-3.433 H -4.349 V -0.725 H 0 Z m -8.679,4.33 2.155,5.36 2.041,-5.36 z M 8.03,1.202 H 7.344 V 0.038 H 4.139 V 7.325 H 5.57 V 8.088 H 1.259 V 7.325 h 1.43 V -0.019 H 1.259 V -0.725 H 8.03 Z M 16.137,1.049 H 15.431 V 0.038 H 12.188 V 3.376 H 14.63 V 2.422 h 0.706 V 5.074 L 14.63,5.055 V 4.139 h -2.442 v 3.186 h 3.129 V 6.333 h 0.686 V 8.469 H 15.298 V 8.088 H 9.308 V 7.382 h 1.431 V -0.019 H 9.308 v -0.706 h 6.829 z m 10.338,-1.068 h -1.03 l -2.937,3.987 2.823,3.357 h 1.03 V 8.088 H 23.29 V 7.325 h 1.087 L 22.069,4.559 20.028,7.325 h 1.125 V 8.088 H 17.415 V 7.325 h 1.011 l 2.785,-3.777 -2.995,-3.567 h -0.954 v -0.706 h 3.071 v 0.706 H 19.17 l 2.479,2.976 2.213,-2.976 h -1.164 v -0.706 h 3.777 z m 9.232,0 h -0.801 l -3.51,8.393 H 30.9 l -3.662,-8.393 h -0.725 v -0.706 h 2.671 v 0.706 h -1.088 l 0.916,2.079 h 3.471 l 0.859,-2.079 h -0.839 v -0.706 h 3.204 z m -6.371,2.823 1.45,3.357 1.392,-3.357 z M 45.53,7.325 h 1.431 V 8.088 H 43.127 V 7.325 h 1.45 V 1.869 l -5.36,6.219 H 36.756 V 7.325 h 1.335 l 0.382,-0.496 v -6.848 h -1.431 v -0.706 h 3.834 v 0.706 h -1.45 v 5.627 l 5.532,-6.485 h 0.572 z m 3.567,-8.05 h 4.521 c 2.632,0 4.616,1.889 4.616,4.406 0,2.461 -2.022,4.407 -4.616,4.407 H 49.097 V 7.382 h 1.431 v -7.401 h -1.431 z m 2.881,0.763 v 7.287 h 1.506 c 1.755,0 3.11,-1.603 3.11,-3.663 0,-2.06 -1.355,-3.624 -3.129,-3.624 z M 67.104,1.049 H 66.398 V 0.038 h -3.243 v 3.338 h 2.442 V 2.422 h 0.705 V 5.074 L 65.597,5.055 V 4.139 h -2.442 v 3.186 h 3.128 V 6.333 H 66.97 V 8.469 H 66.264 V 8.088 H 60.275 V 7.382 h 1.43 v -7.401 h -1.43 v -0.706 h 6.829 z m 10.929,-1.068 h -0.534 c -0.42,0 -0.763,0.229 -1.106,0.706 l -1.774,2.594 c 1.259,0.229 2.041,1.163 2.041,2.441 0,1.545 -0.992,2.366 -2.842,2.366 H 69.316 V 7.325 h 1.431 v -7.344 h -1.431 v -0.706 h 4.311 v 0.706 h -1.431 v 3.166 h 0.935 l 2.041,-3.071 c 0.477,-0.725 0.629,-0.801 1.469,-0.801 h 1.392 z m -5.837,7.344 h 1.336 c 0.991,0 1.526,-0.592 1.526,-1.66 0,-1.049 -0.592,-1.755 -1.507,-1.755 h -1.355 z m 18.712,0 h 0.801 V 8.088 H 88.944 V 7.325 h 1.087 l -2.404,-5.894 -2.46,5.894 h 1.201 v 0.763 h -3.7 V 7.325 h 0.935 l 3.433,-8.279 h 0.458 z m 6.142,-8.298 c 2.404,0 4.502,2.175 4.502,4.673 0,2.461 -2.098,4.617 -4.502,4.617 -2.441,0 -4.54,-2.137 -4.54,-4.617 0,-2.517 2.099,-4.673 4.54,-4.673 m -0.019,8.488 c 1.602,0 2.899,-1.697 2.899,-3.834 0,-2.155 -1.278,-3.853 -2.899,-3.853 -1.602,0 -2.88,1.717 -2.88,3.872 0,2.118 1.278,3.815 2.88,3.815 m 15.26,-0.19 h 1.43 v 0.763 h -3.834 V 7.325 h 1.45 V 1.869 l -5.36,6.219 h -2.461 V 7.325 h 1.336 l 0.381,-0.496 v -6.848 h -1.431 v -0.706 h 3.834 v 0.706 h -1.449 v 5.627 l 5.531,-6.485 h 0.573 z m 21.516,-7.344 h -1.45 v 11.178 h 1.45 v 0.705 h -4.54 v -0.705 h 1.431 V 6.085 h -7.153 v 5.074 h 1.43 v 0.705 h -4.54 v -0.705 h 1.431 V -0.019 h -1.431 v -0.706 h 4.54 v 0.706 h -1.43 v 5.245 h 7.153 v -5.245 h -1.431 v -0.706 h 4.54 z m 12.112,8.107 h -3.834 V 7.325 h 1.431 V 2.556 c 0,-1.545 -1.031,-2.651 -2.461,-2.651 -1.393,0 -2.327,1.068 -2.327,2.632 v 4.788 h 1.449 v 0.763 h -4.329 V 7.325 h 1.449 V 2.136 c 0,-1.793 1.488,-3.109 3.529,-3.109 2.174,0 3.662,1.412 3.662,3.472 v 4.826 h 1.431 z m 13.734,-8.107 h -1.431 v 7.344 h 1.431 v 0.763 h -2.976 l -3.071,-6.448 -3.014,6.448 h -2.861 V 7.325 h 1.43 v -7.344 h -1.43 v -0.706 h 3.834 v 0.706 h -1.431 V 5.97 l 3.186,-6.828 3.452,7.21 v -6.371 h -1.43 v -0.706 h 4.311 z m 7.286,-0.706 c 1.812,0 2.861,0.839 2.861,2.308 0,1.431 -1.049,2.289 -2.88,2.346 1.392,0 2.403,0.821 2.403,1.965 0,1.335 -1.03,2.194 -2.651,2.194 h -4.654 V 7.382 h 1.43 v -7.401 h -1.43 v -0.706 z m -2.041,4.197 h 1.373 c 1.259,0 1.889,-0.611 1.889,-1.793 0,-1.088 -0.649,-1.641 -1.908,-1.641 h -1.354 z m 0,3.853 h 1.354 c 0.935,0 1.431,-0.534 1.431,-1.488 0,-0.973 -0.611,-1.602 -1.564,-1.602 h -1.221 z m 11.158,-8.298 c 2.404,0 4.502,2.175 4.502,4.673 0,2.461 -2.098,4.617 -4.502,4.617 -2.441,0 -4.539,-2.137 -4.539,-4.617 0,-2.517 2.098,-4.673 4.539,-4.673 m -0.019,8.488 c 1.602,0 2.9,-1.697 2.9,-3.834 0,-2.155 -1.278,-3.853 -2.9,-3.853 -1.602,0 -2.88,1.717 -2.88,3.872 0,2.118 1.278,3.815 2.88,3.815 M 189.37,1.202 h -0.687 V 0.038 h -3.204 v 7.287 h 1.431 v 0.763 h -4.311 V 7.325 h 1.43 v -7.344 h -1.43 v -0.706 h 6.771 z m 1.278,-1.927 h 4.521 c 2.632,0 4.616,1.889 4.616,4.406 0,2.461 -2.022,4.407 -4.616,4.407 h -4.521 V 7.382 h 1.431 v -7.401 h -1.431 z m 2.88,0.763 v 7.287 h 1.507 c 1.755,0 3.109,-1.603 3.109,-3.663 0,-2.06 -1.354,-3.624 -3.128,-3.624 z m 13.6,-0.057 h -1.621 v 7.344 h 2.785 V 6.256 h 0.706 v 2.213 h -0.706 V 8.088 h -7.02 v 0.381 h -0.686 V 6.256 h 0.686 v 1.069 h 2.785 v -7.344 h -1.621 v -0.706 h 4.692 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32906"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32908"
|
||||
transform="translate(104.5316,31.5149)">
|
||||
<path
|
||||
d="M 0,0 V 10.487 H -1.981 V 0.604 c 0,-1.981 -0.145,-2.537 -0.919,-3.383 -0.797,-0.894 -1.957,-1.377 -3.334,-1.377 -1.378,0 -2.538,0.483 -3.335,1.377 -0.773,0.846 -0.918,1.402 -0.918,3.383 v 9.883 h -1.982 V 0 c 0,-2.078 0.532,-3.359 1.861,-4.446 1.184,-0.967 2.682,-1.474 4.398,-1.474 1.715,0 3.189,0.507 4.374,1.474 C -0.507,-3.359 0,-2.126 0,0 M 17.93,-5.606 V 10.487 H 15.948 V -3.021 c -0.048,0.097 -0.072,0.194 -0.096,0.242 -0.169,0.459 -0.194,0.483 -0.29,0.725 -0.073,0.145 -0.145,0.29 -0.218,0.387 L 7.443,10.487 H 4.857 V -5.461 H 6.838 V 8.361 C 6.935,8.047 6.983,7.926 7.08,7.757 7.104,7.66 7.177,7.563 7.273,7.394 7.394,7.153 7.515,6.959 7.588,6.839 l 8.046,-12.445 z m 18.606,8.192 c 0,4.591 -3.359,7.901 -8.022,7.901 H 23.197 V -5.461 h 5.292 c 2.779,0 4.447,0.652 5.897,2.32 1.377,1.57 2.15,3.648 2.15,5.727 M 34.458,2.61 c 0,-1.74 -0.797,-3.722 -1.957,-4.954 -1.015,-1.039 -2.199,-1.45 -4.302,-1.45 h -3.02 V 8.82 h 3.02 c 3.601,0 6.259,-2.658 6.259,-6.21 m 24.213,-7.467 v 6.524 h -1.982 v -5.316 c -1.28,-0.266 -1.836,-0.338 -2.634,-0.338 -3.987,0 -6.935,2.827 -6.935,6.669 0,1.571 0.58,3.093 1.571,4.253 1.232,1.426 2.682,2.03 4.929,2.03 1.281,0 2.538,-0.242 3.456,-0.628 0.193,-0.097 0.459,-0.218 0.846,-0.435 l 0.749,1.643 c -0.87,0.483 -1.233,0.652 -1.933,0.846 -0.846,0.217 -2.175,0.362 -3.311,0.362 -4.857,0 -8.433,-3.48 -8.433,-8.216 0,-4.712 3.697,-8.312 8.506,-8.312 1.329,0 2.923,0.193 4.011,0.531 0.266,0.073 0.652,0.194 1.16,0.387 M 72.71,-5.461 v 1.667 h -7.201 v 5.63 h 5.775 V 3.504 H 65.509 V 8.82 h 6.984 v 1.667 H 63.528 V -5.461 Z M 85.517,9.424 c -0.894,0.532 -1.281,0.725 -1.933,0.943 -0.822,0.265 -1.764,0.386 -2.683,0.386 -3.165,0 -5.267,-1.691 -5.267,-4.229 0,-1.643 1.014,-2.899 3.407,-4.18 1.498,-0.822 2.392,-1.281 2.658,-1.426 0.628,-0.362 1.087,-0.821 1.353,-1.305 0.169,-0.29 0.242,-0.676 0.242,-1.135 0,-1.523 -1.136,-2.417 -3.021,-2.417 -0.821,0 -1.595,0.145 -2.295,0.411 -0.556,0.217 -0.943,0.435 -1.837,1.039 L 75.126,-4.06 c 1.039,-0.7 1.45,-0.942 2.054,-1.184 0.846,-0.338 1.861,-0.531 2.948,-0.531 3.214,0 5.244,1.715 5.244,4.446 0,1.16 -0.459,2.247 -1.233,2.9 -0.579,0.507 -1.425,1.039 -2.513,1.619 -3.238,1.715 -3.938,2.319 -3.938,3.504 0,1.353 1.232,2.247 3.044,2.247 0.629,0 1.595,-0.145 2.199,-0.338 0.508,-0.17 0.846,-0.339 1.668,-0.822 z M 98.638,-5.461 v 1.667 h -7.201 v 5.63 h 5.775 V 3.504 H 91.437 V 8.82 h 6.984 v 1.667 H 89.456 V -5.461 Z m 12.952,0 v 1.667 h -7.129 V 10.487 H 102.48 V -5.461 Z m 11.961,0 v 1.667 h -7.128 v 14.281 h -1.982 V -5.461 Z m 11.816,14.885 c -0.894,0.532 -1.28,0.725 -1.933,0.943 -0.821,0.265 -1.764,0.386 -2.682,0.386 -3.166,0 -5.268,-1.691 -5.268,-4.229 0,-1.643 1.015,-2.899 3.407,-4.18 1.498,-0.822 2.392,-1.281 2.658,-1.426 0.629,-0.362 1.088,-0.821 1.354,-1.305 0.169,-0.29 0.241,-0.676 0.241,-1.135 0,-1.523 -1.136,-2.417 -3.02,-2.417 -0.822,0 -1.595,0.145 -2.296,0.411 -0.556,0.217 -0.942,0.435 -1.837,1.039 l -1.014,-1.571 c 1.039,-0.7 1.449,-0.942 2.054,-1.184 0.845,-0.338 1.86,-0.531 2.948,-0.531 3.213,0 5.243,1.715 5.243,4.446 0,1.16 -0.459,2.247 -1.232,2.9 -0.58,0.507 -1.426,1.039 -2.513,1.619 -3.238,1.715 -3.939,2.319 -3.939,3.504 0,1.353 1.232,2.247 3.045,2.247 0.628,0 1.595,-0.145 2.199,-0.338 0.507,-0.17 0.845,-0.339 1.667,-0.822 z m 15.369,-0.169 c -0.798,0.556 -1.136,0.749 -1.837,0.991 -0.942,0.362 -1.957,0.531 -2.996,0.531 -4.567,0 -8.023,-3.528 -8.023,-8.191 0,-4.906 3.407,-8.361 8.216,-8.361 0.749,0 1.402,0.072 2.199,0.266 0.798,0.193 1.184,0.338 2.151,0.773 l -0.556,1.546 c -1.281,-0.531 -2.32,-0.749 -3.673,-0.749 -3.745,0 -6.186,2.634 -6.186,6.645 0,3.649 2.416,6.259 5.799,6.259 1.547,0 2.707,-0.362 3.915,-1.208 z m 16.552,-14.716 v 15.948 h -1.981 V 3.649 h -9.4 v 6.838 h -1.982 V -5.461 h 1.982 v 7.297 h 9.4 v -7.297 z m 16.819,0 -5.921,16.407 h -2.126 l -5.945,-16.407 h 2.127 l 1.643,4.712 h 6.452 l 1.643,-4.712 z m -4.398,6.524 h -5.196 l 2.61,7.298 z m 16.189,7.757 v 1.667 h -8.965 V -5.461 h 1.982 v 7.128 h 5.775 v 1.692 h -5.775 V 8.82 Z m 13.822,0 v 1.667 H 197.106 V 8.82 h 5.317 V -5.461 h 1.981 V 8.82 Z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32910"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
d="M 93.997,65.686 H 92.016 V 49.738 h 1.981 z m 18.341,-16.094 v 16.094 h -1.982 V 52.178 c -0.048,0.096 -0.072,0.193 -0.096,0.241 -0.17,0.46 -0.194,0.484 -0.29,0.725 -0.073,0.145 -0.145,0.29 -0.218,0.387 L 101.85,65.686 H 99.265 V 49.737 h 1.981 v 13.822 c 0.097,-0.314 0.145,-0.435 0.242,-0.604 0.024,-0.097 0.097,-0.193 0.193,-0.362 0.121,-0.242 0.242,-0.435 0.314,-0.556 l 8.047,-12.445 z m 14.232,15.03 c -0.894,0.532 -1.28,0.725 -1.933,0.943 -0.821,0.266 -1.764,0.387 -2.682,0.387 -3.166,0 -5.268,-1.692 -5.268,-4.229 0,-1.643 1.015,-2.9 3.407,-4.181 1.498,-0.821 2.392,-1.28 2.658,-1.425 0.629,-0.363 1.088,-0.822 1.353,-1.305 0.17,-0.29 0.242,-0.677 0.242,-1.136 0,-1.522 -1.136,-2.416 -3.02,-2.416 -0.822,0 -1.595,0.145 -2.296,0.41 -0.556,0.218 -0.942,0.435 -1.837,1.039 l -1.014,-1.57 c 1.039,-0.701 1.449,-0.943 2.054,-1.184 0.845,-0.339 1.86,-0.532 2.948,-0.532 3.213,0 5.243,1.716 5.243,4.446 0,1.16 -0.459,2.248 -1.232,2.9 -0.58,0.508 -1.426,1.039 -2.513,1.619 -3.238,1.716 -3.939,2.32 -3.939,3.504 0,1.353 1.232,2.247 3.045,2.247 0.628,0 1.595,-0.145 2.199,-0.338 0.507,-0.169 0.845,-0.338 1.667,-0.822 z m 14.112,-0.604 v 1.668 h -12.614 v -1.668 h 5.317 V 49.737 h 1.981 v 14.281 z m 4.833,1.668 h -1.981 V 49.738 h 1.981 z m 15.44,-1.668 v 1.668 h -12.613 v -1.668 h 5.316 V 49.737 h 1.981 v 14.281 z m 14.91,-8.82 v 10.488 h -1.982 v -9.884 c 0,-1.981 -0.145,-2.537 -0.918,-3.383 -0.798,-0.894 -1.957,-1.377 -3.335,-1.377 -1.377,0 -2.537,0.483 -3.335,1.377 -0.773,0.846 -0.918,1.402 -0.918,3.383 v 9.884 h -1.981 V 55.198 c 0,-2.078 0.531,-3.358 1.86,-4.446 1.184,-0.966 2.683,-1.474 4.398,-1.474 1.716,0 3.19,0.508 4.374,1.474 1.329,1.088 1.837,2.32 1.837,4.446 m 15.03,8.82 v 1.668 h -12.614 v -1.668 h 5.316 V 49.737 h 1.982 v 14.281 z m 17.857,0 v 1.668 h -8.965 V 49.737 h 1.981 v 7.129 h 5.776 v 1.691 h -5.776 v 5.461 z m 13.29,4.132 c 0,0.677 -0.532,1.209 -1.208,1.209 -0.677,0 -1.208,-0.532 -1.208,-1.209 0,-0.676 0.531,-1.208 1.208,-1.208 0.676,0 1.208,0.532 1.208,1.208 m -4.881,0 c 0,0.677 -0.532,1.209 -1.208,1.209 -0.677,0 -1.209,-0.532 -1.209,-1.209 0,-0.676 0.532,-1.208 1.209,-1.208 0.676,0 1.208,0.532 1.208,1.208 m 7.297,-12.952 v 10.488 h -1.981 v -9.884 c 0,-1.981 -0.145,-2.537 -0.918,-3.383 -0.798,-0.894 -1.958,-1.377 -3.335,-1.377 -1.377,0 -2.537,0.483 -3.335,1.377 -0.773,0.846 -0.918,1.402 -0.918,3.383 v 9.884 H 211.99 V 55.198 c 0,-2.078 0.531,-3.358 1.86,-4.446 1.184,-0.966 2.682,-1.474 4.398,-1.474 1.716,0 3.19,0.508 4.374,1.474 1.329,1.088 1.836,2.32 1.836,4.446 m 15.635,-5.461 -4.712,7.129 c 1.184,0.266 1.764,0.555 2.416,1.208 0.894,0.846 1.402,2.054 1.402,3.31 0,1.209 -0.484,2.369 -1.257,3.118 -0.918,0.894 -1.836,1.184 -3.77,1.184 h -4.857 V 49.737 h 1.982 v 6.839 h 2.126 l 4.398,-6.839 z m -3.021,11.623 c 0,-2.054 -1.087,-3.117 -3.19,-3.117 h -2.585 v 5.775 h 2.585 c 1.426,0 1.837,-0.072 2.32,-0.459 0.58,-0.459 0.87,-1.184 0.87,-2.199 m 14.378,4.326 h -1.981 V 49.738 h 1.981 z m 18.34,-16.094 v 16.094 h -1.981 V 52.178 c -0.048,0.096 -0.073,0.193 -0.097,0.241 -0.169,0.46 -0.193,0.484 -0.29,0.725 -0.072,0.145 -0.145,0.29 -0.217,0.387 l -7.902,12.155 h -2.586 V 49.737 h 1.982 v 13.822 c 0.097,-0.314 0.145,-0.435 0.242,-0.604 0.024,-0.097 0.096,-0.193 0.193,-0.362 0.121,-0.242 0.242,-0.435 0.314,-0.556 l 8.047,-12.445 z m 15.441,14.426 v 1.668 h -12.614 v -1.668 h 5.316 V 49.737 h 1.982 v 14.281 z m 12.034,-14.281 v 1.668 h -7.201 v 5.63 h 5.775 v 1.667 h -5.775 v 5.316 h 6.983 v 1.668 h -8.965 V 49.737 Z m 14.619,0 -4.712,7.129 c 1.184,0.266 1.764,0.555 2.416,1.208 0.894,0.846 1.402,2.054 1.402,3.31 0,1.209 -0.484,2.369 -1.257,3.118 -0.918,0.894 -1.836,1.184 -3.769,1.184 h -4.858 V 49.737 h 1.982 v 6.839 h 2.126 l 4.398,-6.839 z m -3.021,11.623 c 0,-2.054 -1.087,-3.117 -3.189,-3.117 h -2.586 v 5.775 h 2.586 c 1.425,0 1.836,-0.072 2.319,-0.459 0.58,-0.459 0.87,-1.184 0.87,-2.199 M 328.291,49.592 V 65.686 H 326.31 V 52.178 c -0.048,0.096 -0.073,0.193 -0.097,0.241 -0.169,0.46 -0.193,0.484 -0.29,0.725 -0.072,0.145 -0.145,0.29 -0.217,0.387 l -7.902,12.155 h -2.586 V 49.737 h 1.982 v 13.822 c 0.097,-0.314 0.145,-0.435 0.242,-0.604 0.024,-0.097 0.096,-0.193 0.193,-0.362 0.121,-0.242 0.242,-0.435 0.314,-0.556 l 8.047,-12.445 z m 14.45,0.145 v 1.668 h -7.201 v 5.63 h 5.776 v 1.667 h -5.776 v 5.316 h 6.984 v 1.668 h -8.965 V 49.737 Z m 14.015,14.281 v 1.668 h -12.613 v -1.668 h 5.316 V 49.737 h 1.981 v 14.281 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32912"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32914"
|
||||
transform="translate(26.0438,59.5232)">
|
||||
<path
|
||||
d="m 0,0 c 0,-0.006 -0.001,-0.012 -0.001,-0.019 0,-18.626 9.962,-33.839 27.075,-33.839 17.099,0 27.075,15.213 27.075,33.839 0,0.007 -10e-4,0.013 -10e-4,0.019 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32916"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
d="m 44.569,50.357 h 17.077 v 2.049 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32918"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 44.569,54.484 h 17.077 v 2.049 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32920"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 44.569,37.975 h 17.077 v 2.049 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32922"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 44.569,42.103 h 17.077 v 2.049 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32924"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 44.569,46.23 h 17.077 v 2.049 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32926"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="M 44.569,29.721 H 61.646 V 31.77 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32928"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 44.569,33.848 h 17.077 v 2.049 H 44.569 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32930"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="M 80.204,61.599 H 54.161 v 26.043 h 26.043 z"
|
||||
style="fill:#a7a5a6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32932"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32934">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32936"
|
||||
clip-path="url(#clipPath32940)">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32942"
|
||||
transform="translate(60.3389,74.6067)">
|
||||
<path
|
||||
d="m 0,0 c 0,3.802 3.07,6.872 6.843,6.872 3.802,0 6.844,-3.07 6.844,-6.872 0,-3.774 -3.042,-6.843 -6.844,-6.843 C 3.07,-6.843 0,-3.774 0,0 m 11.828,0 c 0,2.76 -2.225,4.985 -4.985,4.985 C 4.112,4.985 1.859,2.76 1.859,0 c 0,-2.732 2.253,-4.957 4.984,-4.957 2.76,0 4.985,2.225 4.985,4.957"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32944"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
d="M 52.086,61.599 H 26.043 v 26.043 h 26.043 z"
|
||||
style="fill:#656263;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32946"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32948"
|
||||
transform="translate(35.5144,69.5322)">
|
||||
<path
|
||||
d="M 0,0 H 2.577 V 10.177 H 0 V 11.15 H 7.1 V 10.177 H 4.55 V 0 H 7.1 V -0.973 H 0 Z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32950"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32952">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32954"
|
||||
clip-path="url(#clipPath32958)">
|
||||
<g
|
||||
style="stroke-width:3.03499794"
|
||||
id="g32960"
|
||||
transform="translate(69.6443,104.3782)">
|
||||
<path
|
||||
d="m 0,0 h -11.099 c -0.507,1.839 -1.833,4.224 -5.32,4.224 -3.486,0 -4.826,-2.385 -5.344,-4.224 H -32.874 V -2.135 H 0 Z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32962"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
d="m 36.77,90.413 h 2.135 v 10.531 H 36.77 Z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32964"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 42.107,90.413 h 2.135 v 10.531 h -2.135 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32966"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 47.444,90.413 h 2.135 v 10.531 h -2.135 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32968"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 56.836,90.413 h 2.135 v 10.531 h -2.135 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32970"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 62.173,90.413 h 2.135 v 10.531 h -2.135 z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32972"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 67.51,90.413 h 2.135 v 10.531 H 67.51 Z"
|
||||
style="fill:#918f90;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.03499794"
|
||||
id="path32974"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 44 KiB |
70
hardware/grid-recorder/case_side_iec_socket_helper.pdf
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
%PDF-1.5
|
||||
%µí®û
|
||||
4 0 obj
|
||||
<< /Length 5 0 R
|
||||
/Filter /FlateDecode
|
||||
>>
|
||||
stream
|
||||
xœ<EFBFBD><EFBFBD>1
|
||||
AEûœâ_À˜d';™‚Åj)¢"«…×w\ÙJYB~ áå)¤ÖLkDRŽ(9+WêI†Óz<C393>ù^p¾“°E“ZǃËÚÚî ,8RÂ
|
||||
=t ÞY_hV6U¸²J<C2B2>¹q¸áµN¥Åí„
:úÀ̃›\<5C>…Kª#¸BÞ²ZùÊŒª¤Ó\©™ ó0nÅÿ–<C3BF>œÙO®£'šPÍ
|
||||
endstream
|
||||
endobj
|
||||
5 0 obj
|
||||
156
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/ExtGState <<
|
||||
/a0 << /CA 1 /ca 1 >>
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<< /Type /Page % 1
|
||||
/Parent 1 0 R
|
||||
/MediaBox [ 0 0 595.275574 841.889771 ]
|
||||
/Contents 4 0 R
|
||||
/Group <<
|
||||
/Type /Group
|
||||
/S /Transparency
|
||||
/I true
|
||||
/CS /DeviceRGB
|
||||
>>
|
||||
/Resources 3 0 R
|
||||
>>
|
||||
endobj
|
||||
1 0 obj
|
||||
<< /Type /Pages
|
||||
/Kids [ 2 0 R ]
|
||||
/Count 1
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<< /Producer (cairo 1.16.0 (https://cairographics.org))
|
||||
/CreationDate (D:20200120124052+01'00)
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<< /Type /Catalog
|
||||
/Pages 1 0 R
|
||||
>>
|
||||
endobj
|
||||
xref
|
||||
0 8
|
||||
0000000000 65535 f
|
||||
0000000574 00000 n
|
||||
0000000342 00000 n
|
||||
0000000270 00000 n
|
||||
0000000015 00000 n
|
||||
0000000248 00000 n
|
||||
0000000639 00000 n
|
||||
0000000755 00000 n
|
||||
trailer
|
||||
<< /Size 8
|
||||
/Root 7 0 R
|
||||
/Info 6 0 R
|
||||
>>
|
||||
startxref
|
||||
807
|
||||
%%EOF
|
||||
128
hardware/grid-recorder/case_side_iec_socket_helper.svg
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="case_side_iec_socket_helper.svg"
|
||||
inkscape:version="0.92.4 (unknown)">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="1000.7521"
|
||||
inkscape:cy="98.892257"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1030"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="50"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#99cc33;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="-116.26517"
|
||||
y="18.02976"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#cc0000;fill-opacity:1;stroke:none;stroke-width:1.49999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect819"
|
||||
width="27.699999"
|
||||
height="19.799999"
|
||||
x="-85.515175"
|
||||
y="25.02976"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815-2"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="60.400002"
|
||||
y="18.02976"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect819-7"
|
||||
width="27.699999"
|
||||
height="19.799999"
|
||||
x="91.149994"
|
||||
y="25.02976"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815-2-0"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="60.400002"
|
||||
y="145.02977"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect819-7-9"
|
||||
width="27.699999"
|
||||
height="19.799999"
|
||||
x="91.149994"
|
||||
y="152.02977"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815-2-0-3"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="60.400002"
|
||||
y="205.52977"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815-2-6"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="60.400002"
|
||||
y="78.529762"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
69
hardware/grid-recorder/case_side_usb_socket_helper.pdf
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
%PDF-1.5
|
||||
%µí®û
|
||||
4 0 obj
|
||||
<< /Length 5 0 R
|
||||
/Filter /FlateDecode
|
||||
>>
|
||||
stream
|
||||
xœ•<EFBFBD>±
|
||||
ADû|Åü€q“Mnw¿@,NK±A°8-ü}s'Vj!!˜0ó)f&!Õ„km¥W(M¯õó}ÂùN‰µfë,c/´Ý!q‘+<0C>)ñÒ¨<C392>"¬"hʵ9Ôãºb´u¸<75>°AO1ÑÙ)4e6sdg±Š®•Ÿ©7ÌÌØÛß0÷‘"ßa==ïˆ:À
|
||||
endstream
|
||||
endobj
|
||||
5 0 obj
|
||||
151
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/ExtGState <<
|
||||
/a0 << /CA 1 /ca 1 >>
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<< /Type /Page % 1
|
||||
/Parent 1 0 R
|
||||
/MediaBox [ 0 0 595.275574 841.889771 ]
|
||||
/Contents 4 0 R
|
||||
/Group <<
|
||||
/Type /Group
|
||||
/S /Transparency
|
||||
/I true
|
||||
/CS /DeviceRGB
|
||||
>>
|
||||
/Resources 3 0 R
|
||||
>>
|
||||
endobj
|
||||
1 0 obj
|
||||
<< /Type /Pages
|
||||
/Kids [ 2 0 R ]
|
||||
/Count 1
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<< /Producer (cairo 1.16.0 (https://cairographics.org))
|
||||
/CreationDate (D:20200120115845+01'00)
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<< /Type /Catalog
|
||||
/Pages 1 0 R
|
||||
>>
|
||||
endobj
|
||||
xref
|
||||
0 8
|
||||
0000000000 65535 f
|
||||
0000000569 00000 n
|
||||
0000000337 00000 n
|
||||
0000000265 00000 n
|
||||
0000000015 00000 n
|
||||
0000000243 00000 n
|
||||
0000000634 00000 n
|
||||
0000000750 00000 n
|
||||
trailer
|
||||
<< /Size 8
|
||||
/Root 7 0 R
|
||||
/Info 6 0 R
|
||||
>>
|
||||
startxref
|
||||
802
|
||||
%%EOF
|
||||
146
hardware/grid-recorder/case_side_usb_socket_helper.svg
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="case_side_usb_socket_helper.svg"
|
||||
inkscape:version="0.92.4 (unknown)">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="212.76193"
|
||||
inkscape:cy="567.46698"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1030"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="50"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#99cc33;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="-116.26517"
|
||||
y="38.440475"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#99cc33;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect817"
|
||||
width="36.285713"
|
||||
height="6"
|
||||
x="-89.808022"
|
||||
y="89.940475"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#cc0000;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect819"
|
||||
width="12.4"
|
||||
height="10.6"
|
||||
x="-77.865166"
|
||||
y="77.440475"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect821"
|
||||
width="44.979168"
|
||||
height="1.6"
|
||||
x="-94.154747"
|
||||
y="88.340477"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#3366cc;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect823"
|
||||
width="51.404762"
|
||||
height="0.29999998"
|
||||
x="-97.367546"
|
||||
y="88.040474"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:0.48800001;vector-effect:none;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect821-3"
|
||||
width="44.979168"
|
||||
height="3"
|
||||
x="-94.154747"
|
||||
y="95.940483"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815-5"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="60.400002"
|
||||
y="32.770832"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect819-6"
|
||||
width="12.400001"
|
||||
height="10.6"
|
||||
x="98.799995"
|
||||
y="71.770836"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect815-5-2"
|
||||
width="89.199997"
|
||||
height="60.5"
|
||||
x="60.400002"
|
||||
y="156.84088"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect819-6-9"
|
||||
width="12.400002"
|
||||
height="10.6"
|
||||
x="98.799995"
|
||||
y="195.84088"
|
||||
rx="2.7755586e-17"
|
||||
ry="2.7755586e-17" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.5 KiB |
3
hardware/grid-recorder/components.dcm
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
EESchema-DOCLIB Version 2.0
|
||||
#
|
||||
#End Doc Library
|
||||
4
hardware/grid-recorder/components.lib
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
EESchema-LIBRARY Version 2.4
|
||||
#encoding utf-8
|
||||
#
|
||||
#End Library
|
||||
24
hardware/grid-recorder/converter_clip.scad
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
w_top = 24.5;
|
||||
w_bottom = 25.3;
|
||||
h = 21.5;
|
||||
|
||||
extra_w = 0.1;
|
||||
wall_thickness = 2;
|
||||
ledge_w = 3;
|
||||
|
||||
clamp_w = 20;
|
||||
|
||||
module shape() {
|
||||
polygon([[0, 0], [-1.5, w_bottom/2], [0, w_bottom], [h, w_bottom - (w_bottom - w_top)/2], [h, (w_bottom-w_top)/2]]);
|
||||
}
|
||||
|
||||
module segment(wall) {
|
||||
linear_extrude(clamp_w)
|
||||
difference() {
|
||||
offset(wall + extra_w, $fn=32) shape();
|
||||
offset(extra_w, $fn=32) shape();
|
||||
mirror([1, 0]) translate([extra_w, ledge_w]) square([5*wall, w_bottom - 2*ledge_w]);
|
||||
}
|
||||
}
|
||||
|
||||
segment(wall_thickness);
|
||||
1990
hardware/grid-recorder/converter_clip.stl
Normal file
72045
hardware/grid-recorder/fp-info-cache
Normal file
3
hardware/grid-recorder/fp-lib-table
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
(fp_lib_table
|
||||
(lib (name "platform")(type "KiCad")(uri "${KIPRJMOD}/platform.pretty")(options "")(descr ""))
|
||||
)
|
||||
BIN
hardware/grid-recorder/gerber_grid_meas_platform_v01.zip
Normal file
BIN
hardware/grid-recorder/hiig_logo_binary.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
42
hardware/grid-recorder/lid_switch_plunger.scad
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
case_inside_h = 54.5;
|
||||
case_standoff_h = 6.0;
|
||||
pcb_h = 1.6;
|
||||
switch_h = 12.2;
|
||||
glue_h = 0.2;
|
||||
tolerance = 0.7;
|
||||
height = case_inside_h - case_standoff_h - pcb_h - switch_h - glue_h - tolerance;
|
||||
|
||||
eps = 0.01;
|
||||
base_w = 20;
|
||||
base_h = base_w;
|
||||
base_d = 5;
|
||||
stem_w = 10;
|
||||
stem_h = stem_w;
|
||||
plunger_w = 20;
|
||||
plunger_h = 25;
|
||||
plunger_d = 3;
|
||||
|
||||
module narf(w, h, d) {
|
||||
translate([0, 0, 1])
|
||||
minkowski(){
|
||||
cube([w-2*d, h-2*d, eps], center=true);
|
||||
cylinder(d, d, 0, $fn=32);
|
||||
};
|
||||
|
||||
minkowski(){
|
||||
cube([w-2*d, h-2*d, eps], center=true);
|
||||
cylinder(1, d, d, $fn=32);
|
||||
};
|
||||
}
|
||||
|
||||
rotate ([0, 180, 0]) {
|
||||
narf(base_w, base_h, base_d);
|
||||
|
||||
translate([0, 0, height/2])
|
||||
cube([stem_w, stem_h, height], center=true);
|
||||
|
||||
translate([0, 0, height])
|
||||
mirror([0, 0, 1])
|
||||
narf(plunger_w, plunger_h, plunger_d);
|
||||
}
|
||||
2158
hardware/grid-recorder/lid_switch_plunger.stl
Normal file
61
hardware/grid-recorder/lid_switch_plunger_flex.scad
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
|
||||
case_inside_h = 54.5;
|
||||
case_standoff_h = 6.0;
|
||||
pcb_h = 1.6;
|
||||
switch_h = 12.2;
|
||||
glue_h = 0.2;
|
||||
tolerance = 0.7;
|
||||
height = case_inside_h - case_standoff_h - pcb_h - switch_h - glue_h - tolerance + 2;
|
||||
|
||||
eps = 0.01;
|
||||
base_w = 20;
|
||||
base_h = base_w;
|
||||
base_d = 6;
|
||||
stem_w = 10;
|
||||
stem_h = stem_w;
|
||||
plunger_w = 20;
|
||||
plunger_h = 25;
|
||||
plunger_d = 3;
|
||||
|
||||
// cylinder chain parameters
|
||||
c_h = 14;
|
||||
c_w = base_w;
|
||||
c_intersect = 1;
|
||||
c_wall = 0.8;
|
||||
|
||||
module narf(w, h, d) {
|
||||
translate([0, 0, 1])
|
||||
minkowski(){
|
||||
cube([w-2*d, h-2*d, eps], center=true);
|
||||
cylinder(d, d, 0, $fn=32);
|
||||
};
|
||||
|
||||
minkowski(){
|
||||
cube([w-2*d, h-2*d, eps], center=true);
|
||||
cylinder(1, d, d, $fn=32);
|
||||
};
|
||||
}
|
||||
|
||||
rotate ([0, 180, 0]) {
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
narf(base_w, base_h, base_d);
|
||||
|
||||
translate([0, 0, height-c_h/2-plunger_d])
|
||||
//cube([stem_w, stem_h, height], center=true);
|
||||
for (i=[0:1]) {
|
||||
rotate([0, 90, 0]) translate([i*(c_h - c_intersect), 0, -c_w/2]) cylinder(d=c_h, h=c_w, $fn=32);
|
||||
}
|
||||
|
||||
translate([0, 0, height])
|
||||
mirror([0, 0, 1])
|
||||
narf(plunger_w, plunger_h, plunger_d);
|
||||
}
|
||||
|
||||
translate([0, 0, height-c_h/2-plunger_d])
|
||||
for (i=[0:1]) {
|
||||
rotate([0, 90, 0]) translate([i*(c_h - c_intersect), 0, -c_w/2-eps]) cylinder(d=c_h - 2*c_wall, h=c_w+2*eps, $fn=32);
|
||||
}
|
||||
}
|
||||
}
|
||||
6078
hardware/grid-recorder/lid_switch_plunger_flex.stl
Normal file
51
hardware/grid-recorder/line_meas_divider.asc
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
Version 4
|
||||
SHEET 1 880 680
|
||||
WIRE 144 -96 0 -96
|
||||
WIRE 320 -96 224 -96
|
||||
WIRE 416 -96 320 -96
|
||||
WIRE 544 -96 416 -96
|
||||
WIRE 320 -64 320 -96
|
||||
WIRE 416 -64 416 -96
|
||||
WIRE 544 16 544 -96
|
||||
WIRE 0 64 0 -96
|
||||
WIRE 320 64 320 16
|
||||
WIRE 0 240 0 144
|
||||
WIRE 144 240 0 240
|
||||
WIRE 320 240 320 144
|
||||
WIRE 320 240 224 240
|
||||
WIRE 416 240 416 16
|
||||
WIRE 416 240 320 240
|
||||
WIRE 544 240 544 80
|
||||
WIRE 544 240 416 240
|
||||
WIRE 320 304 320 240
|
||||
FLAG 320 304 0
|
||||
SYMBOL voltage 320 48 R0
|
||||
WINDOW 123 0 0 Left 0
|
||||
WINDOW 39 0 0 Left 0
|
||||
SYMATTR InstName V1
|
||||
SYMATTR Value 12
|
||||
SYMBOL Misc\\signal 0 48 R0
|
||||
WINDOW 123 0 0 Left 0
|
||||
WINDOW 39 0 0 Left 0
|
||||
SYMATTR InstName V2
|
||||
SYMATTR Value PULSE(0 325 0 1n 1n .5u 1u)
|
||||
SYMBOL res 240 -112 R90
|
||||
WINDOW 0 0 56 VBottom 2
|
||||
WINDOW 3 32 56 VTop 2
|
||||
SYMATTR InstName R1
|
||||
SYMATTR Value 66k
|
||||
SYMBOL res 240 224 R90
|
||||
WINDOW 0 0 56 VBottom 2
|
||||
WINDOW 3 32 56 VTop 2
|
||||
SYMATTR InstName R2
|
||||
SYMATTR Value 66k
|
||||
SYMBOL res 400 -80 R0
|
||||
SYMATTR InstName R4
|
||||
SYMATTR Value 470
|
||||
SYMBOL res 304 -80 R0
|
||||
SYMATTR InstName R3
|
||||
SYMATTR Value 2k7
|
||||
SYMBOL cap 528 16 R0
|
||||
SYMATTR InstName C1
|
||||
SYMATTR Value 100p
|
||||
TEXT -32 328 Left 2 !.tran 100u
|
||||
92
hardware/grid-recorder/line_pol_det.asc
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
Version 4
|
||||
SHEET 1 1364 680
|
||||
WIRE 1360 -624 1008 -624
|
||||
WIRE 1008 -544 1008 -624
|
||||
WIRE 1008 -336 1008 -464
|
||||
WIRE 144 -256 -64 -256
|
||||
WIRE 640 -256 224 -256
|
||||
WIRE 736 -256 640 -256
|
||||
WIRE 848 -256 736 -256
|
||||
WIRE 960 -256 848 -256
|
||||
WIRE 640 -224 640 -256
|
||||
WIRE 736 -224 736 -256
|
||||
WIRE 848 -224 848 -256
|
||||
WIRE 144 -96 0 -96
|
||||
WIRE 320 -96 224 -96
|
||||
WIRE 416 -96 320 -96
|
||||
WIRE 320 -64 320 -96
|
||||
WIRE 416 -64 416 -96
|
||||
WIRE 320 48 320 16
|
||||
WIRE 1360 48 1360 -624
|
||||
WIRE 1360 48 320 48
|
||||
WIRE 0 64 0 -96
|
||||
WIRE 320 64 320 48
|
||||
WIRE 416 224 416 16
|
||||
WIRE 640 224 640 -160
|
||||
WIRE 640 224 416 224
|
||||
WIRE 736 224 736 -160
|
||||
WIRE 736 224 640 224
|
||||
WIRE 848 224 848 -160
|
||||
WIRE 848 224 736 224
|
||||
WIRE 1008 224 1008 -240
|
||||
WIRE 1008 224 848 224
|
||||
WIRE -64 240 -64 -256
|
||||
WIRE 0 240 0 144
|
||||
WIRE 0 240 -64 240
|
||||
WIRE 144 240 0 240
|
||||
WIRE 320 240 320 144
|
||||
WIRE 320 240 224 240
|
||||
WIRE 416 240 416 224
|
||||
WIRE 416 240 320 240
|
||||
WIRE 320 304 320 240
|
||||
FLAG 320 304 0
|
||||
SYMBOL voltage 320 48 R0
|
||||
WINDOW 123 0 0 Left 0
|
||||
WINDOW 39 0 0 Left 0
|
||||
SYMATTR InstName V1
|
||||
SYMATTR Value 12
|
||||
SYMBOL Misc\\signal 0 48 R0
|
||||
WINDOW 123 0 0 Left 0
|
||||
WINDOW 39 0 0 Left 0
|
||||
SYMATTR InstName V2
|
||||
SYMATTR Value SINE(0 325 50)
|
||||
SYMBOL res 240 -112 R90
|
||||
WINDOW 0 0 56 VBottom 2
|
||||
WINDOW 3 32 56 VTop 2
|
||||
SYMATTR InstName R1
|
||||
SYMATTR Value 660k
|
||||
SYMBOL res 240 224 R90
|
||||
WINDOW 0 0 56 VBottom 2
|
||||
WINDOW 3 32 56 VTop 2
|
||||
SYMATTR InstName R2
|
||||
SYMATTR Value 660k
|
||||
SYMBOL res 400 -80 R0
|
||||
SYMATTR InstName R4
|
||||
SYMATTR Value 4k7
|
||||
SYMBOL res 304 -80 R0
|
||||
SYMATTR InstName R3
|
||||
SYMATTR Value 27k
|
||||
SYMBOL res 240 -272 R90
|
||||
WINDOW 0 0 56 VBottom 2
|
||||
WINDOW 3 32 56 VTop 2
|
||||
SYMATTR InstName R5
|
||||
SYMATTR Value 2Meg
|
||||
SYMBOL zener 656 -160 R180
|
||||
WINDOW 0 24 64 Left 2
|
||||
WINDOW 3 24 0 Left 2
|
||||
SYMATTR InstName D1
|
||||
SYMATTR Value BZX84C12L
|
||||
SYMBOL schottky 752 -160 R180
|
||||
WINDOW 0 24 64 Left 2
|
||||
WINDOW 3 24 0 Left 2
|
||||
SYMATTR InstName D2
|
||||
SYMBOL nmos 960 -336 R0
|
||||
SYMATTR InstName M1
|
||||
SYMATTR Value FDS2734
|
||||
SYMBOL cap 832 -224 R0
|
||||
SYMATTR InstName C1
|
||||
SYMATTR Value 100p
|
||||
SYMBOL res 992 -560 R0
|
||||
SYMATTR InstName R6
|
||||
SYMATTR Value 1k2
|
||||
TEXT -34 328 Left 2 !.tran 1
|
||||
974
hardware/grid-recorder/platform-cache.lib
Normal file
|
|
@ -0,0 +1,974 @@
|
|||
EESchema-LIBRARY Version 2.4
|
||||
#encoding utf-8
|
||||
#
|
||||
# 4xxx_bom_item
|
||||
#
|
||||
DEF 4xxx_bom_item E 0 40 Y Y 1 F N
|
||||
F0 "E" -100 0 50 H V L CNN
|
||||
F1 "4xxx_bom_item" 50 0 50 H V L CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
C -120 0 10 0 1 0 F
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# 74xx_74HC595
|
||||
#
|
||||
DEF 74xx_74HC595 U 0 20 Y Y 1 F N
|
||||
F0 "U" -300 550 50 H V C CNN
|
||||
F1 "74xx_74HC595" -300 -650 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
ALIAS 74LS595 74HCT595
|
||||
$FPLIST
|
||||
DIP*W7.62mm*
|
||||
SOIC*3.9x9.9mm*P1.27mm*
|
||||
TSSOP*4.4x5mm*P0.65mm*
|
||||
SOIC*5.3x10.2mm*P1.27mm*
|
||||
SOIC*7.5x10.3mm*P1.27mm*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -300 500 300 -600 1 1 10 f
|
||||
X QB 1 400 300 100 L 50 50 1 0 T
|
||||
X ~SRCLR 10 -400 100 100 R 50 50 1 0 I
|
||||
X SRCLK 11 -400 200 100 R 50 50 1 0 I
|
||||
X RCLK 12 -400 -100 100 R 50 50 1 0 I
|
||||
X ~OE 13 -400 -200 100 R 50 50 1 0 I
|
||||
X SER 14 -400 400 100 R 50 50 1 0 I
|
||||
X QA 15 400 400 100 L 50 50 1 0 T
|
||||
X VCC 16 0 600 100 D 50 50 1 0 W
|
||||
X QC 2 400 200 100 L 50 50 1 0 T
|
||||
X QD 3 400 100 100 L 50 50 1 0 T
|
||||
X QE 4 400 0 100 L 50 50 1 0 T
|
||||
X QF 5 400 -100 100 L 50 50 1 0 T
|
||||
X QG 6 400 -200 100 L 50 50 1 0 T
|
||||
X QH 7 400 -300 100 L 50 50 1 0 T
|
||||
X GND 8 0 -700 100 U 50 50 1 0 W
|
||||
X QH' 9 400 -500 100 L 50 50 1 0 O
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_Conn_01x03_Male
|
||||
#
|
||||
DEF Connector_Conn_01x03_Male J 0 40 Y N 1 F N
|
||||
F0 "J" 0 200 50 H V C CNN
|
||||
F1 "Connector_Conn_01x03_Male" 0 -200 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Connector*:*_1x??_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S 34 -95 0 -105 1 1 6 F
|
||||
S 34 5 0 -5 1 1 6 F
|
||||
S 34 105 0 95 1 1 6 F
|
||||
P 2 1 1 6 50 -100 34 -100 N
|
||||
P 2 1 1 6 50 0 34 0 N
|
||||
P 2 1 1 6 50 100 34 100 N
|
||||
X Pin_1 1 200 100 150 L 50 50 1 1 P
|
||||
X Pin_2 2 200 0 150 L 50 50 1 1 P
|
||||
X Pin_3 3 200 -100 150 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_Conn_01x04_Male
|
||||
#
|
||||
DEF Connector_Conn_01x04_Male J 0 40 Y N 1 F N
|
||||
F0 "J" 0 200 50 H V C CNN
|
||||
F1 "Connector_Conn_01x04_Male" 0 -300 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Connector*:*_1x??_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S 34 -195 0 -205 1 1 6 F
|
||||
S 34 -95 0 -105 1 1 6 F
|
||||
S 34 5 0 -5 1 1 6 F
|
||||
S 34 105 0 95 1 1 6 F
|
||||
P 2 1 1 6 50 -200 34 -200 N
|
||||
P 2 1 1 6 50 -100 34 -100 N
|
||||
P 2 1 1 6 50 0 34 0 N
|
||||
P 2 1 1 6 50 100 34 100 N
|
||||
X Pin_1 1 200 100 150 L 50 50 1 1 P
|
||||
X Pin_2 2 200 0 150 L 50 50 1 1 P
|
||||
X Pin_3 3 200 -100 150 L 50 50 1 1 P
|
||||
X Pin_4 4 200 -200 150 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_Conn_01x06_Male
|
||||
#
|
||||
DEF Connector_Conn_01x06_Male J 0 40 Y N 1 F N
|
||||
F0 "J" 0 300 50 H V C CNN
|
||||
F1 "Connector_Conn_01x06_Male" 0 -400 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Connector*:*_1x??_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S 34 -295 0 -305 1 1 6 F
|
||||
S 34 -195 0 -205 1 1 6 F
|
||||
S 34 -95 0 -105 1 1 6 F
|
||||
S 34 5 0 -5 1 1 6 F
|
||||
S 34 105 0 95 1 1 6 F
|
||||
S 34 205 0 195 1 1 6 F
|
||||
P 2 1 1 6 50 -300 34 -300 N
|
||||
P 2 1 1 6 50 -200 34 -200 N
|
||||
P 2 1 1 6 50 -100 34 -100 N
|
||||
P 2 1 1 6 50 0 34 0 N
|
||||
P 2 1 1 6 50 100 34 100 N
|
||||
P 2 1 1 6 50 200 34 200 N
|
||||
X Pin_1 1 200 200 150 L 50 50 1 1 P
|
||||
X Pin_2 2 200 100 150 L 50 50 1 1 P
|
||||
X Pin_3 3 200 0 150 L 50 50 1 1 P
|
||||
X Pin_4 4 200 -100 150 L 50 50 1 1 P
|
||||
X Pin_5 5 200 -200 150 L 50 50 1 1 P
|
||||
X Pin_6 6 200 -300 150 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_Conn_01x08_Male
|
||||
#
|
||||
DEF Connector_Conn_01x08_Male J 0 40 Y N 1 F N
|
||||
F0 "J" 0 400 50 H V C CNN
|
||||
F1 "Connector_Conn_01x08_Male" 0 -500 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Connector*:*_1x??_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S 34 -395 0 -405 1 1 6 F
|
||||
S 34 -295 0 -305 1 1 6 F
|
||||
S 34 -195 0 -205 1 1 6 F
|
||||
S 34 -95 0 -105 1 1 6 F
|
||||
S 34 5 0 -5 1 1 6 F
|
||||
S 34 105 0 95 1 1 6 F
|
||||
S 34 205 0 195 1 1 6 F
|
||||
S 34 305 0 295 1 1 6 F
|
||||
P 2 1 1 6 50 -400 34 -400 N
|
||||
P 2 1 1 6 50 -300 34 -300 N
|
||||
P 2 1 1 6 50 -200 34 -200 N
|
||||
P 2 1 1 6 50 -100 34 -100 N
|
||||
P 2 1 1 6 50 0 34 0 N
|
||||
P 2 1 1 6 50 100 34 100 N
|
||||
P 2 1 1 6 50 200 34 200 N
|
||||
P 2 1 1 6 50 300 34 300 N
|
||||
X Pin_1 1 200 300 150 L 50 50 1 1 P
|
||||
X Pin_2 2 200 200 150 L 50 50 1 1 P
|
||||
X Pin_3 3 200 100 150 L 50 50 1 1 P
|
||||
X Pin_4 4 200 0 150 L 50 50 1 1 P
|
||||
X Pin_5 5 200 -100 150 L 50 50 1 1 P
|
||||
X Pin_6 6 200 -200 150 L 50 50 1 1 P
|
||||
X Pin_7 7 200 -300 150 L 50 50 1 1 P
|
||||
X Pin_8 8 200 -400 150 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_Micro_SD_Card
|
||||
#
|
||||
DEF Connector_Micro_SD_Card J 0 40 Y Y 1 F N
|
||||
F0 "J" -650 600 50 H V C CNN
|
||||
F1 "Connector_Micro_SD_Card" 650 600 50 H V R CNN
|
||||
F2 "" 1150 300 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
microSD*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -300 -375 -200 -425 0 1 0 F
|
||||
S -300 -275 -200 -325 0 1 0 F
|
||||
S -300 -175 -200 -225 0 1 0 F
|
||||
S -300 -75 -200 -125 0 1 0 F
|
||||
S -300 25 -200 -25 0 1 0 F
|
||||
S -300 125 -200 75 0 1 0 F
|
||||
S -300 225 -200 175 0 1 0 F
|
||||
S -300 325 -200 275 0 1 0 F
|
||||
P 6 0 1 10 650 500 650 550 -750 550 -750 -650 650 -650 650 -450 N
|
||||
P 11 0 1 10 -350 -450 -350 350 -50 350 100 500 150 500 150 450 250 450 300 500 800 500 800 -450 -350 -450 f
|
||||
X DAT2 1 -900 300 150 R 50 50 1 1 B
|
||||
X DAT3/CD 2 -900 200 150 R 50 50 1 1 B
|
||||
X CMD 3 -900 100 150 R 50 50 1 1 I
|
||||
X VDD 4 -900 0 150 R 50 50 1 1 W
|
||||
X CLK 5 -900 -100 150 R 50 50 1 1 I
|
||||
X VSS 6 -900 -200 150 R 50 50 1 1 W
|
||||
X DAT0 7 -900 -300 150 R 50 50 1 1 I
|
||||
X DAT1 8 -900 -400 150 R 50 50 1 1 I
|
||||
X SHIELD 9 800 -600 150 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_USB_B
|
||||
#
|
||||
DEF Connector_USB_B J 0 40 Y Y 1 F N
|
||||
F0 "J" -200 450 50 H V L CNN
|
||||
F1 "Connector_USB_B" -200 350 50 H V L CNN
|
||||
F2 "" 150 -50 50 H I C CNN
|
||||
F3 "" 150 -50 50 H I C CNN
|
||||
$FPLIST
|
||||
USB*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C -150 85 25 0 1 10 F
|
||||
C -25 135 15 0 1 10 F
|
||||
S -200 -300 200 300 0 1 10 f
|
||||
S -150 220 -100 180 0 1 0 F
|
||||
S -5 -300 5 -270 0 1 0 N
|
||||
S 10 50 -20 20 0 1 10 F
|
||||
S 200 -105 170 -95 0 1 0 N
|
||||
S 200 -5 170 5 0 1 0 N
|
||||
S 200 195 170 205 0 1 0 N
|
||||
P 2 0 1 10 -75 85 25 85 N
|
||||
P 4 0 1 10 -125 85 -100 85 -50 135 -25 135 N
|
||||
P 4 0 1 10 -100 85 -75 85 -50 35 0 35 N
|
||||
P 4 0 1 10 25 110 25 60 75 85 25 110 F
|
||||
P 7 0 1 0 -160 170 -90 170 -90 225 -105 240 -145 240 -160 225 -160 170 N
|
||||
X VBUS 1 300 200 100 L 50 50 1 1 w
|
||||
X D- 2 300 -100 100 L 50 50 1 1 P
|
||||
X D+ 3 300 0 100 L 50 50 1 1 P
|
||||
X GND 4 0 -400 100 U 50 50 1 1 w
|
||||
X Shield 5 -100 -400 100 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Converter_ACDC_IRM-02-12
|
||||
#
|
||||
DEF Converter_ACDC_IRM-02-12 PS 0 20 Y Y 1 F N
|
||||
F0 "PS" 0 200 50 H V C CNN
|
||||
F1 "Converter_ACDC_IRM-02-12" 0 -200 50 H V C CNN
|
||||
F2 "Converter_ACDC:Converter_ACDC_MeanWell_IRM-02-xx_THT" 0 -300 50 H I C CNN
|
||||
F3 "" 400 -350 50 H I C CNN
|
||||
ALIAS IRM-02-5 IRM-02-9 IRM-02-12 IRM-02-15 IRM-02-24
|
||||
$FPLIST
|
||||
Converter*ACDC*MeanWell*IRM*02*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
A -185 38 28 -1525 -275 0 1 0 N -210 25 -160 25
|
||||
A -135 11 29 292 1508 0 1 0 N -110 25 -160 25
|
||||
S -300 150 300 -150 0 1 10 f
|
||||
P 2 0 1 0 -210 -25 -110 -25 N
|
||||
P 2 0 1 0 110 -25 210 -25 N
|
||||
P 2 0 1 0 110 25 130 25 N
|
||||
P 2 0 1 0 150 25 170 25 N
|
||||
P 2 0 1 0 190 25 210 25 N
|
||||
X AC/N 1 -400 -100 100 R 50 50 1 1 W
|
||||
X AC/L 2 -400 100 100 R 50 50 1 1 W
|
||||
X -Vout 3 400 -100 100 L 50 50 1 1 w
|
||||
X +Vout 4 400 100 100 L 50 50 1 1 w
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_C
|
||||
#
|
||||
DEF Device_C C 0 10 N Y 1 F N
|
||||
F0 "C" 25 100 50 H V L CNN
|
||||
F1 "Device_C" 25 -100 50 H V L CNN
|
||||
F2 "" 38 -150 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
C_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 20 -80 -30 80 -30 N
|
||||
P 2 0 1 20 -80 30 80 30 N
|
||||
X ~ 1 0 150 110 D 50 50 1 1 P
|
||||
X ~ 2 0 -150 110 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_CP
|
||||
#
|
||||
DEF Device_CP C 0 10 N Y 1 F N
|
||||
F0 "C" 25 100 50 H V L CNN
|
||||
F1 "Device_CP" 25 -100 50 H V L CNN
|
||||
F2 "" 38 -150 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
CP_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -90 20 -90 40 0 1 0 N
|
||||
S -90 20 90 20 0 1 0 N
|
||||
S 90 -20 -90 -40 0 1 0 F
|
||||
S 90 40 -90 40 0 1 0 N
|
||||
S 90 40 90 20 0 1 0 N
|
||||
P 2 0 1 0 -70 90 -30 90 N
|
||||
P 2 0 1 0 -50 110 -50 70 N
|
||||
X ~ 1 0 150 110 D 50 50 1 1 P
|
||||
X ~ 2 0 -150 110 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_Crystal
|
||||
#
|
||||
DEF Device_Crystal Y 0 40 N N 1 F N
|
||||
F0 "Y" 0 150 50 H V C CNN
|
||||
F1 "Device_Crystal" 0 -150 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Crystal*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -45 100 45 -100 0 1 12 N
|
||||
P 2 0 1 0 -100 0 -75 0 N
|
||||
P 2 0 1 20 -75 -50 -75 50 N
|
||||
P 2 0 1 20 75 -50 75 50 N
|
||||
P 2 0 1 0 100 0 75 0 N
|
||||
X 1 1 -150 0 50 R 50 50 1 1 P
|
||||
X 2 2 150 0 50 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_D_Schottky_ALT
|
||||
#
|
||||
DEF Device_D_Schottky_ALT D 0 40 N N 1 F N
|
||||
F0 "D" 0 100 50 H V C CNN
|
||||
F1 "Device_D_Schottky_ALT" 0 -100 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
TO-???*
|
||||
*_Diode_*
|
||||
*SingleDiode*
|
||||
D_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 0 50 0 -50 0 N
|
||||
P 4 0 1 8 50 50 50 -50 -50 0 50 50 F
|
||||
P 6 0 1 8 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N
|
||||
X K 1 -150 0 100 R 50 50 1 1 P
|
||||
X A 2 150 0 100 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_D_Zener_ALT
|
||||
#
|
||||
DEF Device_D_Zener_ALT D 0 40 N N 1 F N
|
||||
F0 "D" 0 100 50 H V C CNN
|
||||
F1 "Device_D_Zener_ALT" 0 -100 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
TO-???*
|
||||
*_Diode_*
|
||||
*SingleDiode*
|
||||
D_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 0 50 0 -50 0 N
|
||||
P 3 0 1 8 -50 -50 -50 50 -30 50 N
|
||||
P 4 0 1 8 50 -50 50 50 -50 0 50 -50 F
|
||||
X K 1 -150 0 100 R 50 50 1 1 P
|
||||
X A 2 150 0 100 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_Fuse
|
||||
#
|
||||
DEF Device_Fuse F 0 0 N Y 1 F N
|
||||
F0 "F" 80 0 50 V V C CNN
|
||||
F1 "Device_Fuse" -75 0 50 V V C CNN
|
||||
F2 "" -70 0 50 V I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
*Fuse*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -30 -100 30 100 0 1 10 N
|
||||
P 2 0 1 0 0 100 0 -100 N
|
||||
X ~ 1 0 150 50 D 50 50 1 1 P
|
||||
X ~ 2 0 -150 50 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_L_Core_Ferrite
|
||||
#
|
||||
DEF Device_L_Core_Ferrite L 0 40 N N 1 F N
|
||||
F0 "L" -50 0 50 V V C CNN
|
||||
F1 "Device_L_Core_Ferrite" 110 0 50 V V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Choke_*
|
||||
*Coil*
|
||||
Inductor_*
|
||||
L_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
A 0 -75 25 -899 899 0 1 0 N 0 -100 0 -50
|
||||
A 0 -25 25 -899 899 0 1 0 N 0 -50 0 0
|
||||
A 0 25 25 -899 899 0 1 0 N 0 0 0 50
|
||||
A 0 75 25 -899 899 0 1 0 N 0 50 0 100
|
||||
P 2 0 1 0 40 -110 40 -90 N
|
||||
P 2 0 1 0 40 -70 40 -50 N
|
||||
P 2 0 1 0 40 -30 40 -10 N
|
||||
P 2 0 1 0 40 10 40 30 N
|
||||
P 2 0 1 0 40 50 40 70 N
|
||||
P 2 0 1 0 40 90 40 110 N
|
||||
P 2 0 1 0 60 -90 60 -110 N
|
||||
P 2 0 1 0 60 -50 60 -70 N
|
||||
P 2 0 1 0 60 -10 60 -30 N
|
||||
P 2 0 1 0 60 30 60 10 N
|
||||
P 2 0 1 0 60 70 60 50 N
|
||||
P 2 0 1 0 60 110 60 90 N
|
||||
X 1 1 0 150 50 D 50 50 1 1 P
|
||||
X 2 2 0 -150 50 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_Lamp_Neon
|
||||
#
|
||||
DEF Device_Lamp_Neon NE 0 1 Y N 1 F N
|
||||
F0 "NE" 25 150 50 H V L CNN
|
||||
F1 "Device_Lamp_Neon" 25 -150 50 H V L CNN
|
||||
F2 "" 0 100 50 V I C CNN
|
||||
F3 "" 0 100 50 V I C CNN
|
||||
DRAW
|
||||
C 0 0 100 0 1 0 N
|
||||
C 40 -50 10 0 1 0 F
|
||||
S -60 -20 60 -30 0 1 0 F
|
||||
S -60 30 60 20 0 1 0 F
|
||||
P 2 0 1 0 0 -100 0 -30 N
|
||||
P 2 0 1 0 0 30 0 100 N
|
||||
X ~ 1 0 -200 100 U 50 50 1 1 P
|
||||
X ~ 2 0 200 100 D 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_R
|
||||
#
|
||||
DEF Device_R R 0 0 N Y 1 F N
|
||||
F0 "R" 80 0 50 V V C CNN
|
||||
F1 "Device_R" 0 0 50 V V C CNN
|
||||
F2 "" -70 0 50 V I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
R_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -40 -100 40 100 0 1 10 N
|
||||
X ~ 1 0 150 50 D 50 50 1 1 P
|
||||
X ~ 2 0 -150 50 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_R_POT_TRIM
|
||||
#
|
||||
DEF Device_R_POT_TRIM RV 0 40 Y N 1 F N
|
||||
F0 "RV" -175 0 50 V V C CNN
|
||||
F1 "Device_R_POT_TRIM" -100 0 50 V V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Potentiometer*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S 40 100 -40 -100 0 1 10 N
|
||||
P 2 0 1 0 60 30 60 -30 N
|
||||
P 2 0 1 0 100 0 60 0 N
|
||||
X 1 1 0 150 50 D 50 50 1 1 P
|
||||
X 2 2 150 0 50 L 50 50 1 1 P
|
||||
X 3 3 0 -150 50 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_Varistor
|
||||
#
|
||||
DEF Device_Varistor RV 0 0 N Y 1 F N
|
||||
F0 "RV" 125 0 50 V V C CNN
|
||||
F1 "Device_Varistor" -125 0 50 V V C CNN
|
||||
F2 "" -70 0 50 V I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
RV_*
|
||||
Varistor*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
T 0 -70 -80 50 0 0 0 U Normal 0 C C
|
||||
S -40 -100 40 100 0 1 10 N
|
||||
P 3 0 1 0 -75 100 -75 50 75 -50 N
|
||||
X ~ 1 0 150 50 D 50 50 1 1 P
|
||||
X ~ 2 0 -150 50 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Interface_USB_CH340G
|
||||
#
|
||||
DEF Interface_USB_CH340G U 0 20 Y Y 1 F N
|
||||
F0 "U" -200 550 50 H V R CNN
|
||||
F1 "Interface_USB_CH340G" 50 550 50 H V L CNN
|
||||
F2 "Package_SO:SOIC-16_3.9x9.9mm_P1.27mm" 50 -550 50 H I L CNN
|
||||
F3 "http://www.datasheet5.com/pdf-local-2195953" -350 800 50 H I C CNN
|
||||
$FPLIST
|
||||
SOIC*3.9x9.9mm*P1.27mm*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -300 500 300 -500 0 1 10 f
|
||||
X GND 1 0 -600 100 U 50 50 1 1 W
|
||||
X ~DSR 10 400 0 100 L 50 50 1 1 I
|
||||
X ~RI 11 400 -100 100 L 50 50 1 1 I
|
||||
X ~DCD 12 400 -200 100 L 50 50 1 1 I
|
||||
X ~DTR 13 400 -300 100 L 50 50 1 1 O
|
||||
X ~RTS 14 400 -400 100 L 50 50 1 1 O
|
||||
X R232 15 -400 300 100 R 50 50 1 1 I
|
||||
X VCC 16 0 600 100 D 50 50 1 1 W
|
||||
X TXD 2 400 300 100 L 50 50 1 1 O
|
||||
X RXD 3 400 400 100 L 50 50 1 1 I
|
||||
X V3 4 -100 600 100 D 50 50 1 1 P
|
||||
X UD+ 5 -400 100 100 R 50 50 1 1 B
|
||||
X UD- 6 -400 0 100 R 50 50 1 1 B
|
||||
X XI 7 -400 -200 100 R 50 50 1 1 I
|
||||
X XO 8 -400 -400 100 R 50 50 1 1 O
|
||||
X ~CTS 9 400 100 100 L 50 50 1 1 I
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Isolator_HCPL-261N
|
||||
#
|
||||
DEF Isolator_HCPL-261N U 0 0 Y Y 1 F N
|
||||
F0 "U" -160 350 50 H V C CNN
|
||||
F1 "Isolator_HCPL-261N" 0 -350 50 H V C CNN
|
||||
F2 "Package_DIP:DIP-8_W7.62mm" 0 -500 50 H I C CNN
|
||||
F3 "" -850 550 50 H I C CNN
|
||||
ALIAS HCPL-261N
|
||||
$FPLIST
|
||||
DIP*W7.62mm*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C 80 -60 10 0 1 10 N
|
||||
S -200 300 200 -300 1 1 10 f
|
||||
P 2 0 1 10 105 -140 105 -65 N
|
||||
P 2 0 1 10 105 -85 105 -115 N
|
||||
P 2 0 1 10 135 -155 135 -200 N
|
||||
P 3 0 1 10 -25 -130 -25 -145 25 -145 N
|
||||
P 3 0 1 10 -25 -75 -25 -60 20 -60 N
|
||||
P 3 0 1 10 50 -160 50 -200 200 -200 N
|
||||
P 3 0 1 10 50 -50 50 200 200 200 N
|
||||
P 3 0 1 10 80 -50 80 100 200 100 N
|
||||
P 4 0 1 0 -200 -200 -155 -200 -155 0 -200 0 N
|
||||
P 4 0 1 10 105 -130 105 -170 85 -170 85 -155 N
|
||||
P 4 0 1 10 105 -105 25 -185 25 -25 105 -105 N
|
||||
P 4 0 1 10 105 -70 105 -30 125 -30 125 -45 N
|
||||
P 4 0 1 10 110 -100 150 -60 150 0 200 0 N
|
||||
P 5 0 1 10 105 -125 135 -155 130 -140 120 -150 135 -155 N
|
||||
P 2 1 1 10 -180 -125 -130 -125 N
|
||||
P 2 1 1 0 -65 -210 -65 -260 N
|
||||
P 2 1 1 0 -65 -120 -65 -170 N
|
||||
P 2 1 1 0 -65 -30 -65 -80 N
|
||||
P 2 1 1 0 -65 60 -65 10 N
|
||||
P 2 1 1 0 -65 150 -65 100 N
|
||||
P 2 1 1 0 -65 240 -65 190 N
|
||||
P 2 1 1 10 -50 -75 0 -75 N
|
||||
P 4 1 1 10 -155 -125 -180 -75 -130 -75 -155 -125 N
|
||||
P 4 1 1 10 -25 -75 -50 -125 0 -125 -25 -75 N
|
||||
P 5 1 1 5 -115 -120 -85 -120 -100 -125 -100 -115 -85 -120 N
|
||||
P 5 1 1 5 -115 -80 -85 -80 -100 -85 -100 -75 -85 -80 N
|
||||
X NC 1 -200 200 100 R 50 25 1 1 N N
|
||||
X C1 2 -300 0 100 R 50 25 1 1 P
|
||||
X A2 3 -300 -200 100 R 50 25 1 1 P
|
||||
X GND 5 300 -200 100 L 50 25 1 1 W
|
||||
X VO1 6 300 0 100 L 50 25 1 1 C
|
||||
X EN 7 300 100 100 L 50 25 1 1 I
|
||||
X VCC 8 300 200 100 L 50 25 1 1 W
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# MCU_ST_STM32F0_STM32F030F4Px
|
||||
#
|
||||
DEF MCU_ST_STM32F0_STM32F030F4Px U 0 20 Y Y 1 F N
|
||||
F0 "U" -400 650 50 H V L CNN
|
||||
F1 "MCU_ST_STM32F0_STM32F030F4Px" 200 650 50 H V L CNN
|
||||
F2 "Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm" -400 -700 50 H I R CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
TSSOP*4.4x6.5mm*P0.65mm*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -400 -700 400 600 0 1 10 f
|
||||
X BOOT0 1 -500 300 100 R 50 50 1 1 I
|
||||
X PA4 10 500 100 100 L 50 50 1 1 B
|
||||
X PA5 11 500 0 100 L 50 50 1 1 B
|
||||
X PA6 12 500 -100 100 L 50 50 1 1 B
|
||||
X PA7 13 500 -200 100 L 50 50 1 1 B
|
||||
X PB1 14 -500 -600 100 R 50 50 1 1 B
|
||||
X VSS 15 0 -800 100 U 50 50 1 1 W
|
||||
X VDD 16 0 700 100 D 50 50 1 1 W
|
||||
X PA9 17 500 -300 100 L 50 50 1 1 B
|
||||
X PA10 18 500 -400 100 L 50 50 1 1 B
|
||||
X PA13 19 500 -500 100 L 50 50 1 1 B
|
||||
X PF0 2 -500 -300 100 R 50 50 1 1 I
|
||||
X PA14 20 500 -600 100 L 50 50 1 1 B
|
||||
X PF1 3 -500 -400 100 R 50 50 1 1 I
|
||||
X NRST 4 -500 500 100 R 50 50 1 1 I
|
||||
X VDDA 5 100 700 100 D 50 50 1 1 W
|
||||
X PA0 6 500 500 100 L 50 50 1 1 B
|
||||
X PA1 7 500 400 100 L 50 50 1 1 B
|
||||
X PA2 8 500 300 100 L 50 50 1 1 B
|
||||
X PA3 9 500 200 100 L 50 50 1 1 B
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Mechanical_Housing
|
||||
#
|
||||
DEF Mechanical_Housing N 0 40 Y Y 1 F N
|
||||
F0 "N" 150 0 50 H V L CNN
|
||||
F1 "Mechanical_Housing" 150 -75 50 H V L CNN
|
||||
F2 "" 50 50 50 H I C CNN
|
||||
F3 "" 50 50 50 H I C CNN
|
||||
$FPLIST
|
||||
Enclosure*
|
||||
Housing*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C -175 -125 25 0 1 0 F
|
||||
C -75 -125 25 0 1 0 F
|
||||
S -200 -25 -50 -75 0 1 0 N
|
||||
P 2 0 1 0 -178 -62 -176 -54 N
|
||||
P 2 0 1 0 -174 -66 -160 -66 N
|
||||
P 2 0 1 0 -174 -48 -172 -38 N
|
||||
P 2 0 1 0 -170 -52 -158 -52 N
|
||||
P 2 0 1 0 -166 -36 -154 -36 N
|
||||
P 2 0 1 0 -154 -64 -152 -54 N
|
||||
P 2 0 1 0 -150 -48 -148 -38 N
|
||||
P 2 0 1 0 -142 -62 -140 -54 N
|
||||
P 2 0 1 0 -138 -66 -124 -66 N
|
||||
P 2 0 1 0 -138 -48 -136 -38 N
|
||||
P 2 0 1 0 -134 -52 -122 -52 N
|
||||
P 2 0 1 0 -130 -36 -118 -36 N
|
||||
P 2 0 1 0 -118 -64 -116 -54 N
|
||||
P 2 0 1 0 -114 -48 -112 -38 N
|
||||
P 2 0 1 0 -106 -62 -104 -54 N
|
||||
P 2 0 1 0 -102 -66 -88 -66 N
|
||||
P 2 0 1 0 -102 -48 -100 -38 N
|
||||
P 2 0 1 0 -98 -52 -86 -52 N
|
||||
P 2 0 1 0 -94 -36 -82 -36 N
|
||||
P 2 0 1 0 -82 -64 -80 -54 N
|
||||
P 2 0 1 0 -78 -48 -76 -38 N
|
||||
P 2 0 1 0 -25 0 -25 -175 N
|
||||
P 3 0 1 0 -225 0 -25 0 125 150 N
|
||||
P 7 0 1 0 -225 0 -225 -175 -25 -175 125 -25 125 150 -75 150 -225 0 f
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Mechanical_MountingHole
|
||||
#
|
||||
DEF Mechanical_MountingHole H 0 40 Y Y 1 F N
|
||||
F0 "H" 0 200 50 H V C CNN
|
||||
F1 "Mechanical_MountingHole" 0 125 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
MountingHole*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C 0 0 50 0 1 50 N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Oscillator_OCXO-14
|
||||
#
|
||||
DEF Oscillator_OCXO-14 X 0 10 Y Y 1 F N
|
||||
F0 "X" -200 250 50 H V L CNN
|
||||
F1 "Oscillator_OCXO-14" 50 -250 50 H V L CNN
|
||||
F2 "Oscillator:Oscillator_DIP-14" 450 -350 50 H I C CNN
|
||||
F3 "" -300 100 50 H I C CNN
|
||||
ALIAS GTXO-14V GTXO-S14V VTCXO-14
|
||||
$FPLIST
|
||||
Oscillator*DIP*14*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -400 200 200 -200 0 1 10 f
|
||||
P 9 0 1 0 -275 75 -250 75 -250 125 -225 125 -225 75 -200 75 -200 125 -175 125 -175 75 N
|
||||
X Vcontrol 1 -500 0 100 R 50 50 1 1 I
|
||||
X Vcc 14 0 300 100 D 50 50 1 1 W
|
||||
X GND 7 0 -300 100 U 50 50 1 1 W
|
||||
X OUT 8 300 0 100 L 50 50 1 1 O
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Regulator_Linear_AP1117-33
|
||||
#
|
||||
DEF Regulator_Linear_AP1117-33 U 0 10 Y Y 1 F N
|
||||
F0 "U" -150 125 50 H V C CNN
|
||||
F1 "Regulator_Linear_AP1117-33" 0 125 50 H V L CNN
|
||||
F2 "Package_TO_SOT_SMD:SOT-223-3_TabPin2" 0 200 50 H I C CNN
|
||||
F3 "http://www.diodes.com/datasheets/AP1117.pdf" 100 -250 50 H I C CNN
|
||||
$FPLIST
|
||||
SOT?223*TabPin2*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -200 -200 200 75 0 1 10 f
|
||||
X GND 1 0 -300 100 U 50 50 1 1 W
|
||||
X VO 2 300 0 100 L 50 50 1 1 w
|
||||
X VI 3 -300 0 100 R 50 50 1 1 W
|
||||
X PAD 4 300 -100 100 L 50 50 1 1 w
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Regulator_Linear_NCP1117-12_SOT223
|
||||
#
|
||||
DEF Regulator_Linear_NCP1117-12_SOT223 U 0 10 Y Y 1 F N
|
||||
F0 "U" -150 125 50 H V C CNN
|
||||
F1 "Regulator_Linear_NCP1117-12_SOT223" 0 125 50 H V L CNN
|
||||
F2 "Package_TO_SOT_SMD:SOT-223-3_TabPin2" 0 200 50 H I C CNN
|
||||
F3 "http://www.diodes.com/datasheets/AP1117.pdf" 100 -250 50 H I C CNN
|
||||
ALIAS AP1117-18 AP1117-25 AP1117-33 AP1117-50 LD1117S33TR_SOT223 LD1117S12TR_SOT223 LD1117S18TR_SOT223 LD1117S25TR_SOT223 LD1117S50TR_SOT223 NCP1117-12_SOT223 NCP1117-1.5_SOT223 NCP1117-1.8_SOT223 NCP1117-2.0_SOT223 NCP1117-2.5_SOT223 NCP1117-2.85_SOT223 NCP1117-3.3_SOT223 NCP1117-5.0_SOT223 AMS1117-1.5 AMS1117-1.8 AMS1117-2.5 AMS1117-2.85 AMS1117-3.3 AMS1117-5.0
|
||||
$FPLIST
|
||||
SOT?223*TabPin2*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -200 -200 200 75 0 1 10 f
|
||||
X GND 1 0 -300 100 U 50 50 1 1 W
|
||||
X VO 2 300 0 100 L 50 50 1 1 w
|
||||
X VI 3 -300 0 100 R 50 50 1 1 W
|
||||
X PAD 4 300 -100 100 L 50 50 1 1 w
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Switch_SW_Push_SPDT
|
||||
#
|
||||
DEF Switch_SW_Push_SPDT SW 0 0 Y N 1 F N
|
||||
F0 "SW" 0 170 50 H V C CNN
|
||||
F1 "Switch_SW_Push_SPDT" 0 -200 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
C -80 0 20 0 0 0 N
|
||||
C 80 -100 20 0 0 0 N
|
||||
C 80 100 20 0 1 0 N
|
||||
P 2 0 0 0 0 40 0 120 N
|
||||
P 2 0 1 0 -60 10 100 80 N
|
||||
X A 1 200 100 100 L 50 50 1 1 P
|
||||
X B 2 -200 0 100 R 50 50 1 1 P
|
||||
X C 3 200 -100 100 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Transistor_Array_ULN2803A
|
||||
#
|
||||
DEF Transistor_Array_ULN2803A U 0 20 Y Y 1 F N
|
||||
F0 "U" 0 525 50 H V C CNN
|
||||
F1 "Transistor_Array_ULN2803A" 0 450 50 H V C CNN
|
||||
F2 "" 50 -650 50 H I L CNN
|
||||
F3 "" 100 -200 50 H I C CNN
|
||||
ALIAS ULN2802A ULN2801A ULN2804A ULN2805A
|
||||
$FPLIST
|
||||
DIP*W7.62mm*
|
||||
SOIC*7.5x11.6mm*P1.27mm*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C -70 200 10 0 1 0 N
|
||||
C -50 -90 10 0 1 0 F
|
||||
C -50 0 10 0 1 0 F
|
||||
C -50 100 10 0 1 0 F
|
||||
C -20 200 10 0 1 0 F
|
||||
S -300 -600 300 400 0 1 10 f
|
||||
P 2 0 1 0 -180 200 -140 200 N
|
||||
P 2 0 1 0 -60 200 160 200 N
|
||||
P 2 0 1 0 0 265 -40 265 N
|
||||
P 3 0 1 0 -20 200 -20 300 90 300 N
|
||||
P 4 0 1 0 -140 240 -140 160 -80 200 -140 240 N
|
||||
P 4 0 1 0 0 235 -40 235 -20 265 0 235 N
|
||||
X I1 1 -400 200 100 R 50 50 1 1 I
|
||||
X COM 10 400 300 100 L 50 50 1 1 P
|
||||
X O8 11 400 -500 100 L 50 50 1 1 C
|
||||
X O7 12 400 -400 100 L 50 50 1 1 C
|
||||
X O6 13 400 -300 100 L 50 50 1 1 C
|
||||
X O5 14 400 -200 100 L 50 50 1 1 C
|
||||
X O4 15 400 -100 100 L 50 50 1 1 C
|
||||
X O3 16 400 0 100 L 50 50 1 1 C
|
||||
X O2 17 400 100 100 L 50 50 1 1 C
|
||||
X O1 18 400 200 100 L 50 50 1 1 C
|
||||
X I2 2 -400 100 100 R 50 50 1 1 I
|
||||
X I3 3 -400 0 100 R 50 50 1 1 I
|
||||
X I4 4 -400 -100 100 R 50 50 1 1 I
|
||||
X I5 5 -400 -200 100 R 50 50 1 1 I
|
||||
X I6 6 -400 -300 100 R 50 50 1 1 I
|
||||
X I7 7 -400 -400 100 R 50 50 1 1 I
|
||||
X I8 8 -400 -500 100 R 50 50 1 1 I
|
||||
X GND 9 0 -700 100 U 50 50 1 1 W
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Transistor_BJT_2N3904
|
||||
#
|
||||
DEF Transistor_BJT_2N3904 Q 0 0 Y N 1 F N
|
||||
F0 "Q" 200 75 50 H V L CNN
|
||||
F1 "Transistor_BJT_2N3904" 200 0 50 H V L CNN
|
||||
F2 "Package_TO_SOT_THT:TO-92_Inline" 200 -75 50 H I L CIN
|
||||
F3 "" 0 0 50 H I L CNN
|
||||
$FPLIST
|
||||
TO?92*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C 50 0 111 0 1 10 N
|
||||
P 2 0 1 0 25 25 100 100 N
|
||||
P 3 0 1 0 25 -25 100 -100 100 -100 N
|
||||
P 3 0 1 20 25 75 25 -75 25 -75 N
|
||||
P 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F
|
||||
X E 1 100 -200 100 U 50 50 1 1 P
|
||||
X B 2 -200 0 225 R 50 50 1 1 P
|
||||
X C 3 100 200 100 D 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Transistor_FET_IRF6810S
|
||||
#
|
||||
DEF Transistor_FET_IRF6810S Q 0 0 Y N 1 F N
|
||||
F0 "Q" 200 75 50 H V L CNN
|
||||
F1 "Transistor_FET_IRF6810S" 200 0 50 H V L CNN
|
||||
F2 "Package_DirectFET:DirectFET_S1" 0 0 50 H I C CIN
|
||||
F3 "" 0 0 50 H I L CNN
|
||||
ALIAS IRF6810S
|
||||
$FPLIST
|
||||
DirectFET*S1*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C 65 0 111 0 1 10 N
|
||||
C 100 -70 11 0 1 0 F
|
||||
C 100 70 11 0 1 0 F
|
||||
P 2 0 1 0 -100 0 10 0 N
|
||||
P 2 0 1 0 30 -70 100 -70 N
|
||||
P 2 0 1 10 30 -50 30 -90 N
|
||||
P 2 0 1 0 30 0 100 0 N
|
||||
P 2 0 1 10 30 20 30 -20 N
|
||||
P 2 0 1 0 30 70 100 70 N
|
||||
P 2 0 1 10 30 90 30 50 N
|
||||
P 2 0 1 0 100 -70 100 -100 N
|
||||
P 2 0 1 0 100 -70 100 0 N
|
||||
P 2 0 1 0 100 100 100 70 N
|
||||
P 3 0 1 10 10 75 10 -75 10 -75 N
|
||||
P 4 0 1 0 40 0 80 15 80 -15 40 0 F
|
||||
P 4 0 1 0 100 -70 130 -70 130 70 100 70 N
|
||||
P 4 0 1 0 110 20 115 15 145 15 150 10 N
|
||||
P 4 0 1 0 130 15 115 -10 145 -10 130 15 N
|
||||
X D 1 100 200 100 D 50 50 1 1 P
|
||||
X G 2 -200 0 100 R 50 50 1 1 I
|
||||
X S 3 100 -200 100 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+12V
|
||||
#
|
||||
DEF power_+12V #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+12V" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +12V 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+15V
|
||||
#
|
||||
DEF power_+15V #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+15V" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +15V 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+3.3V
|
||||
#
|
||||
DEF power_+3.3V #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+3.3V" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +3V3 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+3V3
|
||||
#
|
||||
DEF power_+3V3 #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+3V3" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
ALIAS +3.3V
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +3V3 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_Earth
|
||||
#
|
||||
DEF power_Earth #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "power_Earth" 0 -150 50 H I C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -25 -75 25 -75 N
|
||||
P 2 0 1 0 -5 -100 5 -100 N
|
||||
P 2 0 1 0 0 -50 0 0 N
|
||||
P 2 0 1 0 50 -50 -50 -50 N
|
||||
X Earth 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_GND
|
||||
#
|
||||
DEF power_GND #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "power_GND" 0 -150 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
|
||||
X GND 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_GNDD
|
||||
#
|
||||
DEF power_GNDD #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "power_GNDD" 0 -125 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
S -50 -60 50 -80 0 1 10 F
|
||||
P 2 0 1 0 0 0 0 -60 N
|
||||
X GNDD 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_VBUS
|
||||
#
|
||||
DEF power_VBUS #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_VBUS" 0 150 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X VBUS 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
||||
63
hardware/grid-recorder/platform.csv
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
Reference, Quantity, Value, Footprint, Datasheet, Link, Reichelt
|
||||
C1 C12 ,2,"100p NP0","Capacitor_SMD:C_0603_1608Metric","https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=B300%2FGENERAL_CAPACITORS_010811.pdf","https://www.reichelt.de/smd-vielschicht-keramikkondensator-100p-5-npo-g0603-100p-p31858.html?&trstct=pol_10","NPO-G0603 100P"
|
||||
C11 ,1,"10n","Capacitor_SMD:C_0603_1608Metric","","https://www.reichelt.de/smd-vielschicht-keramikkondensator-10n-10-x7r-g0603-10n-p31870.html?&trstct=pos_0","X7R-G0603 10N"
|
||||
C13 C3 ,2,"10u 25V","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/vielschicht-kerko-10-f-16v-125-c-kem-x7r1206-10u-p207163.html?&trstct=pos_5","KEM X7R1206 10U"
|
||||
C15 C17 ,2,"100n 25V","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-100n-10-x7r-g0603-100n-p31873.html?&trstct=pol_0","X7R-G0603 100N"
|
||||
C16 C18 ,2,"10n 25V","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-10n-10-x7r-g0603-10n-p31870.html?&trstct=pos_0","X7R-G0603 10N"
|
||||
C19 ,1,"10p","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-10p-5-npo-g0603-10p-p31853.html?&trstct=pos_0","NPO-G0603 10P"
|
||||
C2 ,1,"47u 25V","Capacitor_SMD:CP_Elec_8x6.2","~","https://www.reichelt.de/smd-elko-47-f-25-v-105-c-5000-h-20-hd-v-47u-25-p228575.html?&trstct=pos_3","HD-V 47U 25"
|
||||
C21 ,1,"1n","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-1-0n-10-x7r-g0603-1-0n-p31864.html?&trstct=pos_0","X7R-G0603 1,0N"
|
||||
C22 ,1,"10u","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/vielschicht-kerko-10-f-16v-125-c-kem-x7r1206-10u-p207163.html?&trstct=pos_5","KEM X7R1206 10U"
|
||||
C23 C6 C9 ,3,"1u","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/vielschicht-kerko-1-0-f-50v-125-c-kem-x7r1206-1-0u-p207160.html?&trstct=pos_2","KEM X7R1206 1,0U"
|
||||
C25 C26 ,2,"22p","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-22p-5-npo-g0603-22p-p31854.html?&trstct=pos_1","NPO-G0603 22P"
|
||||
C27 C24 C20 C7 C8 C10 ,6,"100n","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-100n-10-x7r-g0603-100n-p31873.html?&trstct=pol_0","X7R-G0603 100N"
|
||||
C4 C14 ,2,"1u 25V","Capacitor_SMD:C_0603_1608Metric","~","https://www.reichelt.de/vielschicht-kerko-1-0-f-50v-125-c-kem-x7r1206-1-0u-p207160.html?&trstct=pos_2","KEM X7R1206 1,0U"
|
||||
C5 ,1,"100n 25V","Capacitor_SMD:C_0805_2012Metric","~","https://www.reichelt.de/smd-vielschicht-keramikkondensator-100n-10-x7r-g0805-100n-p31879.html?&trstct=pol_0","X7R-G0805 100N"
|
||||
D1 ,1,"3V6","","https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A900%2FSMD+ZD_Serie%23fair.pdf","https://www.reichelt.de/zenerdiode-3-6-v-0-35-w-sot-23-smd-zd-3-6-p18906.html?&trstct=pos_1","BZX84C3,6"
|
||||
D2 ,1,"16V 1.3W","Diode_THT:D_DO-41_SOD81_P7.62mm_Horizontal","~","https://www.reichelt.de/zenerdiode-16-v-1-3-w-do-204al-do41-zd-16-p23072.html?r=1","ZD 16"
|
||||
D3 ,1,"12v 1.3w","","https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A900%2FSMD+ZD_Serie%23fair.pdf","https://www.reichelt.de/zenerdiode-12-v-0-35-w-sot-23-smd-zd-12-p18893.html?&trstct=pos_1","SMD ZD 12"
|
||||
D4 ,1,"US1G","Diode_SMD:D_SMA","https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A400%2FUS1G_US1M-TSC.pdf","https://www.reichelt.de/schottkydiode-400-v-1-a-do-214ac-sma-us-1g-p146617.html?&trstct=pos_2","US 1G"
|
||||
E13 ,1,"JST - Buchsengehäuse, 1x6-polig - XH","","","https://www.reichelt.de/jst-buchsengehaeuse-1x6-polig-xh-jst-xh6p-bu-p185089.html?&trstct=pos_4","JST XH6P BU"
|
||||
E15 ,1,"JST - Buchsengehäuse, 1x8-polig - XH","","","https://www.reichelt.de/jst-buchsengehaeuse-1x8-polig-xh-jst-xh8p-bu-p185090.html?&trstct=pos_6","JST XH8P BU"
|
||||
E16 E19 E22 E25 E28 ,5,"LED-Signalleuchte, grün, 12 V, Ø 6 mm, rund, bedrahtet","","","https://www.reichelt.de/led-signalleuchte-gruen-12-v-6-mm-rund-bedrahtet-apm-qs63-g12-p173927.html?&trstct=pol_11","APM QS63 G12"
|
||||
E18 E21 E24 E27 E33 E17 E20 E30 E29 E23 E26 E32 E12 E14 ,14,"JST - Crimpkontakt, Buchse - XH","","","https://www.reichelt.de/jst-crimpkontakt-buchse-xh-jst-xh-ckb-p185091.html?&trstct=pos_0","JST XH CKB"
|
||||
E3 E5 ,2,"Sicherungshalter für 5 x 20 mm, 250 V, 6,3 A, grün","","","https://www.reichelt.de/sicherungshalter-fuer-5-x-20-mm-250-v-6-3-a-gruen-rnd-170-00188-p253173.html?&trstct=pol_9","RND 170-00188"
|
||||
E31 E34 ,2,"LED-Signalleuchte, rot, 12 V, Ø 6 mm, rund, bedrahtet","","","https://www.reichelt.de/led-signalleuchte-rot-12-v-6-mm-rund-bedrahtet-apm-qs63-r12-p173929.html?&trstct=vrt_pdn","APM QS63 R12"
|
||||
E4 ,1,"JST - Buchsengehäuse, 1x2-polig - VH","","","https://www.reichelt.de/jst-buchsengehaeuse-1x2-polig-vh-jst-vh2p-bu-p185107.html?&trstct=pos_0","JST VH2P BU"
|
||||
E6 ,1,"JST - Stiftleiste, gerade, 1x2-polig - VH","","","https://www.reichelt.de/jst-stiftleiste-gerade-1x2-polig-vh-jst-vh2p-st-p185110.html?&trstct=pos_0","JST VH2P ST"
|
||||
E7 ,1,"JST - Buchsengehäuse, 1x3-polig - VH","","","https://www.reichelt.de/jst-buchsengehaeuse-1x3-polig-vh-jst-vh3p-bu-p185108.html?&trstct=lsbght_sldr::185111","JST VH3P BU"
|
||||
E8 ,1,"JST - Stiftleiste, gerade, 1x3-polig - VH","","","https://www.reichelt.de/jst-stiftleiste-gerade-1x3-polig-vh-jst-vh3p-st-p185111.html?&trstct=pol_7","JST VH3P ST"
|
||||
E9 E10 E11 E2 E1 ,5,"JST - Crimpkontakt, Buchse - VH","","","https://www.reichelt.de/jst-crimpkontakt-buchse-vh-jst-vh-cks-p185113.html?&trstct=lsbght_sldr::185108","JST VH CKS"
|
||||
F1 F2 ,2,"F 0.1A","","https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=C400%2FDS_520500.pdf","https://www.reichelt.de/g-sicherungseinsatz-5x20mm-flink-0-125-a-k-flink-0-125-a-p119322.html?r=1","K-FLINK 0,125 A"
|
||||
J1 ,1,"230V in","","~","https://www.reichelt.de/kaltgeraeteeinbaustecker-standard-10-a-6-3-mm-faston-rnd-465-00780-p254045.html?&trstct=pol_3","RND 465-00780"
|
||||
J2 ,1,"SWD","","~","n/a","n/a"
|
||||
J3 ,1,"Conn_01x08_Male","","~","https://www.reichelt.de/jst-stiftleiste-gerade-1x8-polig-xh-jst-xh8p-st-p185078.html?&trstct=pos_8","JST XH8P ST"
|
||||
J4 ,1,"USB_B","Connector_USB:USB_B_OST_USB-B1HSxx_Horizontal"," ~","https://www.reichelt.de/usb-einbaubuchse-serie-b-gew-printmontage-usb-bw-p22186.html?&trstct=pol_6","USB BW"
|
||||
J5 ,1,"Conn_01x06_Male","","~","https://www.reichelt.de/jst-stiftleiste-gerade-1x6-polig-xh-jst-xh6p-st-p185077.html?&trstct=pos_14","JST XH6P ST"
|
||||
L2 L1 ,2,"100u","Inductor_SMD:L_Taiyo-Yuden_NR-40xx","~","https://www.reichelt.de/chip-induktivitaet-1616fps-100-h-l-1616fps-100-p138628.html?&trstct=pos_10","L-1616FPS 100µ"
|
||||
NE1 ,1,"red","","~","https://www.reichelt.de/led-signalleuchte-rot-220-v-8-mm-rund-bedrahtet-apm-qs83-hr220-p174025.html?&trstct=pol_8","APM QS83 HR220"
|
||||
PS1 ,1,"IRM-10-15","Converter_ACDC:Converter_ACDC_MeanWell_IRM-02-xx_THT","http://www.meanwell.com/productPdf.aspx?i=675","https://www.reichelt.de/ac-dc-wandler-85-305-v-ac-12-v-dc-modul-mw-irm-02-12-p203025.html?&trstct=pol_2","IRM-10-15"
|
||||
Q1 ,1,"IRLML6244","Package_DirectFET:DirectFET_S1","https://www.infineon.com/dgdl/irf6810spbf.pdf?fileId=5546d462533600a4015355f0ab331ab4","https://www.reichelt.de/mosfet-n-ch-20v-6-3a-1-3w-sot-23-irlml-6244-p132145.html?&trstct=pos_0","IRLML 6244"
|
||||
Q2 ,1,"2N3904","Package_TO_SOT_THT:TO-92_Inline","https://www.fairchildsemi.com/datasheets/2N/2N3904.pdf","https://www.reichelt.de/bipolartransistor-npn-45v-0-1a-0-3w-sot-23-rnd-bc847c-p223363.html?&trstct=pos_13","RND 847C"
|
||||
R12 ,1,"130","","~","https://www.reichelt.de/smd-widerstand-0603-130-ohm-100-mw-1-rnd-0603-1-130-p183016.html?r=1","RND 0603 1 130"
|
||||
R13 R11 R14 R17 R18 R16 R15 ,7,"470","","~","https://www.reichelt.de/smd-widerstand-0603-470-ohm-100-mw-1-smd-0603-470-p89426.html?&trstct=pos_7","SMD-0603 470"
|
||||
R19 R10 ,2,"1k","","~","https://www.reichelt.de/smd-widerstand-0603-11-kohm-100-mw-1-rnd-0603-1-11k-p183078.html?&trstct=pos_0","RND 0603 1 1k"
|
||||
R20 ,1,"300","","~","https://www.reichelt.de/smd-widerstand-0603-300-ohm-200-mw-1-rnd-155hp03-ce-p250652.html?&trstct=pos_1","RND 155HP03 CE"
|
||||
R21 ,1,"0","","~","https://www.reichelt.de/smd-widerstand-0603-0-0-ohm-100-mw-1-rnd-0603-1-0-p212696.html?&trstct=pos_0","RND 0603 1 0"
|
||||
R22 ,1,"10k","","~","https://www.reichelt.de/smd-widerstand-0603-10-kohm-100-mw-1-rnd-0603-1-10k-p183077.html?&trstct=pos_0","RND 0603 1 10k"
|
||||
R3 ,1,"27k 1W 500V","","~","https://www.reichelt.de/widerstand-metalloxyd-27-kohm-0207-1-0-w-5-1w-27k-p1806.html?&trstct=pos_0","1W 27K"
|
||||
R4 ,1,"4k7 1W 500V","","~","https://www.reichelt.de/widerstand-metalloxyd-4-7-kohm-0207-1-0-w-5-1w-4-7k-p1822.html?&trstct=pos_0","1W 4,7K"
|
||||
R6 R2 R1 R5 ,4,"330k 1W 500V","","~","https://www.reichelt.de/widerstand-metalloxyd-330-kohm-0207-1-0-w-5-1w-330k-p1815.html?&trstct=pos_0","1W 330K"
|
||||
R7 ,1,"1k2","","~","https://www.reichelt.de/smd-widerstand-0603-1-5-kohm-100-mw-1-smd-0603-1-5k-p89432.html?r=1","SMD-0603 1,5K"
|
||||
R9 R8 ,2,"1M 1W 500V","","~","https://www.reichelt.de/widerstand-metalloxyd-1-0-mohm-0207-1-0-w-5-1w-1-0m-p1766.html?&trstct=pos_0","1W 1,0M"
|
||||
RV1 ,1,"1/4W 275VAC","","~","https://www.reichelt.de/varistor-rm-5mm-0-25w-275vac-vdr-0-25-270-p22310.html?&trstct=pol_3","VDR-0,25 270"
|
||||
RV2 ,1,"47k","","~","https://www.reichelt.de/praezisionspotentiometer-25-gaenge-stehend-50-kohm-64y-50k-p2727.html?&trstct=pol_2","64Y-50K"
|
||||
SW1 SW2 ,2,"Panasonic AV32143AT","","https://www.reichelt.de/bilder/elements/sonstige/64x64/pdf_64x64.png","https://www.reichelt.de/snap-action-mikroschalter-1x-um-flachhebel-av-32143-at-p191400.html?&trstct=pol_13","AV 32143 AT"
|
||||
U1 ,1,"AP1117-33","Package_TO_SOT_SMD:SOT-223-3_TabPin2","http://www.diodes.com/datasheets/AP1117.pdf","https://www.reichelt.de/ldo-regler-fest-3-3-v-sot-223-ts-1117-bcw33-p115971.html?&trstct=pos_8","TS 1117 BCW33"
|
||||
U2 ,1,"MC78M12CDTG","Package_TO_SOT_SMD:TO-263-2","http://www.onsemi.com/pub_link/Collateral/NCP1117-D.PDF","https://www.reichelt.de/spannungsregler-fest-12-v-d2pak-mc-78m12-cdtg-p189092.html?&trstct=pos_1","MC 78M12 CDTG"
|
||||
U3 ,1,"STM32F030F4Px","Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm","http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00088500.pdf","https://www.reichelt.de/mcu-arm-32-bit-16-kb-tssop-20-stm-32f030f4p6-p168428.html?&trstct=pos_0","STM 32F030F4P6"
|
||||
U4 U7 ,2,"6N137","Package_DIP:DIP-8_W7.62mm","http://docs.avagotech.com/docs/AV02-0391EN","https://www.reichelt.de/optokoppler-6n-137-p2858.html?&trstct=pol_27","6N 137"
|
||||
U5 ,1,"ULN2003D","","http://www.ti.com/lit/ds/symlink/uln2003a.pdf","https://www.reichelt.de/seven-darlington-arrays-so-16-uln-2003d1013-p219277.html?r=1","ULN 2003D1013"
|
||||
U6 ,1,"CH340G","Package_SO:SOIC-16_3.9x9.9mm_P1.27mm","http://www.datasheet5.com/pdf-local-2195953"
|
||||
X1 ,1,"OCXO-14","Oscillator:Oscillator_DIP-14","http://www.petermann-technik.de/fileadmin/petermann/pdf/crystal-oscillators/OCXO-14_PETERMANN-TECHNIK.pdf"
|
||||
Y1 ,1,"12M","","~","https://www.reichelt.de/smd-quarz-grundton-12-000000-mhz-12-0000-hc49-smd-p72514.html?&trstct=pol_2","12,0000-HC49-SMD"
|
||||
|
Can't render this file because it has a wrong number of fields in line 61.
|
6499
hardware/grid-recorder/platform.kicad_pcb
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
(module "Panasonic_AV32143AT" (layer F.Cu) (tedit 5DB84D25)
|
||||
(fp_text reference "REF**" (at 0 0.5) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value "Panasonic_AV32143AT" (at 0 -0.5) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start -3.5 4.5) (end -3.5 -4.5) (layer F.CrtYd) (width 0.12))
|
||||
(fp_line (start 18.5 4.5) (end -3.5 4.5) (layer F.CrtYd) (width 0.12))
|
||||
(fp_line (start 18.5 -4.5) (end 18.5 4.5) (layer F.CrtYd) (width 0.12))
|
||||
(fp_line (start -3.5 -4.5) (end 18.5 -4.5) (layer F.CrtYd) (width 0.12))
|
||||
(fp_line (start 4.75 0) (end 1.25 2.25) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start 1.25 -2.25) (end 4.75 0) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start 16.75 -2.25) (end -0.5 -2.25) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start 16.75 2.25) (end 16.75 -2.25) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start -0.5 2.25) (end 16.75 2.25) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start -0.5 -2.25) (end -0.5 2.25) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start -2.2 3.5) (end 17.6 3.5) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start 17.6 -3.5) (end -2.2 -3.5) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start 17.6 -3.5) (end 17.6 3.5) (layer F.SilkS) (width 0.5))
|
||||
(fp_line (start -2.2 -3.5) (end -2.2 3.5) (layer F.SilkS) (width 0.5))
|
||||
(pad "2" thru_hole roundrect (at 0 0) (size 5 3.25) (drill oval 4.05 1.25) (layers *.Cu *.Mask) (roundrect_rratio 0.25))
|
||||
(pad "3" thru_hole roundrect (at 8.7 0) (size 4.5 3.25) (drill oval 4.05 1.25) (layers *.Cu *.Mask) (roundrect_rratio 0.25))
|
||||
(pad "1" thru_hole roundrect (at 15.4 0) (size 4.5 3.25) (drill oval 4.05 1.25) (layers *.Cu *.Mask) (roundrect_rratio 0.25))
|
||||
)
|
||||
258
hardware/grid-recorder/platform.pro
Normal file
|
|
@ -0,0 +1,258 @@
|
|||
update=Wed Oct 30 21:18:42 2019
|
||||
version=1
|
||||
last_client=kicad
|
||||
[general]
|
||||
version=1
|
||||
RootSch=
|
||||
BoardNm=
|
||||
[cvpcb]
|
||||
version=1
|
||||
NetIExt=net
|
||||
[eeschema]
|
||||
version=1
|
||||
LibDir=
|
||||
[eeschema/libraries]
|
||||
[pcbnew]
|
||||
version=1
|
||||
PageLayoutDescrFile=
|
||||
LastNetListRead=
|
||||
LastSTEPExportPath=
|
||||
LastIDFExportPath=
|
||||
LastVRMLExportPath=
|
||||
LastSpecctraDSNExportPath=
|
||||
LastGenCADExportPath=
|
||||
CopperLayerCount=2
|
||||
BoardThickness=1.6
|
||||
AllowMicroVias=0
|
||||
AllowBlindVias=0
|
||||
RequireCourtyardDefinitions=0
|
||||
ProhibitOverlappingCourtyards=1
|
||||
MinTrackWidth=0.2
|
||||
MinViaDiameter=0.4
|
||||
MinViaDrill=0.3
|
||||
MinMicroViaDiameter=0.2
|
||||
MinMicroViaDrill=0.09999999999999999
|
||||
MinHoleToHole=0.25
|
||||
CopperEdgeClearance=0.01
|
||||
TrackWidth1=0.25
|
||||
TrackWidth2=0.25
|
||||
TrackWidth3=0.5
|
||||
TrackWidth4=0.8
|
||||
TrackWidth5=1.2
|
||||
TrackWidth6=1.8
|
||||
TrackWidth7=2.8
|
||||
ViaDiameter1=0.8
|
||||
ViaDrill1=0.4
|
||||
ViaDiameter2=0.8
|
||||
ViaDrill2=0.4
|
||||
ViaDiameter3=1.2
|
||||
ViaDrill3=0.6
|
||||
ViaDiameter4=1.6
|
||||
ViaDrill4=0.8
|
||||
ViaDiameter5=2.4
|
||||
ViaDrill5=1.2
|
||||
dPairWidth1=0.2
|
||||
dPairGap1=0.25
|
||||
dPairViaGap1=0.25
|
||||
SilkLineWidth=0.12
|
||||
SilkTextSizeV=1
|
||||
SilkTextSizeH=1
|
||||
SilkTextSizeThickness=0.15
|
||||
SilkTextItalic=0
|
||||
SilkTextUpright=1
|
||||
CopperLineWidth=0.2
|
||||
CopperTextSizeV=1.5
|
||||
CopperTextSizeH=1.5
|
||||
CopperTextThickness=0.3
|
||||
CopperTextItalic=0
|
||||
CopperTextUpright=1
|
||||
EdgeCutLineWidth=0.05
|
||||
CourtyardLineWidth=0.05
|
||||
OthersLineWidth=0.09999999999999999
|
||||
OthersTextSizeV=1
|
||||
OthersTextSizeH=1
|
||||
OthersTextSizeThickness=0.15
|
||||
OthersTextItalic=0
|
||||
OthersTextUpright=1
|
||||
SolderMaskClearance=0.051
|
||||
SolderMaskMinWidth=0.25
|
||||
SolderPasteClearance=0
|
||||
SolderPasteRatio=-0
|
||||
[pcbnew/Layer.F.Cu]
|
||||
Name=F.Cu
|
||||
Type=0
|
||||
Enabled=1
|
||||
[pcbnew/Layer.In1.Cu]
|
||||
Name=In1.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In2.Cu]
|
||||
Name=In2.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In3.Cu]
|
||||
Name=In3.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In4.Cu]
|
||||
Name=In4.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In5.Cu]
|
||||
Name=In5.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In6.Cu]
|
||||
Name=In6.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In7.Cu]
|
||||
Name=In7.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In8.Cu]
|
||||
Name=In8.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In9.Cu]
|
||||
Name=In9.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In10.Cu]
|
||||
Name=In10.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In11.Cu]
|
||||
Name=In11.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In12.Cu]
|
||||
Name=In12.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In13.Cu]
|
||||
Name=In13.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In14.Cu]
|
||||
Name=In14.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In15.Cu]
|
||||
Name=In15.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In16.Cu]
|
||||
Name=In16.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In17.Cu]
|
||||
Name=In17.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In18.Cu]
|
||||
Name=In18.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In19.Cu]
|
||||
Name=In19.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In20.Cu]
|
||||
Name=In20.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In21.Cu]
|
||||
Name=In21.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In22.Cu]
|
||||
Name=In22.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In23.Cu]
|
||||
Name=In23.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In24.Cu]
|
||||
Name=In24.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In25.Cu]
|
||||
Name=In25.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In26.Cu]
|
||||
Name=In26.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In27.Cu]
|
||||
Name=In27.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In28.Cu]
|
||||
Name=In28.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In29.Cu]
|
||||
Name=In29.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.In30.Cu]
|
||||
Name=In30.Cu
|
||||
Type=0
|
||||
Enabled=0
|
||||
[pcbnew/Layer.B.Cu]
|
||||
Name=B.Cu
|
||||
Type=0
|
||||
Enabled=1
|
||||
[pcbnew/Layer.B.Adhes]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.F.Adhes]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.B.Paste]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.F.Paste]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.B.SilkS]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.F.SilkS]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.B.Mask]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.F.Mask]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Dwgs.User]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Cmts.User]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Eco1.User]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Eco2.User]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Edge.Cuts]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Margin]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.B.CrtYd]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.F.CrtYd]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.B.Fab]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.F.Fab]
|
||||
Enabled=1
|
||||
[pcbnew/Layer.Rescue]
|
||||
Enabled=0
|
||||
[pcbnew/Netclasses]
|
||||
[pcbnew/Netclasses/Default]
|
||||
Name=Default
|
||||
Clearance=0.15
|
||||
TrackWidth=0.25
|
||||
ViaDiameter=0.8
|
||||
ViaDrill=0.4
|
||||
uViaDiameter=0.3
|
||||
uViaDrill=0.1
|
||||
dPairWidth=0.2
|
||||
dPairGap=0.25
|
||||
dPairViaGap=0.25
|
||||
3025
hardware/grid-recorder/platform.sch
Normal file
2250
hardware/grid-recorder/platform.xml
Normal file
3
hardware/grid-recorder/sym-lib-table
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
(sym_lib_table
|
||||
(lib (name "components")(type "Legacy")(uri "${KIPRJMOD}/components.lib")(options "")(descr ""))
|
||||
)
|
||||
BIN
hardware/grid-recorder/top_overlay.png
Normal file
|
After Width: | Height: | Size: 450 KiB |
31
hardware/grid-recorder/zip_tie_anchor.scad
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
|
||||
module base() { offset(5, $fn=32) square([24, 45], center=true); };
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(1) base();
|
||||
translate([0, 0, 0.9999]) minkowski() {
|
||||
linear_extrude(0.001) offset(-5) base();
|
||||
cylinder(3, 5, 0, $fn=32);
|
||||
}
|
||||
}
|
||||
|
||||
for (i=[0,-1,1,-2,2]) {
|
||||
translate([0, i*8, 0.7]) {
|
||||
translate([-20, -2, 0]) {
|
||||
cube ([40, 4, 1.5]);
|
||||
}
|
||||
|
||||
translate([24/2, -2, 0]) {
|
||||
cube ([40, 4, 10]);
|
||||
}
|
||||
|
||||
translate([-24/2-40, -2, 0]) {
|
||||
cube ([40, 4, 10]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
translate([0, 11, 5+0.7]) cube([24-10, 14, 10], center=true);
|
||||
translate([0, -11, 5+0.7]) cube([24-10, 14, 10], center=true);
|
||||
}
|
||||