Showing preview only (1,205K chars total). Download the full file or copy to clipboard to get everything.
Repository: jamesbowman/i2cdriver
Branch: master
Commit: a4bb1abe2175
Files: 114
Total size: 1.1 MB
Directory structure:
gitextract_xb_7azzl/
├── .github/
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .readthedocs.yml
├── .travis.yml
├── LICENSE
├── README.md
├── c/
│ ├── common/
│ │ ├── i2cdriver.c
│ │ └── i2cdriver.h
│ ├── go
│ ├── linux/
│ │ ├── Makefile
│ │ ├── Makefile.clang
│ │ └── i2c.c
│ └── win32/
│ ├── Makefile
│ └── i2c.c
├── firmware/
│ ├── README.md
│ ├── assets/
│ │ ├── IBMPlexSans-SemiBold.otf
│ │ ├── go
│ │ └── mkfont.py
│ ├── capture.fs
│ ├── font.fs
│ ├── fontsize.fs
│ ├── main.fs
│ └── st7735.fs
├── hardware/
│ ├── i2cdriver.brd
│ └── i2cdriver.sch
├── nsis/
│ ├── .gitignore
│ ├── go.bat
│ ├── i2cdriver.nsi
│ └── license.txt
├── python/
│ ├── .gitignore
│ ├── EDS.py
│ ├── MANIFEST
│ ├── docs/
│ │ ├── Makefile
│ │ ├── conf.py
│ │ ├── go
│ │ ├── index.rst
│ │ └── requirements.txt
│ ├── go
│ ├── i2cdriver.py
│ ├── lm75b.py
│ ├── samples/
│ │ ├── EDS-ACCEL.py
│ │ ├── EDS-BEEP.py
│ │ ├── EDS-CLOCK.py
│ │ ├── EDS-DIG2.py
│ │ ├── EDS-EPROM.py
│ │ ├── EDS-LED.py
│ │ ├── EDS-MAGNET.py
│ │ ├── EDS-POT.py
│ │ ├── EDS-REMOTE.py
│ │ ├── EDS-TEMP.py
│ │ ├── EDS-color-compass.py
│ │ ├── EDS-egg-timer.py
│ │ ├── EDS-take-a-ticket.py
│ │ ├── bargraph.py
│ │ ├── bmp390.py
│ │ ├── bno080.py
│ │ ├── capture.py
│ │ ├── cp437-8x8
│ │ ├── go
│ │ ├── ht16k33.py
│ │ ├── i2cgui.py
│ │ ├── lcd1602.py
│ │ ├── led8x8.py
│ │ ├── mag3110.py
│ │ ├── mux.py
│ │ ├── oled.py
│ │ ├── pca9685.py
│ │ ├── qwiic-joystick.py
│ │ ├── qwiic-keypad.py
│ │ ├── read-temperature.py
│ │ ├── touch.py
│ │ └── wii.py
│ ├── setup.py
│ └── tests/
│ └── accept.py
├── python3/
│ ├── .gitignore
│ ├── EDS.py
│ ├── README.md
│ ├── go
│ ├── i2cdriver.py
│ ├── pyproject.toml
│ └── samples/
│ ├── EDS-ACCEL.py
│ ├── EDS-BEEP.py
│ ├── EDS-CLOCK.py
│ ├── EDS-DIG2.py
│ ├── EDS-EPROM.py
│ ├── EDS-LED.py
│ ├── EDS-MAGNET.py
│ ├── EDS-POT.py
│ ├── EDS-REMOTE.py
│ ├── EDS-TEMP.py
│ ├── EDS-color-compass.py
│ ├── EDS-egg-timer.py
│ ├── EDS-take-a-ticket.py
│ ├── bargraph.py
│ ├── bmp390.py
│ ├── bno080.py
│ ├── capture.py
│ ├── cp437-8x8
│ ├── go
│ ├── ht16k33.py
│ ├── i2cgui.py
│ ├── lcd1602.py
│ ├── led8x8.py
│ ├── mag3110.py
│ ├── mux.py
│ ├── oled.py
│ ├── pca9685.py
│ ├── qwiic-joystick.py
│ ├── qwiic-keypad.py
│ ├── read-temperature.py
│ ├── tcr.py
│ ├── touch.py
│ └── wii.py
└── testall
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/ci.yml
================================================
name: Lightweight regressions
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Python 3
uses: actions/setup-python@v1
with:
python-version: 3.13
- name: Install dependencies
run: |
python -m pip install --upgrade pip
# pip install -r requirements.txt
- name: Build and run tests
run: ./testall
================================================
FILE: .gitignore
================================================
__pycache__
*.pyc
/c/build/
/c/bin/
/c/obj/
================================================
FILE: .readthedocs.yml
================================================
# .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: python/docs/conf.py
# Optionally set the version of Python and requirements required to build your docs
python:
install:
- method: pip
path: python
formats: all
================================================
FILE: .travis.yml
================================================
language: generic
script: ./testall
matrix:
include:
- os: linux
sudo: required
python: 2.7
install: pip install pyserial
env: TOXENV=py27
- os: linux
sudo: required
python: 3.4
install: pip install pyserial
env: TOXENV=py34
- os: linux
sudo: required
python: 3.5
install: pip install pyserial
env: TOXENV=py35
- os: osx
sudo: required
install: pip install pyserial
env: TOXENV=py33
================================================
FILE: LICENSE
================================================
BSD 3-Clause License
Copyright (c) 2019, James Bowman
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* 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.
* Neither the name of the copyright holder 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.
================================================
FILE: README.md
================================================

[](https://travis-ci.org/jamesbowman/i2cdriver)
[](https://i2cdriver.readthedocs.io/en/latest/?badge=latest)
I2CDriver is a tool for controlling any I2C device from your PC's USB port,
and can also monitor and capture I2C traffic.
It connects as a standard USB serial device, so there are no drivers to install.
On the main site
[i2cdriver.com](https://i2cdriver.com),
there are drivers for
* Windows/Mac/Linux GUI
* Windows/Mac/Linux command-line
* Python 2 and 3
* Windows/Mac/Linux C/C++

Full documentation is at
[i2cdriver.com](http://i2cdriver.com).
For developers: How to make a release
-------------------------------------
To release Python:
cd python3
rm -rf dist/*
python -m build
twine check dist/*
twine upload dist/*
To build the Windows installer, you first need to build the two executables
``i2ccl.exe`` and ``i2cgui.exe`` then use an NSIS script to create the installer.
On Linux cross-compile ``i2ccl``:
cd c
make -f win32/Makefile
On Windows first make sure that you can run the GUI on the command-line, e.g.
python python\samples\i2cgui.py
(You may need to install i2cdriver, wxPython and pySerial).
Then build the GUI executable using ``pyinstaller``:
cd python\samples
pyinstaller --onefile --windowed --icon=../../images/i2cdriver.ico i2cgui.py
This builds the executable in ``python\samples\dist\i2cgui.exe``.
The Windows installer is built with NSIS (Nullsoft Scriptable Install System). Download and install it.
Copy the two executables ``i2ccl.exe`` and ``i2cgui.exe`` into ``nsis/``.
Then build the installer with NSIS:
cd nsis
"C:\Program Files\NSIS\makensis.exe" i2cdriver.nsi
The script ``go.bat`` in ``nsis`` has an example complete flow.
================================================
FILE: c/common/i2cdriver.c
================================================
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>
#include <fcntl.h>
#if !defined(WIN32)
#include <sys/ioctl.h>
#include <unistd.h>
#endif
#include <errno.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <string.h>
#include <stdbool.h>
#include "i2cdriver.h"
// **************************** Serial port ********************************
#if defined(WIN32) // {
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
void ErrorExit(const char *func_name)
{
// Retrieve the system error message for the last-error code
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
// Display the error message and exit the process
char mm[256];
snprintf(mm, sizeof(mm), "%s failed with error %lu:\n%s", func_name, dw, (char*)lpMsgBuf);
MessageBox(NULL, (LPCTSTR)mm, TEXT("Error"), MB_OK);
LocalFree(lpMsgBuf);
ExitProcess(dw);
}
HANDLE openSerialPort(const char *portname)
{
char fullname[10];
const char *fmt;
if (portname[0] == 'C')
fmt = "\\\\.\\%s";
else
fmt = "%s";
snprintf(fullname, sizeof(fullname), fmt, portname);
DWORD accessdirection = GENERIC_READ | GENERIC_WRITE;
HANDLE hSerial = CreateFile((LPCSTR)fullname,
accessdirection,
0,
0,
OPEN_EXISTING,
0,
0);
if (hSerial == INVALID_HANDLE_VALUE) {
ErrorExit("CreateFile");
}
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
ErrorExit("GetCommState");
}
dcbSerialParams.BaudRate = 1000000;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
ErrorExit("SetCommState");
}
COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(hSerial, &timeouts)) {
ErrorExit("SetCommTimeouts");
}
return hSerial;
}
DWORD readFromSerialPort(HANDLE hSerial, uint8_t * buffer, int buffersize)
{
DWORD dwBytesRead = 0;
if (!ReadFile(hSerial, buffer, buffersize, &dwBytesRead, NULL)) {
ErrorExit("ReadFile");
}
return dwBytesRead;
}
DWORD writeToSerialPort(HANDLE hSerial, const uint8_t * data, int length)
{
DWORD dwBytesRead = 0;
if (!WriteFile(hSerial, data, length, &dwBytesRead, NULL)) {
ErrorExit("WriteFile");
}
return dwBytesRead;
}
void closeSerialPort(HANDLE hSerial)
{
CloseHandle(hSerial);
}
#else // }{
#include <termios.h>
int openSerialPort(const char *portname)
{
struct termios Settings;
int fd;
fd = open(portname, O_RDWR | O_NOCTTY);
if (fd == -1) {
perror(portname);
return -1;
}
tcgetattr(fd, &Settings);
#if defined(__APPLE__) && !defined(B1000000)
#include <IOKit/serial/ioss.h>
#else
cfsetispeed(&Settings, B1000000);
cfsetospeed(&Settings, B1000000);
#endif
cfmakeraw(&Settings);
Settings.c_cc[VMIN] = 1;
if (tcsetattr(fd, TCSANOW, &Settings) != 0) {
perror("Serial settings");
return -1;
}
#if defined(__APPLE__) && !defined(B1000000)
speed_t speed = (speed_t)1000000;
ioctl(fd, IOSSIOSPEED, &speed);
#endif
return fd;
}
int readFromSerialPort(int fd, uint8_t *b, size_t s)
{
ssize_t n, t;
t = 0;
while (t < s) {
n = read(fd, b + t, s);
if (n > 0)
t += n;
}
#ifdef VERBOSE
printf(" READ %d %d: ", (int)s, (int)n);
int i;
for (i = 0; i < s; i++)
printf("%02x ", 0xff & b[i]);
printf("\n");
#endif
return s;
}
void writeToSerialPort(int fd, const uint8_t *b, size_t s)
{
write(fd, b, s);
#ifdef VERBOSE
printf("WRITE %u: ", (int)s);
int i;
for (i = 0; i < s; i++)
printf("%02x ", 0xff & b[i]);
printf("\n");
#endif
}
void closeSerialPort(HANDLE hSerial)
{
close((int)hSerial);
}
#endif // }
// ****************************** CCITT CRC *********************************
static const uint16_t crc_table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
static void crc_update(I2CDriver *sd, const uint8_t *data, size_t data_len)
{
unsigned int tbl_idx;
uint16_t crc = sd->e_ccitt_crc;
while (data_len--) {
tbl_idx = ((crc >> 8) ^ *data) & 0xff;
crc = (crc_table[tbl_idx] ^ (crc << 8)) & 0xffff;
data++;
}
sd->e_ccitt_crc = crc;
}
// ****************************** I2CDriver *********************************
void i2c_connect(I2CDriver *sd, const char* portname)
{
int i;
sd->connected = 0;
sd->port = openSerialPort(portname);
#if !defined(WIN32)
if (sd->port == -1)
return;
#endif
writeToSerialPort(sd->port,
(uint8_t*)"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", 64);
const uint8_t tests[] = "A\r\n\0xff";
for (i = 0; i < 4; i++) {
uint8_t tx[2] = {'e', tests[i]};
writeToSerialPort(sd->port, tx, 2);
uint8_t rx[1];
int n = readFromSerialPort(sd->port, rx, 1);
if ((n != 1) || (rx[0] != tests[i]))
return;
}
sd->connected = 1;
i2c_getstatus(sd);
sd->e_ccitt_crc = sd->ccitt_crc;
}
void i2c_disconnect(I2CDriver *sd)
{
if (sd->connected) {
closeSerialPort(sd->port);
sd->port = -1;
sd->connected = 0;
}
}
static void charCommand(I2CDriver *sd, char c)
{
writeToSerialPort(sd->port, (uint8_t*)&c, 1);
}
static int i2c_ack(I2CDriver *sd)
{
uint8_t a[1];
if (readFromSerialPort(sd->port, a, 1) != 1)
return 0;
return (a[0] & 1) != 0;
}
void i2c_getstatus(I2CDriver *sd)
{
uint8_t readbuffer[100];
int bytesRead;
uint8_t mode[80];
charCommand(sd, '?');
bytesRead = readFromSerialPort(sd->port, readbuffer, 80);
readbuffer[bytesRead] = 0;
// printf("%d Bytes were read: %.*s\n", bytesRead, bytesRead, readbuffer);
sscanf((char*)readbuffer, "[%15s %8s %" SCNu64 " %f %f %f %c %d %d %d %d %x ]",
sd->model,
sd->serial,
&sd->uptime,
&sd->voltage_v,
&sd->current_ma,
&sd->temp_celsius,
mode,
&sd->sda,
&sd->scl,
&sd->speed,
&sd->pullups,
&sd->ccitt_crc
);
sd->mode = mode[0];
}
bool i2c_setspeed(I2CDriver *sd, unsigned int speed_khz)
{
uint8_t ch;
if (speed_khz == sd->speed) {
return true;
}
switch (speed_khz) {
case 100:
ch = '1';
break;
case 400:
ch = '4';
default:
return false;
}
writeToSerialPort(sd->port, &ch, 1);
i2c_getstatus(sd);
return (bool)(sd->speed == speed_khz);
}
void i2c_scan(I2CDriver *sd, uint8_t devices[128])
{
charCommand(sd, 'd');
(void)readFromSerialPort(sd->port, devices + 8, 112);
}
uint8_t i2c_reset(I2CDriver *sd)
{
charCommand(sd, 'x');
uint8_t a[1];
if (readFromSerialPort(sd->port, a, 1) != 1)
return 0;
return a[0];
}
int i2c_start(I2CDriver *sd, uint8_t dev, uint8_t op)
{
uint8_t start[2] = {'s', (uint8_t)((dev << 1) | op)};
writeToSerialPort(sd->port, start, sizeof(start));
return i2c_ack(sd);
}
void i2c_stop(I2CDriver *sd)
{
charCommand(sd, 'p');
}
int i2c_write(I2CDriver *sd, const uint8_t bytes[], size_t nn)
{
size_t i;
int ack = 1;
for (i = 0; i < nn; i += 64) {
size_t len = ((nn - i) < 64) ? (nn - i) : 64;
uint8_t cmd[65] = {(uint8_t)(0xc0 + len - 1)};
memcpy(cmd + 1, bytes + i, len);
writeToSerialPort(sd->port, cmd, 1 + len);
ack = i2c_ack(sd);
}
crc_update(sd, bytes, nn);
return ack;
}
void i2c_read(I2CDriver *sd, uint8_t bytes[], size_t nn)
{
size_t i;
for (i = 0; i < nn; i += 64) {
size_t len = ((nn - i) < 64) ? (nn - i) : 64;
uint8_t cmd[1] = {(uint8_t)(0x80 + len - 1)};
writeToSerialPort(sd->port, cmd, 1);
readFromSerialPort(sd->port, bytes + i, len);
crc_update(sd, bytes + i, len);
}
}
void i2c_monitor(I2CDriver *sd, int enable)
{
charCommand(sd, enable ? 'm' : '@');
}
void i2c_capture(I2CDriver *sd)
{
printf("Capture started\n");
charCommand(sd, 'c');
uint8_t bytes[1];
int starting = 0;
int nbits = 0, bits = 0;
while (1) {
int i;
readFromSerialPort(sd->port, bytes, 1);
for (i = 0; i < 2; i++) {
int symbol = (i == 0) ? (bytes[0] >> 4) : (bytes[0] & 0xf);
switch (symbol) {
case 0:
break;
case 1:
starting = 1;
break;
case 2:
printf("STOP\n");
starting = 1;
break;
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
bits = (bits << 3) | (symbol & 7);
nbits += 3;
if (nbits == 9) {
int b8 = (bits >> 1), ack = !(bits & 1);
if (starting) {
starting = 0;
printf("START %02x %s", b8 >> 1, (b8 & 1) ? "READ" : "WRITE");
} else {
printf("BYTE %02x", b8);
}
printf(" %s\n", ack ? "ACK" : "NAK");
nbits = 0;
bits = 0;
}
}
}
}
}
int i2c_commands(I2CDriver *sd, int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++) {
char *token = argv[i];
// printf("token [%s]\n", token);
if (strlen(token) != 1)
goto badcommand;
switch (token[0]) {
case 'i':
i2c_getstatus(sd);
printf("uptime %" SCNu64" %.3f V %.0f mA %.1f C SDA=%d SCL=%d speed=%d kHz\n",
sd->uptime,
sd->voltage_v,
sd->current_ma,
sd->temp_celsius,
sd->sda,
sd->scl,
sd->speed
);
break;
case 'x':
{
uint8_t sda_scl = i2c_reset(sd);
printf("Bus reset. SDA = %d, SCL = %d\n",
1 & (sda_scl >> 1),
1 & sda_scl);
}
break;
case 'd':
{
uint8_t devices[128];
int i;
i2c_scan(sd, devices);
printf("\n");
for (i = 8; i < 0x78; i++) {
if (devices[i] == '1')
printf("%02x ", i);
else
printf("-- ");
if ((i % 8) == 7)
printf("\n");
}
printf("\n");
}
break;
case 'w':
{
token = argv[++i];
unsigned int dev = strtol(token, NULL, 0);
token = argv[++i];
uint8_t bytes[8192];
char *endptr = token;
size_t nn = 0;
while (nn < sizeof(bytes)) {
bytes[nn++] = strtol(endptr, &endptr, 0);
if (*endptr == '\0')
break;
if (*endptr != ',') {
fprintf(stderr, "Invalid bytes '%s'\n", token);
return 1;
}
endptr++;
}
i2c_start(sd, dev, 0);
i2c_write(sd, bytes, nn);
}
break;
case 'r':
{
token = argv[++i];
unsigned int dev = strtol(token, NULL, 0);
token = argv[++i];
size_t nn = strtol(token, NULL, 0);
uint8_t bytes[8192];
i2c_start(sd, dev, 1);
i2c_read(sd, bytes, nn);
i2c_stop(sd);
size_t i;
for (i = 0; i < nn; i++)
printf("%s0x%02x", i ? "," : "", 0xff & bytes[i]);
printf("\n");
}
break;
case 'p':
i2c_stop(sd);
break;
case 'm':
{
char line[100];
i2c_monitor(sd, 1);
printf("[Hit return to exit monitor mode]\n");
fgets(line, sizeof(line) - 1, stdin);
i2c_monitor(sd, 0);
}
break;
case 'c':
{
i2c_capture(sd);
}
break;
default:
badcommand:
fprintf(stderr, "Bad command '%s'\n", token);
fprintf(stderr, "\n");
fprintf(stderr, "Commands are:");
fprintf(stderr, "\n");
fprintf(stderr, " i display status information (uptime, voltage, current, temperature)\n");
fprintf(stderr, " x I2C bus reset\n");
fprintf(stderr, " d device scan\n");
fprintf(stderr, " w dev <bytes> write bytes to I2C device dev\n");
fprintf(stderr, " p send a STOP\n");
fprintf(stderr, " r dev N read N bytes from I2C device dev, then STOP\n");
fprintf(stderr, " m enter I2C bus monitor mode\n");
fprintf(stderr, " c enter I2C bus capture mode\n");
fprintf(stderr, "\n");
return 1;
}
}
return 0;
}
================================================
FILE: c/common/i2cdriver.h
================================================
#ifndef I2CDRIVER_H
#define I2CDRIVER_H
#include <stdint.h>
#include <stdbool.h>
#if defined(WIN32)
#include <windows.h>
#else
#define HANDLE int
#endif
typedef struct {
int connected; // Set to 1 when connected
HANDLE port;
char model[16],
serial[9]; // Serial number of USB device
uint64_t uptime; // time since boot (seconds)
float voltage_v, // USB voltage (Volts)
current_ma, // device current (mA)
temp_celsius; // temperature (C)
unsigned int mode; // I2C 'I' or bitbang 'B' mode
unsigned int sda; // SDA state, 0 or 1
unsigned int scl; // SCL state, 0 or 1
unsigned int speed; // I2C line speed (in kHz)
unsigned int pullups; // pullup state (6 bits, 1=enabled)
unsigned int
ccitt_crc, // Hardware CCITT CRC
e_ccitt_crc; // Host CCITT CRC, should match
} I2CDriver;
void i2c_connect(I2CDriver *sd, const char* portname);
void i2c_disconnect(I2CDriver *sd);
void i2c_getstatus(I2CDriver *sd);
int i2c_write(I2CDriver *sd, const uint8_t bytes[], size_t nn);
void i2c_read(I2CDriver *sd, uint8_t bytes[], size_t nn);
int i2c_start(I2CDriver *sd, uint8_t dev, uint8_t op);
void i2c_stop(I2CDriver *sd);
bool i2c_setspeed(I2CDriver *sd, unsigned int kbaud);
void i2c_monitor(I2CDriver *sd, int enable);
void i2c_capture(I2CDriver *sd);
int i2c_commands(I2CDriver *sd, int argc, char *argv[]);
#endif
================================================
FILE: c/go
================================================
set -e
rm -rf build/*
make -f linux/Makefile
# build/i2ccl /dev/ttyUSB0 i d
# build/i2ccl /dev/ttyUSB0 w 0x48 3 r 0x48 2
make -f win32/Makefile
# cp build/spicl.exe /data/win10/
#
# rm -f win32gui/obj/* win32gui/bin/Win32App.exe
# make -C win32gui/ CHARSET=ANSI
# cp win32gui/bin/Win32App.exe /data/win10/spigui.exe
#
# ./mk-nsis /data/win10/nsis
================================================
FILE: c/linux/Makefile
================================================
CFLAGS += -I common -Wall -Wpointer-sign # -Werror
all: build/i2ccl
install: all
cp build/i2ccl /usr/local/bin
build/i2ccl: linux/i2c.c common/i2cdriver.c
mkdir -p build/
$(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $^
================================================
FILE: c/linux/Makefile.clang
================================================
CC=clang
CFLAGS += -I common -Wall -Wpointer-sign -xc++ -std=c++17 # -Werror
all: build/i2ccl
install: all
cp build/i2ccl /usr/local/bin
build/i2ccl: linux/i2c.c common/i2cdriver.c
mkdir -p build/
$(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $^
================================================
FILE: c/linux/i2c.c
================================================
#include <stdio.h>
#include <stdlib.h>
#include "i2cdriver.h"
int main(int argc, char *argv[])
{
I2CDriver i2c;
if (argc < 2) {
printf("Usage: i2ccl <PORTNAME> <commands>\n");
exit(1);
} else {
i2c_connect(&i2c, argv[1]);
if (!i2c.connected)
exit(1);
return i2c_commands(&i2c, argc - 2, argv + 2);
}
}
================================================
FILE: c/win32/Makefile
================================================
CC = /usr/bin/i686-w64-mingw32-g++
CFLAGS += -I common -static-libgcc -static-libstdc++
all: build/i2ccl.exe
build/i2ccl.exe: win32/i2c.c common/i2cdriver.c
mkdir -p build/
$(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $^
================================================
FILE: c/win32/i2c.c
================================================
#include <stdio.h>
#include <stdlib.h>
#include "i2cdriver.h"
int main(int argc, char *argv[])
{
I2CDriver sd;
if (argc < 2) {
printf("Usage: i2ccl <PORTNAME> <commands>\n");
exit(1);
} else {
i2c_connect(&sd, argv[1]);
if (!sd.connected)
exit(1);
return i2c_commands(&sd, argc - 2, argv + 2);
}
}
================================================
FILE: firmware/README.md
================================================
This is the firmware for the I2CDriver.
It uses the [MyForth](http://www.kiblerelectronics.com/myf/myf.shtml) compiler written by
Charley Shattuck and Bob Nash.
To compile the fonts go into ``assets``
and run ``mkfont.py``. This builds the font sources in ``fonts.fs``
================================================
FILE: firmware/assets/go
================================================
set -e
python2 mkfont.py
================================================
FILE: firmware/assets/mkfont.py
================================================
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import struct
import random
def rand(n):
return random.randrange(n)
def as565(im):
""" Return RGB565 of im """
(r,g,b) = [np.array(c).astype(np.uint16) for c in im.split()]
def s(x, n):
return x * (2 ** n - 1) / 255
return (s(b, 5) << 11) | (s(g, 6) << 5) | s(r, 5)
def c3(rgb):
return (16 * (0xf & (rgb >> 8)),
16 * (0xf & (rgb >> 4)),
16 * (0xf & (rgb >> 0)))
font2 = ImageFont.truetype("IBMPlexSans-SemiBold.otf", 13)
fontSP = ImageFont.truetype("pf_ronda_seven_bold.ttf", 8)
def pad2(s):
if len(s) % 2:
s.append(s[0])
return s
def rfont2(c):
im = Image.new("L", (128, 160))
dr = ImageDraw.Draw(im)
dr.text((10,40), c, font=font2, fill=255)
# im.save("out.png")
extents = im.getbbox()
assert 10 <= extents[0]
assert 45 <= extents[1]
if c in "0123456789":
extents = (0, 0, 10 + 8, 45 + 9)
im = im.crop((10, 45) + extents[2:])
(w,h) = im.size
nyb = pad2((np.array(im).astype(int).flatten() * 15 / 255).tolist())
return [w,h] + nyb
def rf(c, font):
im = Image.new("L", (128, 160))
dr = ImageDraw.Draw(im)
dr.text((10,40), c, font=font, fill=255)
# im.save("out.png")
extents = im.getbbox()
im = im.crop(extents)
(w,h) = im.size
nyb = (np.array(im).astype(int).flatten() * 15 / 255).tolist()
return [w,h] + nyb
fs = open("../font.fs", "wt")
fb = 0
if __name__ == '__main__':
fs.write('here constant tplan\n')
fs.write('%d , %d , $%x%x , $%x , ," %s"\n' % (60, 0, 0xf, 0xf, 0xf, "V"))
fb += 5 + len("V")
# fs.write("[ %d ]\n" % fb)
fs.write('%d , %d , $%x%x , $%x , ," %s"\n' % (108, 0, 0xf, 0xf, 0xf, "mA"))
fb += 5 + len("mA")
# fs.write("[ %d ]\n" % fb)
fs.write('0 ,\n')
fb += 1
# im.save("out.png")
uniq = "".join(sorted(set("0123456789.mAVDMCS")))
f2 = sum([rfont2(c) for c in uniq], [])
print "font2 %s takes %d bytes" % (uniq, len(f2) / 2)
def nybbles(nn):
s = len(nn)
assert s % 2 == 0
b = ["$%x%x ," % tuple(nn[i:i+2]) for i in range(0, s, 2)]
return b
fs.write('here constant font\n')
for c in uniq:
bb = nybbles(rfont2(c))
print >>fs, "'%s' , " % c, " ".join(bb)
fb += 1 + len(bb)
# See http://angband.pl/font/tinyfont.html
fs.write("\nhere constant micro\n")
if 1:
tiny = Image.open("hex4x5.png").convert("L")
for i in range(16):
x = 5 * i
im = tiny.crop((x, 0, x + 4, 5))
rim = im.transpose(Image.ROTATE_90)
ch = ((np.array(rim)).flatten() * 15.99 / 255).astype(np.uint8).tolist()
fs.write(" ".join(nybbles(ch)) + "\n")
fb += len(ch) / 2
if 1:
# Image.open("arrow.png").transpose(Image.FLIP_LEFT_RIGHT).save("larrow.png")
for n in ("symbol-s", "symbol-p", "symbol-b", "arrow", "larrow", "dot", "label-sda", "label-scl"):
im = Image.open(n + ".png").convert("L")
if n.startswith("label-"):
im = im.point([0] + 254 * [64] + [255])
rim = im.transpose(Image.ROTATE_90)
(w,h) = rim.size
ch = [w,h] + pad2(((np.array(rim)).flatten() * 15.99 / 255).astype(np.uint8).tolist())
fs.write("here constant %s \n" % n)
fs.write(" ".join(nybbles(ch)) + "\n")
fb += len(ch) / 2
if 1:
w = 72
gpng = "plasma.png"
grad = Image.open(gpng).convert("RGB").resize((w, 1), Image.BILINEAR).load()
fs.write("\nHERE constant grad\n")
for x in range(w):
(r,g,b) = grad[x,0]
r = (r * 15) // 255
g = (g * 15) // 255
b = (b * 15) // 255
fs.write('$%x%x , $%x ,\n' % (r, g, b))
fb += 2 * w
fs.close()
fs = open("../fontsize.fs", "wt")
fs.write("&%d constant FONTDATA_SIZE\n" % fb)
fs.close()
================================================
FILE: firmware/capture.fs
================================================
here constant CAPTURE-START
[
: fake ( a - u )
dup 0= ] here [ and or ;
]
:m :: ( - )
[ >in @ label >in !
create ] here [ , hide
does> @ ] m;
\ jump if bit is 0 or 1 ( addr bit )
:m j1 ( addr bit ) [ swap fake swap ] 0=until. m;
:m j0 ( addr bit ) [ swap fake swap ] until. m;
:m j ( addr ) fake again m;
:m tx SBUF0 (#!) clra TMR3H (#!) m;
:m SDA0 ( a ) SDA j0 m;
:m SDA1 ( a ) SDA j1 m;
fwd L00.0
fwd L00.1
fwd L00.2
fwd H00.0
fwd H00.1
fwd H00.2
fwd HS
fwd HP
fwd LP
fwd LS
:m escape RI0 if. RI0 clr ; then m;
:: L11 begin LS SDA0 SCL 0=until.
:: Lidle begin begin SDA until. SCL until.
L11 j
:: L10.0 3 .t set
begin L00.0 SDA0 SCL until. begin LS SDA0 SCL 0=until. 2 .t set
:: L10.1 begin L00.1 SDA0 SCL until. begin LS SDA0 SCL 0=until. 1 .t set
:: L10.2 begin L00.2 SDA0 SCL until. begin LS SDA0 SCL 0=until. 0 .t set
tx
:: H10.0 7 .t set
:: klak begin H00.0 SDA0 SCL until. begin HS SDA0 SCL 0=until. 6 .t set
:: H10.1 begin H00.1 SDA0 SCL until. begin HS SDA0 SCL 0=until. 5 .t set
:: H10.2 begin H00.2 SDA0 SCL until. begin HS SDA0 SCL 0=until. 4 .t set
L10.0 j
:: LS $f0 # and $01 # ior tx ( start )
:: LS2 begin HP SDA1 SCL 0=until.
H00.0 j
:: HS $10 (#) ( start )
:: HS2 begin LP SDA1 SCL 0=until.
:: L00.0 3 .t set
begin L10.0 SDA1 SCL until. begin LP SDA1 SCL 0=until.
:: L00.1 begin L10.1 SDA1 SCL until. begin LP SDA1 SCL 0=until.
:: L00.2 begin L10.2 SDA1 SCL until. begin LP SDA1 SCL 0=until.
tx
:: H00.0 7 .t set
begin H10.0 SDA1 SCL until. begin HP SDA1 SCL 0=until.
:: H00.1 begin H10.1 SDA1 SCL until. begin HP SDA1 SCL 0=until.
:: H00.2 begin H10.2 SDA1 SCL until. begin HP SDA1 SCL 0=until.
L00.0 j
:: HP $20 (#)
\ L11 j
begin SDA 0=until.
escape
HS2 j
: (warm)
:: H11 begin HS SDA0 SCL 0=until.
:: Hidle begin begin SDA until. SCL until.
H11 j
:: LP $f0 # and $02 # ior tx
\ H11 j
begin SDA 0=until.
escape
LS2 j
: /timer3
$80 # EIE1 ior! \ Timer 3 interrupt enable
;
: timer3\
$80 ~# EIE1 and! \ Timer 3 interrupt disable
;
:m timer3
SBUF0 (#!) clra
$7f # TMR3CN and!
RI0 if.
RI0 clr
[ sp dec ]
[ sp dec ]
then
[ reti ] m;
: capture
[ IE push ]
[ ET2 clr ] \ Timer 2 interrupt disable
[ ES0 clr ] \ UART interrupt disable
\i2chw
[ clra ]
[ FL1 set ] t3+
(warm)
t3- [ FL1 clr ]
/i2chw
[ IE pop ]
;
\ This code all runs in register bank 1:
\ 0 scratch for heatmap
\ 1 log
\ 2
\ 3 prev cmd
\ 4 constant 72, for heatmap
\ 5
\ 6
\ 7 caller acc save
\
\ FL0 set means this is an address byte
fwd M00.0
fwd M10.0
fwd M10.1
fwd M10.2
fwd M10.3
fwd M10.4
fwd M10.5
fwd M10.6
fwd M10.7
fwd M10.8
fwd Mt
fwd MP
:m (l!) $f3 , m;
:m (log!)
$f3 , a+ m;
:m wrap
$7f # 9 and! m;
:m heat
\ byte is in t
FL0 if.
setc 2/'
0 (#!)
4 (#@) $f2 ,
then
m;
:m escape
7 (#@)
[
dirty set
PSW pop
reti
]
m;
:: MP
$00 (#) (log!)
$01 (#) (log!)
wrap
escape
begin SDA 0=until.
: (mismatch)
:: Mt
begin MP SDA1 SCL 0=until.
$82 # 3 #! FL0 set
M00.0 j
:: M00.6 begin M10.6 SDA1 SCL until. begin MP SDA1 SCL 0=until.
:: M00.7 begin M10.7 SDA1 SCL until. begin MP SDA1 SCL 0=until. (l!)
:: M00.8 begin M10.8 SDA1 SCL until. begin MP SDA1 SCL 0=until. heat
a+ 3 (#@) (l!) a+ wrap
$83 # 3 #! FL0 clr
M00.0 j
:: M10.6 begin M00.6 SDA0 SCL until. begin Mt SDA0 SCL 0=until. 1 .t set
:: M10.7 begin M00.7 SDA0 SCL until. begin Mt SDA0 SCL 0=until. 1+ (l!)
:: M10.8 begin M00.8 SDA0 SCL until. begin Mt SDA0 SCL 0=until.
a+ 3 (#@) $7f # and (l!) a+ wrap
$83 # 3 #! FL0 clr
M10.0 j
:: MP3 MP j
:: Mt3 Mt j
:: M00.3 begin M10.3 SDA1 SCL until. begin MP3 SDA1 SCL 0=until.
:: M00.4 begin M10.4 SDA1 SCL until. begin MP3 SDA1 SCL 0=until.
:: M00.5 begin M10.5 SDA1 SCL until. begin MP3 SDA1 SCL 0=until.
M00.6 j
:: M10.3 begin M00.3 SDA0 SCL until. begin Mt3 SDA0 SCL 0=until. 4 .t set
:: M10.4 begin M00.4 SDA0 SCL until. begin Mt3 SDA0 SCL 0=until. 3 .t set
:: M10.5 begin M00.5 SDA0 SCL until. begin Mt3 SDA0 SCL 0=until. 2 .t set
M10.6 j
:: MP0 MP j
:: Mt0 Mt j
: (warm)
:: M00.0 clra
begin M10.0 SDA1 SCL until. begin MP0 SDA1 SCL 0=until.
:: M00.1 begin M10.1 SDA1 SCL until. begin MP0 SDA1 SCL 0=until.
:: M00.2 begin M10.2 SDA1 SCL until. begin MP0 SDA1 SCL 0=until.
M00.3 j
:: M10.0 clra
begin M00.0 SDA0 SCL until. begin Mt0 SDA0 SCL 0=until. 7 .t set
:: M10.1 begin M00.1 SDA0 SCL until. begin Mt0 SDA0 SCL 0=until. 6 .t set
:: M10.2 begin M00.2 SDA0 SCL until. begin Mt0 SDA0 SCL 0=until. 5 .t set
M10.3 j
: /monitor
[ ET2 clr ] \ Timer 2 interrupt disable
[ ES0 clr ] \ UART interrupt disable
\i2chw
t3i- t3+ \ Timer3 running, no intr
%00000100 # P0MASK #!
%00000100 # P0MAT #! \ SDA high
%00010000 # P1MASK #!
%00010000 # P1MAT #! \ SCL high
\ constants in registers
72 # [ 4 8 + ] #!
$02 # EIE1 ior! \ EMAT
;
: \monitor
$02 ~# EIE1 and! \ EMAT off
[ ET2 set ] \ Timer 2 interrupt enable
[ ES0 set ] \ UART interrupt enable
t3i+ t3- \ Timer3 stopped, intr
/i2chw
;
:m mismatch
[
PSW push
RS0 set
]
7 (#!)
Mt j
m;
here [
CAPTURE-START xor 11 rshift 0<>
[IF]
cr .( Capture block cannot cross a 2K boundary)
abort
[THEN]
]
================================================
FILE: firmware/font.fs
================================================
here constant tplan
60 , 0 , $ff , $f , ," V"
108 , 0 , $ff , $f , ," mA"
0 ,
here constant font
'.' , $49 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $03 , $20 , $2f , $e0 , $0c , $b0 ,
'0' , $89 , $01 , $9d , $d8 , $00 , $0c , $fc , $df , $90 , $4f , $b0 , $0d , $e1 , $7f , $70 , $0b , $f4 , $9f , $70 , $0a , $f5 , $7f , $70 , $0b , $f4 , $4f , $a0 , $0d , $e1 , $0c , $fb , $cf , $90 , $01 , $ad , $d8 , $00 ,
'1' , $89 , $00 , $af , $f7 , $00 , $09 , $fd , $f7 , $00 , $6f , $a7 , $f7 , $00 , $07 , $07 , $f7 , $00 , $00 , $07 , $f7 , $00 , $00 , $07 , $f7 , $00 , $00 , $07 , $f7 , $00 , $09 , $9c , $fc , $95 , $0e , $ff , $ff , $f8 ,
'2' , $89 , $02 , $ae , $d8 , $00 , $1d , $fc , $ef , $90 , $3b , $70 , $3f , $e0 , $00 , $00 , $4f , $c0 , $00 , $02 , $de , $40 , $00 , $4d , $e4 , $00 , $06 , $ed , $30 , $00 , $4f , $fb , $aa , $a2 , $5f , $ff , $ff , $f3 ,
'3' , $89 , $04 , $ce , $d7 , $00 , $3e , $eb , $df , $80 , $05 , $10 , $5f , $b0 , $00 , $6b , $dd , $30 , $00 , $9f , $fc , $20 , $00 , $00 , $6f , $c0 , $2a , $10 , $2f , $e0 , $8f , $eb , $df , $80 , $07 , $ce , $c7 , $00 ,
'4' , $89 , $00 , $05 , $ff , $40 , $00 , $1d , $ff , $40 , $00 , $8e , $cf , $40 , $03 , $e8 , $9f , $40 , $0c , $d0 , $9f , $40 , $6f , $50 , $9f , $40 , $bf , $ff , $ff , $f7 , $69 , $99 , $cf , $a4 , $00 , $00 , $9f , $40 ,
'5' , $89 , $0c , $ff , $ff , $c0 , $0d , $eb , $bb , $90 , $0e , $a0 , $00 , $00 , $0f , $aa , $eb , $20 , $1f , $fb , $df , $d0 , $02 , $20 , $0d , $f3 , $07 , $40 , $0d , $f2 , $2e , $eb , $df , $b0 , $03 , $be , $d8 , $10 ,
'6' , $89 , $00 , $1a , $fc , $10 , $00 , $cf , $90 , $00 , $09 , $f8 , $00 , $00 , $1e , $da , $eb , $30 , $5f , $fb , $bf , $d0 , $7f , $a0 , $0c , $f4 , $5f , $a0 , $0c , $f3 , $0c , $eb , $bf , $b0 , $01 , $ad , $d9 , $10 ,
'7' , $89 , $5f , $ff , $ff , $f2 , $5f , $ba , $ae , $f2 , $5f , $50 , $3f , $c0 , $14 , $10 , $9f , $50 , $00 , $01 , $ee , $00 , $00 , $07 , $f8 , $00 , $00 , $0d , $e2 , $00 , $00 , $5f , $a0 , $00 , $00 , $bf , $40 , $00 ,
'8' , $89 , $03 , $be , $d9 , $10 , $1e , $ea , $bf , $c0 , $2f , $a0 , $0d , $e0 , $09 , $e9 , $ae , $60 , $06 , $ef , $fd , $40 , $5f , $b1 , $2d , $e2 , $7f , $80 , $0c , $f4 , $2e , $ea , $bf , $d0 , $03 , $be , $da , $20 ,
'9' , $89 , $02 , $ae , $d8 , $00 , $1d , $eb , $cf , $90 , $6f , $90 , $0d , $f1 , $7f , $80 , $0d , $f3 , $3e , $ea , $bf , $f2 , $05 , $ce , $af , $d0 , $00 , $00 , $af , $50 , $00 , $1b , $f9 , $00 , $02 , $df , $80 , $00 ,
'A' , $99 , $00 , $0e , $fa , $00 , $00 , $04 , $ff , $e1 , $00 , $00 , $9f , $9f , $50 , $00 , $0e , $c2 , $fb , $00 , $05 , $f7 , $0c , $e1 , $00 , $af , $ff , $ff , $60 , $1e , $eb , $bb , $fb , $06 , $f8 , $00 , $0d , $f1 , $bf , $40 , $00 , $8f , $70 ,
'C' , $99 , $00 , $5b , $ec , $70 , $00 , $6f , $ec , $ef , $80 , $1e , $e2 , $01 , $c7 , $04 , $fa , $00 , $00 , $00 , $6f , $90 , $00 , $00 , $04 , $fa , $00 , $00 , $00 , $1e , $e1 , $01 , $d8 , $00 , $7f , $ec , $ef , $80 , $00 , $6c , $ec , $60 , $00 ,
'D' , $99 , $1f , $ff , $eb , $50 , $01 , $fe , $cc , $ef , $60 , $1f , $d0 , $02 , $ee , $01 , $fd , $00 , $0b , $f3 , $1f , $d0 , $00 , $af , $51 , $fd , $00 , $0b , $f3 , $1f , $d0 , $01 , $ee , $11 , $fe , $bc , $ef , $60 , $1f , $ff , $eb , $50 , $01 ,
'M' , $a9 , $1f , $f5 , $00 , $0a , $fa , $1f , $fc , $00 , $3f , $fa , $1f , $ff , $60 , $bf , $fa , $1f , $dd , $d5 , $fb , $fa , $1f , $c6 , $fe , $e4 , $fa , $1f , $c0 , $cf , $63 , $fa , $1f , $c0 , $4d , $03 , $fa , $1f , $c0 , $02 , $03 , $fa , $1f , $c0 , $00 , $03 , $fa ,
'S' , $89 , $02 , $ad , $da , $20 , $0d , $fd , $df , $e1 , $4f , $b0 , $04 , $30 , $2e , $e8 , $51 , $00 , $05 , $df , $ff , $80 , $00 , $02 , $5d , $f4 , $08 , $30 , $0a , $f5 , $5f , $fd , $df , $d1 , $04 , $be , $da , $20 ,
'V' , $99 , $cf , $30 , $00 , $de , $17 , $f8 , $00 , $3f , $b0 , $2f , $d0 , $08 , $f6 , $00 , $cf , $20 , $de , $10 , $06 , $f7 , $2f , $b0 , $00 , $1f , $b6 , $f6 , $00 , $00 , $be , $ce , $10 , $00 , $06 , $ff , $a0 , $00 , $00 , $1e , $f5 , $00 , $0c ,
'm' , $b9 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $00 , $2f , $ba , $ea , $1a , $ea , $12 , $ff , $bd , $fe , $bd , $f8 , $2f , $c0 , $3f , $c0 , $3f , $b2 , $fb , $02 , $fb , $02 , $fc , $2f , $b0 , $2f , $b0 , $2f , $c2 , $fb , $02 , $fb , $02 , $fc , $2f , $b0 , $2f , $b0 , $2f , $c0 ,
here constant micro
$4f , $ff , $4f , $00 , $0f , $f0 , $00 , $f4 , $ff , $f4 ,
$00 , $00 , $0f , $ff , $ff , $f0 , $00 , $00 , $00 , $00 ,
$4f , $40 , $ff , $0f , $0f , $f0 , $f0 , $ff , $04 , $ff ,
$4f , $4f , $4f , $0f , $0f , $f0 , $f0 , $ff , $04 , $0f ,
$ff , $ff , $f0 , $0f , $00 , $00 , $f0 , $0f , $ff , $00 ,
$f0 , $4f , $4f , $0f , $0f , $f0 , $f0 , $ff , $ff , $0f ,
$40 , $4f , $4f , $0f , $0f , $f0 , $f0 , $f4 , $ff , $f4 ,
$ff , $00 , $0f , $0f , $00 , $f0 , $0f , $ff , $00 , $00 ,
$4f , $4f , $4f , $0f , $0f , $f0 , $f0 , $f4 , $f4 , $f4 ,
$4f , $ff , $4f , $0f , $0f , $f0 , $f0 , $f4 , $f4 , $04 ,
$4f , $ff , $ff , $0f , $00 , $f0 , $f0 , $04 , $ff , $ff ,
$4f , $4f , $4f , $0f , $0f , $f0 , $f0 , $ff , $ff , $ff ,
$4f , $0f , $4f , $00 , $0f , $f0 , $00 , $f4 , $ff , $f4 ,
$4f , $ff , $4f , $00 , $0f , $f0 , $00 , $ff , $ff , $ff ,
$00 , $00 , $0f , $0f , $0f , $f0 , $f0 , $ff , $ff , $ff ,
$00 , $00 , $0f , $0f , $00 , $f0 , $f0 , $0f , $ff , $ff ,
here constant symbol-s
$bc , $00 , $17 , $ce , $d8 , $20 , $00 , $2b , $ff , $ff , $fc , $30 , $0a , $ff , $ff , $ff , $fb , $15 , $fd , $0f , $d0 , $0d , $f6 , $af , $00 , $f0 , $00 , $0f , $cc , $f0 , $ff , $0f , $f0 , $fe , $cf , $0f , $f0 , $ff , $0f , $e9 , $f0 , $00 , $0f , $00 , $fb , $4e , $d0 , $0d , $f0 , $df , $60 , $9f , $ff , $ff , $ff , $a1 , $01 , $9f , $ff , $ff , $b2 , $00 , $00 , $5b , $db , $61 , $00 ,
here constant symbol-p
$bc , $00 , $17 , $ce , $d8 , $20 , $00 , $2b , $ff , $ff , $fc , $30 , $0a , $ff , $ff , $ff , $fb , $15 , $fd , $00 , $df , $ff , $f6 , $af , $00 , $00 , $ff , $ff , $cc , $f0 , $ff , $0f , $ff , $fe , $cf , $0f , $f0 , $ff , $ff , $e9 , $f0 , $00 , $00 , $00 , $fb , $4e , $00 , $00 , $00 , $0f , $60 , $9f , $ff , $ff , $ff , $a1 , $01 , $9f , $ff , $ff , $b2 , $00 , $00 , $5b , $db , $61 , $00 ,
here constant symbol-b
$bc , $00 , $17 , $ce , $d8 , $20 , $00 , $2b , $ff , $ff , $fc , $30 , $0a , $ff , $ff , $ff , $fb , $15 , $ff , $ff , $ff , $ff , $f6 , $af , $ff , $ff , $ff , $ff , $cc , $f0 , $00 , $00 , $f0 , $fe , $cf , $00 , $00 , $0f , $0f , $e9 , $ff , $ff , $ff , $ff , $fb , $4e , $ff , $ff , $ff , $ff , $60 , $9f , $ff , $ff , $ff , $a1 , $01 , $9f , $ff , $ff , $b2 , $00 , $00 , $5b , $db , $61 , $00 ,
here constant arrow
$35 , $08 , $03 , $b3 , $8f , $8b , $fb , $ef , $e0 ,
here constant larrow
$35 , $ef , $eb , $fb , $8f , $83 , $b3 , $08 , $0e ,
here constant dot
$44 , $4c , $d5 , $bf , $fd , $bf , $fc , $3b , $b4 ,
here constant label-sda
$810 , $f0 , $00 , $00 , $00 , $f0 , $00 , $00 , $00 , $f0 , $4f , $ff , $f0 , $f0 , $f0 , $f0 , $00 , $f0 , $f0 , $f0 , $00 , $f0 , $4f , $ff , $f0 , $f0 , $00 , $00 , $00 , $f0 , $4f , $ff , $40 , $f0 , $f0 , $00 , $f0 , $f0 , $f0 , $00 , $f0 , $f0 , $ff , $ff , $f0 , $f0 , $00 , $00 , $00 , $f0 , $f0 , $4f , $40 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $4f , $40 , $f0 ,
here constant label-scl
$810 , $f0 , $00 , $00 , $00 , $f0 , $00 , $00 , $00 , $f0 , $00 , $00 , $00 , $f0 , $00 , $00 , $f0 , $f0 , $00 , $00 , $f0 , $f0 , $ff , $ff , $f0 , $f0 , $00 , $00 , $00 , $f0 , $4f , $0f , $40 , $f0 , $f0 , $00 , $f0 , $f0 , $f0 , $00 , $f0 , $f0 , $4f , $ff , $40 , $f0 , $00 , $00 , $00 , $f0 , $f0 , $4f , $40 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $f0 , $4f , $40 , $f0 ,
HERE constant grad
$00 , $7 ,
$10 , $8 ,
$10 , $8 ,
$20 , $8 ,
$20 , $8 ,
$30 , $8 ,
$30 , $9 ,
$30 , $9 ,
$40 , $9 ,
$40 , $9 ,
$40 , $9 ,
$50 , $9 ,
$50 , $9 ,
$50 , $9 ,
$60 , $9 ,
$60 , $9 ,
$60 , $9 ,
$70 , $9 ,
$70 , $9 ,
$70 , $9 ,
$70 , $9 ,
$80 , $9 ,
$80 , $9 ,
$81 , $9 ,
$91 , $9 ,
$91 , $9 ,
$91 , $8 ,
$92 , $8 ,
$a2 , $8 ,
$a2 , $8 ,
$a2 , $8 ,
$a2 , $8 ,
$b3 , $7 ,
$b3 , $7 ,
$b3 , $7 ,
$b3 , $7 ,
$b4 , $7 ,
$c4 , $6 ,
$c4 , $6 ,
$c4 , $6 ,
$c5 , $6 ,
$c5 , $6 ,
$d5 , $5 ,
$d5 , $5 ,
$d6 , $5 ,
$d6 , $5 ,
$d6 , $5 ,
$d6 , $5 ,
$d7 , $4 ,
$e7 , $4 ,
$e7 , $4 ,
$e7 , $4 ,
$e8 , $4 ,
$e8 , $3 ,
$e8 , $3 ,
$e9 , $3 ,
$e9 , $3 ,
$e9 , $3 ,
$e9 , $3 ,
$ea , $2 ,
$ea , $2 ,
$ea , $2 ,
$eb , $2 ,
$eb , $2 ,
$eb , $2 ,
$ec , $2 ,
$ec , $2 ,
$ec , $2 ,
$ed , $2 ,
$ed , $2 ,
$ed , $2 ,
$ee , $2 ,
================================================
FILE: firmware/fontsize.fs
================================================
&1385 constant FONTDATA_SIZE
================================================
FILE: firmware/main.fs
================================================
24500000 constant SYSCLK
0 constant CLOSEUP
\ P0.0 SDA 2K2
\ P0.1 SDA 4K3
\ P0.2 SDA
\ P0.3 SDA 4K7
\ P0.4 RX
\ P0.5 TX
\ P0.6 A.V
\ P0.7 A.C
\ P1.0 RS/DC
\ P1.1 DATA
\ P1.2 CLOCK
\ P1.3 RESET
\ P1.4 SCL
\ P1.5 SCL 2K2
\ P1.6 SCL 4K3
\ P2.0 SCL 4K7
0 [if]
There are 3 threads:
1000Hz tick. Increments the BCD milliscond timer.
Timer 2 interrupt.
UART/SPI service. Runs the transport.
UART and SPI interrupts.
[DPTR, R0]
graphics. renders the main image.
Main thread.
[DPTR, R0-7]
ADC drive. Runs ADC conversions, stores results in adc-.
ADC end of conversion interrupt.
[then]
[ : ," '"' parse dup ] , [
bounds do
i c@ ] , [
loop
;
]
:m t3+ %00000100 # TMR3CN #! m; \ Timer 3 enable
:m t3- %00000000 # TMR3CN #! m; \ Timer 3 enable
:m t3i+ $80 # EIE1 ior! m; \ Timer 3 interrupt enable
:m t3i- $80 ~# EIE1 and! m; \ Timer 3 interrupt disable
$0090 org
: 2dup |over
: over |over ;
: tuck swap over ;
:m p>r [ dpl push dph push ] m;
: r>p [ dph pop dpl pop ] ; \ MUST be followed by ;
: @p |@p ;
: @p+ |@p+ ;
: * |* ;
: um* |um* ;
:m #+! [ dup add ] #! m;
: dnegate
swap invert swap invert
: d1+
swap 1 # + swap 0 # +' ;
: d+ push swap push + pop pop +' ;
:m d2/ clrc 2/' swap 2/' swap m;
: - negate + ;
: twist ( a b c d -- a c b d )
push swap pop ;
:m /uart
REN0 set \ Receive enable
TR1 set
$20 # TMOD #!
$18 # CKCON #! \ Use system clock (T1,T2)
[ SYSCLK 2/ 1000000 / negate ] #
TH1 #! \ speed
ES0 set
m;
[ : array create , does> @ + ; ]
$10 cpuORG
$09 constant log \ logging ring pointer
cpuHERE constant tempr 2 cpuALLOT \ temperature ADC
cpuHERE constant currr 2 cpuALLOT \ current ADC
cpuHERE constant currd 2 cpuALLOT \ decimal
cpuHERE constant slowc 1 cpuALLOT \ slow refresh counter
cpuHERE constant charc 1 cpuALLOT \ character counter
cpuHERE constant convs 1 cpuALLOT \ converter state (2 bit)
cpuHERE constant other 1 cpuALLOT \ context SP save
cpuHERE array clock 6 cpuALLOT
cpuHERE $20 <> throw
cpuHERE constant flags 1 cpuALLOT $00 constant dirty
$01 constant prev.
$02 constant talked.
$03 constant ptalked.
$04 constant fade.
$05 constant risen.
$06 constant modechange.
$07 constant timeout
cpuHERE constant ftemp 1 cpuALLOT $08 constant f.0
$09 constant f.1
$0a constant f.2
$0b constant f.3
$0c constant f.4
$0d constant f.5
$0e constant f.6
$0f constant f.7
cpuHERE constant flags2 1 cpuALLOT $10 constant weighing
cpuHERE constant mode 1 cpuALLOT
cpuHERE constant tempd 2 cpuALLOT \ decimal
cpuHERE constant vbusr 2 cpuALLOT \ voltage ADC
cpuHERE constant vbusd 2 cpuALLOT \ decimal
cpuHERE constant talk0 1 cpuALLOT
cpuHERE constant talk1 1 cpuALLOT
cpuHERE constant talker 1 cpuALLOT
cpuHERE constant ptalker 1 cpuALLOT
cpuHERE constant slashx 1 cpuALLOT
cpuHERE constant story 16 cpuALLOT
cpuHERE constant guard 2 cpuALLOT
[
cpuHERE constant red 1 cpuALLOT
cpuHERE constant grn 1 cpuALLOT
cpuHERE constant blu 1 cpuALLOT
]
3 constant x \ graphics x coordinate
4 constant y \ graphics y coordinate
cpuHERE constant i2cb 64 cpuALLOT
cr .( RAM used ) cpuHERE . .( bytes )
: swapctx [
0 push
1 push
t push
psw push
dph push
dpl push
]
SP (#@)
[ other xch ]
SP (#!)
[
dpl pop
dph pop
psw pop
t pop
1 pop
0 pop
]
;
: 0# dup [ clra ] ;
: key begin TI0 clr RI0 0=while. swapctx repeat RI0 clr SBUF0 #@ ; \ XXX compare with spidriver
: emit SBUF0 (#!) begin swapctx RI0 clr TI0 until. TI0 clr [ charc dec ]
: _drop drop ;
:m drop; _drop ; m;
: umax
clrc $96 , $26 , \ C set if u>t
if' drop; then nip ;
: umin
clrc $96 , $26 , \ C set if u>t
0=if' drop; then nip ;
: depth S #@ invert ;
0 [if]
include debug.fs
[then]
: 1ms
1 #
: ms
slowc (#!)
begin slowc (#@) 0=until drop;
: 5µs
5 #
: µs
1 #for
nop nop nop nop
nop nop nop nop
1 #next
;
\ ---------------------------------------- DECIMAL
5 constant d.l \ decimal accumulator
6 constant d.h
: decimal ( u. -- d. ) \ d is the BCD of u
0 # d.l #!
0 # d.h #!
16 # 7 #for
swap 2*' swap 2*'
d.l #@ [ d.l addc da ] d.l #!
d.h #@ [ d.h addc da ] d.h #!
7 #next
2drop d.l #@ d.h #@ ;
: 10trunc
swap $f0 # and swap ;
: 5trunc
swap
dup $f # and 5 # <if
0#
else
5 #
then
push xor pop + swap ;
: fold ( d. -- ) \ Add d to [4 5 6]
swap
5 #+!
[ 6 addc ] 6 #!
if' [ 7 inc ] then ;
: (uq*) ( a. b. -- q.. )
\ 4 5 6 7
4 #2! \ bl bh
7 #! \ ah
6 (#!) \ al
5 #@ um* \ m16 = 5 * 6
4 #@ 7 #@ um* \ m16 = 4 * 7
5 #@ 7 #@ um* \ hi16
4 #@ 6 #@ um* \ lo16
\ 4 5 6 7
\ LSB MSB
5 #! 4 #! 7 #! 6 #!
fold fold ;
: uq* (uq*) 4 #2@
: 67@ 6 #2@ ;
: h* (uq*) 67@ ;
\ ---------------------------------------- Analog thread
:m /adc
AD0EN set
BURSTEN set
5 # ADC0AC #! \ accumulate 64 samples
0 # ADC0CN1 #! \ common mode buffer disabled
%00011100 # REF0CN #! \ temp sensor on, 1.65 V ref
$40 # ADC0PWR #!
\ $BF # ADC0TK #!
m;
:m 1.65v %11111001 # ADC0CF #! m; \ PGA gain is 1
:m 3.3v %11111000 # ADC0CF #! m; \ PGA gain is 0.5
:m startconv
AD0BUSY set m;
:m 2move [ over 1+ over 1+ mov mov ] m;
\ Exponential Moving Average, alpha is 1/8
: alpha d2/ d2/ d2/ ;
: ema ( addr -- )
(a!) (@+) @
2dup alpha dnegate d+
ADC0L #2@ alpha d+
!- !
;
: converter ( u - u )
weighing if.
weighing clr
$ff (#) ;
then
-if ; then
0 # =if
currr # ema
%10000 # ADC0MX #! \ mux temperature
1.65v startconv 1+ ; then
1 # =if
tempr # ema
%00110 # ADC0MX #! \ mux P0.6
3.3v startconv 1+ ; then
vbusr # ema
: /converter
%00111 # ADC0MX #! \ mux P0.7
startconv [ clra ] ;
[
: converts ( val adc ) $10000 swap */ constant ;
]
\ include cal-b3.fs
\ include cal-DO00N2O5.fs
\ include cal-DO00N1GI.fs
include cal.fs
: conversions
vbusr #2@ voltage ## h*
decimal vbusd #2!
tempr #2@ kel ## h* celsius ## d+
decimal tempd #2!
currr #2@
0current [ 1 max negate ] ## d+ 0=if' 2drop 0 ## then
current ## h*
decimal 5trunc currd #2!
;
\ ---------------------------------------- I2C
2 .p0 constant SDA
4 .p1 constant SCL
[ 256 SYSCLK 100000 3 * / - ] constant I2C_100
[ 256 SYSCLK 400000 3 * / - ] constant I2C_400
:m /i2chw %11011000 # SMB0CF #! m; \ Enable, no slave, use T0, EXTHOLD, SCL timeouts
:m \i2chw %00000000 # SMB0CF #! m;
: /i2c
$04 # CKCON ior! \ T0 use system clock
$02 # TMOD ior! \ T0 in 8-bit auto-reload
/i2chw
$01 # SMB0ADM #! \ EHACK=1
$04 # XBR0 ior!
: 100Khz
I2C_100 # TH0 #!
TR0 set ;
: 400Khz
I2C_400 # TH0 #!
TR0 set ;
:m (>crc) CRC0IN (#!) m;
: hdigit
dup
: (hdigit)
[swap]
: digit
$f # and
-10 # + -if -39 # + then 97 # + emit ;
: dd hdigit digit ;
: >i2c
MASTER 0=if. drop; then
(>crc)
SMB0DAT #!
: i2c
[ SI clr ]
: (i2c)
[ timeout clr ]
: i2c-wait
$01 # EIE1 ior! \ ESMB0
t3+
begin swapctx SI until.
t3-
$01 ~# EIE1 and! \ ESMB0
;
: i2c-start
[ STA set ]
i2c
[ STA clr ] ;
: i2c-stop
[ STO set SI clr ] ;
: i2c>
MASTER 0=if. $ff # ; then
i2c SMB0DAT #@ (>crc) ;
: i2c-leave
SMB0CF #@
7 .t 0=if. drop; then \ already turned off
5 .t if. i2c-stop 10 # µs then
\i2chw
$04 ~# XBR0 and! drop;
: setport ( u ) \ SCL SCL_DIR SDA SDA_DIR
P0MDOUT ftemp mov
2/' f.2 movcb
ftemp P0MDOUT mov
2/' P0.2 movcb
P1MDOUT ftemp mov
2/' f.4 movcb
ftemp P1MDOUT mov
2/' P1.4 movcb ;
: i2c-restore
%1010 # setport drop
/i2chw
$04 # XBR0 ior! ;
: i2c-reset
i2c-leave
[ SDA set SCL clr ]
10 # 2 #for
[ SCL set ] 5µs
[ SCL clr ] 5µs
2 #next
\ a STOP signal (SDA from low to high while CLK is high)
[ SDA clr ] 5µs
[ SCL set ] 2 # µs
[ SDA set ] 2 # µs
i2c-restore
STO clr ;
: bitbang
i2c-leave
begin
key
'@' # =if drop; then
setport
2/' if'
0#
P1.4 movbc 2*'
P0.2 movbc 2*'
emit
then
drop
again
: doconv
startconv
begin AD0INT until. AD0INT clr ;
: measure ( - ) \
doconv
ADC0H #@ emit ;
: startweigh ( u )
weighing set
i2c-leave
[ SCL set SDA set ]
%00000100 ~# P0MDIN and!
%00010000 ~# P1MDIN and!
: pulldir ( u ) [ \ Set pullup/down direction (1=up, 0=down)
2/' P0.0 movcb
2/' P0.1 movcb
2/' P0.3 movcb
2/' P1.5 movcb
2/' P1.6 movcb
2/' P2.0 movcb
] drop;
: weigh
0# [ weighing movbc ] 2*' \ 1=pending, 0=ready
dup emit
0=if
0# µs
3.3v
%0010 # ADC0MX #! measure
%1100 # ADC0MX #! measure
%00000100 # P0MDIN ior!
%00010000 # P1MDIN ior!
dup /converter convs #!
%111111 # pulldir
i2c-restore
then drop;
\ ---------------------------------------- timer service
: timer2
[ psw push t push ]
[
slowc dec
setc
clra 0 clock dup addc da (#!)
clra 1 clock dup addc da (#!)
clra 2 clock dup addc da (#!)
clra 3 clock dup addc da (#!)
clra 4 clock dup addc da (#!)
clra 5 clock dup addc da (#!)
] [ t pop psw pop ] ;
: timer3a
\i2chw
timeout set
SI set
/i2chw
[ reti ]
\ ---------------------------------------- CRC16
:m /crc
%1100 # CRC0CN0 #!
m;
:m crc16
CRC0DAT #@
CRC0DAT #@ m;
\ ---------------------------------------- pullups
\ P0.0 SDA 2K2
\ P0.1 SDA 4K3
\ P0.2 SDA
\ P0.3 SDA 4K7
\ P1.4 SCL
\ P1.5 SCL 2K2
\ P1.6 SCL 4K3
\ P2.0 SCL 4K7
: SDA_2k2 %00000001 # P0MDOUT ior! ;
: SDA_4k3 %00000010 # P0MDOUT ior! ;
: SDA_4k7 %00001000 # P0MDOUT ior! ;
: SCL_2k2 %00100000 # P1MDOUT ior! ;
: SCL_4k3 %01000000 # P1MDOUT ior! ;
: SCL_4k7 %00000001 # P2MDOUT ior! ;
\ 5 4 3 2 1 0
\ SCL_4k7 SCL_4k3 SCL_2k2 SDA_4k7 SDA_4k3 SDA_2k2
: pull@ ( - u )
0# [
P2MDOUT ftemp mov
f.0 movbc 2*'
P1MDOUT ftemp mov
f.6 movbc 2*'
f.5 movbc 2*'
P0MDOUT ftemp mov
f.3 movbc 2*'
f.1 movbc 2*'
f.0 movbc 2*' ] ;
: pull! ( u ) [
P0MDOUT ftemp mov
2/' f.0 movcb
2/' f.1 movcb
2/' f.3 movcb
ftemp P0MDOUT mov
P1MDOUT ftemp mov
2/' f.5 movcb
2/' f.6 movcb
ftemp P1MDOUT mov
P2MDOUT ftemp mov
2/' f.0 movcb
ftemp P2MDOUT mov
] drop;
: release
%00001011 ~# P0MDOUT and!
%01100000 ~# P1MDOUT and!
%00000001 ~# P2MDOUT and!
;
: weak
release
%00001000 # P0MDOUT ior!
%00000001 # P2MDOUT ior!
;
here constant "devname ," i2cdriver1"
: heatmap ( u - ) \ heatmap address in x
$80 # + dpl #! ;
: ishot ( u )
heatmap 72 # !x ;
: snap
[ log dpl mov ]
story # a!
dup
16 # 7 #for
[ dpl dec ]
$7f # dpl and!
(@x)
(!+)
7 #next
drop;
: type
@p+ 2 #for @p+ emit 2 #next ;
: hdigit
dup
: (hdigit)
[swap]
: digit
$f # and
-10 # + -if -39 # + then 97 # + emit ;
: dd hdigit digit ;
: dh. dd
: h. dd
: space
32 # emit ;
: point
'.' # emit ;
: d.d
hdigit point digit ;
: .' \ print carry
[ '0' 2/ ] # 2*'
: emit_
emit space ;
: i2c-speed
TH0 #@
I2C_400 # =if 4 (#) ; then
1 (#) ;
: modechar
'I' #
SMB0CF ftemp mov
f.7 if. ; then
'B' (#) ;
: bracket
79 # charc #!
'[' # emit ;
: info
bracket
"devname ##p! type space
"serial ##p! type space
5 clock #@ dd
4 clock #@ dd
3 clock #@ dd
2 clock #@ dd
1 clock #@ (hdigit)
space
vbusd #2@ d.d dd space
currd #2@ digit dd space
tempd #2@ digit d.d space
modechar emit_
[ SDA movbc ] .'
[ SCL movbc ] .'
i2c-speed digit $00 # dd space
pull@ dd space
crc16 dd dd
: pad
charc #@ begin
space 1-
0=until
drop
']' # emit
;
: introspect
bracket
$93 # h.
0 #@ h.
SP #@ h.
SMB0CF #@ h.
SMB0CN #@ h.
TMR2L #2@ dh.
TMR3L #2@ dh.
IE #@ h.
EIE1 #@ h.
P0 #@ h. P0MDIN #@ h. P0MDOUT #@ h.
P1 #@ h. P1MDIN #@ h. P1MDOUT #@ h.
P2 #@ h. P2MDOUT #@ h.
convs #@ h.
pad ;
\ Commands are:
\ e echo next byte
\ s select
\ u unselect
\ 80-bf read 1-64 bytes
\ c0-ff write 1-64 bytes
: count ( u -- u)
63 # and 1+ ;
CLOSEUP [IF]
:m acmd \ Copy ACK into T.7 for a command byte
[ 7 .t set ] m;
[ELSE]
:m acmd \ Copy ACK into T.7 for a command byte
[ ACK movbc 7 .t movcb ] m;
[THEN]
: b>log ( arg - arg )
3 # acmd over
: >log ( cmd arg )
[ dirty set ]
[ log dpl mov ]
!x+ !x+
$7f # dpl and!
[ dpl log mov ]
;
: alert ( u )
[ timeout set ]
drop 4 # 0 # >log ;
: rdN ( n -- )
[ ACK set ]
2 #for
[ $b8 2 + ] , [ 1 cond ] \ Clear ACK on final byte when R2 is 1
[ ACK clr ]
then
i2c>
(>crc) b>log emit
2 #next ;
: rdNA ( n -- ) \ don't NACK final byte
[ ACK set ]
2 #for
i2c> b>log emit
2 #next ;
: report
[ '0' 2/ 2/ 2/ ] #
[ ARBLOST movbc ] 2*'
[ timeout movbc ] 2*'
[ ACK movbc ] 2*' emit ;
: flame ( u - u )
dup clrc 2/' ishot ;
: do-start
key
: log-start ( u )
SDA 0=if. alert ; then
i2c-start
dup >i2c
timeout if. alert ; then
ACK if.
flame
then
2 # acmd
swap >log ;
: log-stop
1 # 0# >log i2c-stop ;
: i2c-regrd \ expect (dev, reg, len)
key 2* key key push ( dev reg R: len )
over log-start \ S/W
b>log >i2c \ reg
1+ log-start \ S/R
pop rdN
log-stop ;
: dmode
'D' #
: newmode
mode #! modechange. set ;
here constant WIP
: device-scan
8 #
112 # 2 #for
i2c-start dup 2* >i2c
ACK if. dup ishot then
report
i2c-stop
1+
2 #next drop ;
: service
key
-if
6 .t if.
count dup
i2cb # a! 2 #for
key
b>log
!+
2 #next
i2cb # a! 2 #for
@+ >i2c
2 #next
report
;
then
count rdN ;
then
'?' # =if info then
'1' # =if 100Khz then
'4' # =if 400Khz then
'a' # =if key rdNA then
'b' # =if bitbang then
'c' # =if 'C' # newmode then
'd' # =if device-scan then
'e' # =if key emit then
'f' # =if fade. set 'X' # emit then
'_' # =if $10 # RSTSRC #! then
'i' # =if i2c-restore then
'm' # =if 'M' # newmode then
'p' # =if log-stop then
'r' # =if i2c-regrd then
's' # =if do-start report then
'u' # =if key pull! then
'v' # =if key startweigh then
'w' # =if weigh then
'x' # =if
i2c-reset
[ '0' 2/ 2/ ] #
[ SDA movbc ] 2*'
[ SCL movbc ] 2*'
emit
then
'J' # =if introspect then
drop ;
: thread2
0 # 2 #for
0# !x+
2 #next
\ '@' # emit
begin
service
again ;
here constant _cap
[ : fwd 0 constant ; ]
include capture.fs
_cap org
[ : fwd bl word find 0= throw execute 0= throw ; ]
include capture.fs
0 constant Y_V
29 constant X_V
80 constant X_MA
include st7735.fs
: hdigit dup [swap]
: digit $f # and '0' # + ch ;
: dd hdigit digit ;
: d3 ( d. ) \ 3-digit space padded
if digit dd ; then \ ###
drop blch
10 # <if blch digit ; then \ __#
dd ; \ _##
: results
white
X_V # Y_V # xy! vbusd #2@ hdigit '.' # ch digit hdigit drop
X_MA # Y_V # xy! currd #2@ d3 ;
cpuHERE $80 max constant STACKS
: go
$de # WDTCN #!
$ad # WDTCN #!
$01 # XBR0 #!
$00 # XBR1 #!
$c0 # XBR2 #!
$00 # CLKSEL #!
\ Clear RAM
$08 # a!
[ $100 $08 - ] # 7 #for 0 # !+ 7 #next
$c0 SP! STACKS RP!
[ ' thread2 >body @ ] ##p!
[
dpl push
dph push
0 push
]
[ STACKS 8 + ] # other #!
$100 SP! $c0 RP!
%11001011 # P0SKIP #! \ TX,RX,SDA
%00010000 # P0MDOUT #! \
%00111111 # P0MDIN #! \ analog P0.6 P0.7
%11101111 # P1SKIP #! \ SCL
%00001111 # P1MDOUT #!
/uart
/adc
/crc
[ ticks/ms negate ] # TMR2RLL #!
[ ticks/ms negate 8 rshift ] # TMR2RLH #!
dmode
[ ET2 set ] \ Timer 2 interrupt enable
[ TR2 set ] \ Timer 2 enable
[ EA set ]
t3i+
release
weak
\ SDA_2k2
\ SDA_4k3
\ SDA_4k7
\ SCL_2k2
\ SCL_4k3
\ SCL_4k7
/i2c 100Khz
[ dirty set ]
swapctx
/st7735 fixed
25 # slowc #!
/converter
begin
conversions
dirty if.
snap
[ dirty clr ]
waves
then
AD0INT if.
AD0INT clr
convs #@ converter convs #!
then
modechange. if.
[ modechange. clr ]
drawmode
mode #@
'C' # =if
capture
dmode
then
'M' # =if
/monitor
then
drop
then
mode #@
'M' # =if
TMR3CN #@ -if
$7f # TMR3CN and!
cool
then drop
RI0 if.
RI0 clr
\monitor
dmode
then
then
drop
slowc #@ \ 4 Hz
0=if
results
then
CLOSEUP [IF]
fade. if.
cool [ fade. clr ]
then
[ELSE]
$1f # and 0=if \ 32 Hz
cool
then
[THEN]
drop
again
here
\ Reset
$000 org go ;
\ UART interrupt
$023 org
swapctx [ reti ]
\ Timer 2 overflow
$02b org [
] timer2 [
TF2H clr
reti
]
\ I2C
$03b org
swapctx [ reti ]
\ Port mismatch
$043 org
mismatch
\ Timer 3 overflow
$073 org
FL1 if. timer3 then
timer3a ;
org
================================================
FILE: firmware/st7735.fs
================================================
$00 constant NOP $2B constant RASET $C2 constant PWCTR3
$01 constant SWRESET $2C constant RAMWR $C3 constant PWCTR4
$04 constant RDDID $2E constant RAMRD $C4 constant PWCTR5
$09 constant RDDST $30 constant PTLAR $C5 constant VMCTR1
$10 constant SLPIN $36 constant MADCTL $DA constant RDID1
$11 constant SLPOUT $3A constant COLMOD $DB constant RDID2
$12 constant PTLON $B1 constant FRMCTR1 $DC constant RDID3
$13 constant NORON $B2 constant FRMCTR2 $DD constant RDID4
$20 constant INVOFF $B3 constant FRMCTR3 $E0 constant GMCTRP1
$21 constant INVON $B4 constant INVCTR $E1 constant GMCTRN1
$28 constant DISPOFF $B6 constant DISSET5 $FC constant PWCTR6
$29 constant DISPON $C0 constant PWCTR1
$2A constant CASET $C1 constant PWCTR2
$80 constant DELAY
here constant init-table
SWRESET , DELAY , \ Software reset, 0 args, w/delay
60 ,
SLPOUT , DELAY , \ Out of sleep mode, 0 args, w/delay
60 ,
FRMCTR1 , 3 , \ Frame rate ctrl - normal mode, 3 args:
0x01 , 0x2C , 0x2D , \ Rate = fosc/(1x2+40) * (LINE+2C+2D)
FRMCTR2 , 3 , \ Frame rate control - idle mode, 3 args:
0x01 , 0x2C , 0x2D , \ Rate = fosc/(1x2+40) * (LINE+2C+2D)
FRMCTR3 , 6 , \ Frame rate ctrl - partial mode, 6 args:
0x01 , 0x2C , 0x2D , \ Dot inversion mode
0x01 , 0x2C , 0x2D , \ Line inversion mode
PWCTR1 , 3 , \ Power control, 3 args:
0xA2 ,
0x02 , \ -4.6V
0x84 , \ AUTO mode
PWCTR2 , 1 , \ Power control, 1 arg:
0xC5 , \ VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
PWCTR3 , 2 , \ Power control, 2 args:
0x0A , \ Opamp current small
0x00 , \ Boost frequency
PWCTR4 , 2 , \ Power control, 2 args:
0x8A , \ BCLK/2, Opamp current small & Medium low
0x2A ,
PWCTR5 , 2 , \ Power control, 2 args:
0x8A , 0xEE ,
VMCTR1 , 1 , \ Power control, 1 arg:
0x0E ,
MADCTL , 1 , \ Memory access control (directions), 1 arg:
0xC8 , \ row addr/col addr, bottom to top refresh
COLMOD , 1 , \ set color mode, 1 arg:
0x03 , \ 12-bit color
GMCTRP1 , 16 , \ Gamma + polarity Correction Characterstics
0x02 , 0x1c , 0x07 , 0x12 ,
0x37 , 0x32 , 0x29 , 0x2d ,
0x29 , 0x25 , 0x2B , 0x39 ,
0x00 , 0x01 , 0x03 , 0x10 ,
GMCTRN1 , 16 , \ Gamma - polarity Correction Characterstics
0x03 , 0x1d , 0x07 , 0x06 ,
0x2E , 0x2C , 0x29 , 0x2D ,
0x2E , 0x2E , 0x37 , 0x3F ,
0x00 , 0x00 , 0x02 , 0x10 ,
NORON , 0 , \ Normal display on
0 ,
:m clk [ 2 .p1 set 2 .p1 clr ] m;
:m 1bit 2*' 1 .p1 movcb clk m;
:m /C/ [ 0 .p1 clr ] m;
:m /D/ [ 0 .p1 set ] m;
: (>st) 1bit 1bit 1bit 1bit
: _4 1bit 1bit 1bit 1bit 2*' ;
: (4>st) 2*' 2*' 2*' 2*' _4 ;
: 4>st (4>st) drop ;
: write-cmd ( b ) /C/
: 1>st ( b ) 1bit 1bit 1bit 1bit 1bit 1bit 1bit 1bit drop ;
: write-data ( b ) /D/ 1>st ;
: data16 ( b ) 0# write-data write-data ;
: args
begin
0=if drop; then
@p+ write-data
1-
again
: coldregs
init-table ##p!
begin
@p+
0=if drop; then
write-cmd
@p+
dup $7f # and args
-if @p+ ms then
drop
again
here [ $1000 > throw ]
$1000 org
: dim ( x w )
over data16 + 1- data16 ;
: rect ( x y w h )
twist ( x w y h )
RASET # write-cmd dim
CASET # write-cmd dim
: writing
RAMWR # write-cmd
/D/
;
: full
blu #@ (4>st)
grn (#@) (4>st) red (#@) 4>st ;
:m |4>st 1bit 1bit 1bit 1bit m;
: half 10 #
: gray
0=if
drop
: dark
1 .p1 clr
clk clk clk clk
clk clk clk clk
clk clk clk clk ;
then
5 (#!) [ blu b mov mul ] $f # + |4>st
5 (#@) [ grn b mov mul ] $f # + |4>st
5 (#@) [ red b mov mul ] $f # + |4>st drop ;
: ndark
7 #for dark 7 #next ;
: cls ( )
0# 0# 128 # 160 #
rect
160 # 6 #for
128 # ndark
6 #next ;
: /st7735
[ 3 .p1 clr ]
1 # ms
[ 3 .p1 set ]
coldregs
cls
: white
$f #
: setgray
red (#!) grn (#!) blu #! ;
: black
0# setgray ;
$1fff constant TOPMEM
947 here
include fontsize.fs
[ TOPMEM FONTDATA_SIZE - ] org
include font.fs
here TOPMEM <> throw
org 947 <> throw
:m 4.4r ( - l h )
dup clra
dup $93 , $a3 , \ |@p+
xchd [swap] m;
: 4.4 ( - h l )
4.4r swap ;
: skip
4.4 * 1+ clrc 2/'
: +p
[ dpl add ] dpl (#!)
[ clra dph addc ] dph (#!)
drop;
: seek ( c - ) \ p points to the data for character c
font ##p!
begin
dup @p+ xor 0=if 2drop ; then
drop skip
again
: xy! y #! x #! ;
: xy@ x #@ y #@ ;
: adv x #+! ; \ advance cursor
: preloop ( l h - i j )
swap if 1u+ then ;
\ Fill rect with current color
: wash ( x y w h )
2dup um* d1+ d2/ preloop 7 #! 6 #!
rect
begin begin
full full
7 #next 6 #next ;
: ch ( c - )
p>r
seek
xy@
4.4 ( w h )
over adv
2dup * push ( w h r: w*h )
rect
pop 1+ 2/ 7 #for
4.4r gray gray
7 #next
r>p ;
: blch
black
xy@ 8 # 9 # wash
8 # adv white ;
: str
@p+ 6 #for
@p+
ch
6 #next ;
: setcolor
4.4 grn #! red #! @p+ blu #! ;
: hex1 ( h - )
x #@ 3 # + $7f # xor 4 #
RASET # write-cmd dim
RAMWR # write-cmd
/D/
micro ##p!
$f # and 10 # b #! [ mul ] +p
10 # 7 #for 4.4r gray gray 7 #next
5 # x #+! ;
: drawhex ( hh - )
y #@ 5 #
CASET # write-cmd dim
dup [swap] hex1 hex1 ;
:m gap [ y inc ] m;
: clip
y #@
: (clip)
-if
$7f # and negate + ;
then
drop;
: preblank ( w )
dup y #@ + (clip)
dup push x #@ -4 # + y #@
16 # pop rect
6 #for 16 # ndark 6 #next ;
: bitmap
0 #
: +bitmap ( o )
x #@ + y #@
-if 2drop ; then
4.4 ( w h )
: (bitmap) ( x y w h )
dup y #+!
clip
2dup * push ( w h r: w*h )
rect
pop 1+ clrc 2/' 7 #for
4.4r gray gray
7 #next ;
: (hex2)
micro ##p!
$f # and 10 # * +p
y #@ -if drop; then drop
x #@ 3 # + y #@
5 # 4 #
(bitmap) ;
: hex2 ( u - )
dup (hex2)
gap
[swap] (hex2)
;
: acknak
0=if'
$c # red #!
$2 # grn #!
$2 # blu #! ;
then
$2 # red #!
$c # grn #!
$2 # blu #! ;
: d-byte-ack
acknak
18 # preblank
gap
dot ##p!
7 # +bitmap
gap
white
hex2
gap gap gap ;
: barpoint ( u - ) \ update the slash bar bounds
-if drop; then
dup
talk0 #@ umin talk0 #!
talk1 #@ umax talk1 #! ;
: slashcolor 8 # setgray ;
here constant DRAW-SEGMENT \ This block must all be in the same 2K segment
: startwave
128 # 7 #!
0 # 8 # 128 # rect
story # a!
[
SP x mov
x dec
x dec
0 y mov
] ;
: column
$df cond
: bail
[
x SP mov
y 0 mov
] then ;
: hi full dark dark dark dark dark dark dark column ;
: lo dark dark dark dark dark dark dark full column ;
: change
full full full full full full full full column ;
: undef
half half half half half half half half column ;
: d-stop
drop a+
0 # red #!
7 # grn #!
7 # blu #!
symbol-p ##p!
: (d-stop)
12 # preblank
bitmap ;
:m y; \ return if y>127
$bc , 128 , 0 , \ CJNE R4,#128,+0
0=if' ; then m;
: d-direction
arrow ##p!
if'
larrow ##p!
then
$f # red #!
$e # grn #!
$2 # blu #!
-5 # y #+!
bitmap ;
: slashv ( u - ) \ draw the bottom slash segment
$08 # <if drop; then
$78 # <if
talked. 0=if.
talker (#!)
talked. set
then
talker @=if
slashcolor
x #@ -4 # + y #@ -5 # +
dup $7f # xor barpoint
6 # 1 # wash
then
then
drop;
: d-start
acknak
18 # preblank
gap
dot ##p!
7 # +bitmap
drop @+ clrc 2/'
d-direction
gap
dup white hex2
slashv
gap gap gap
y;
$c # red #!
$8 # grn #!
$0 # blu #!
symbol-s ##p!
(d-stop) ;
: d-byte
drop @+ d-byte-ack ;
: d-bang
drop a+
15 # red #!
0 # grn #!
1 # blu #!
symbol-b ##p!
12 # preblank
bitmap ;
: d-quit a+ 128 # y #! drop;
:m jumptable 2* here [ 4 + ] ##p! $73 , ( JMP @A+DPTR ) m;
: dispatch
@+ jumptable
( 0 ) d-quit ;
( 1 ) d-stop ;
( 2 ) d-start ;
( 3 ) d-byte ;
( 4 ) d-bang ;
: l-dispatch
begin
dispatch
y;
again
:m pinkwash
8 # red #!
0 # grn #!
8 # blu #!
0 # 117 # 128 # 17 #
wash m;
: hline ( x y l ) 1 # wash ;
: vline ( x y l ) 1 # swap wash ;
: addrgrid ( u - ) \ C set if column 7
dup 2/ 2/ 2/ 7 # * 7 # + y #!
7 # and dup 17 # * x #!
-7 # + drop;
: (slash) ( u - ) \ from the address, vertical down line
addrgrid
[ y inc y inc ]
0=if'
10 # adv
xy@ 3 # hline
3 # adv
else
-4 # adv
xy@ 3 # hline
then
xy@ 117 # over - vline ;
: slash ( u - )
slashcolor (slash)
[ x slashx mov ] ;
: unslash ( u - )
black (slash) ;
: d-slashbar
0# setgray \ undraw
0# 117 # 128 # hline
slashcolor
talked. if.
slashx #@ barpoint
talk0 #@ talk1 #@ over negate + 1+
117 # swap hline
then ;
: ingrad ( u - )
2* grad ##p! +p setcolor ;
: newtalker
white
: d-addr
dup addrgrid drawhex ;
: d-sda-stop
5 # 6 #for hi 6 #next
change
6 # 6 #for lo 6 #next
prev. clr
a+ drop;
: bar
0=if'
prev. if. change else lo then lo ;
then
prev. 0=if. change else hi then hi ;
: d-sda-byte
@+
cplc
9 # 6 #for
bar
[ prev. movcb ]
2/'
6 #next
drop drop;
: d-sda-start
d-sda-byte
6 # prev. if. change 1- then
6 #for lo 6 #next
change
5 # 6 #for hi 6 #next
prev. set
;
: d-sda-none
label-sda [ 1 + ] ##p!
: (label)
16 # 1 #for
4 # 6 #for
4.4r gray gray
6 #next
column
1 #next
begin hi again
: d-sda-bang
12 # 6 #for undef 6 #next
a+ drop;
: sda-dispatch
@+
jumptable
( 0 ) d-sda-none ;
( 1 ) d-sda-stop ;
( 2 ) d-sda-start ;
( 3 ) d-sda-byte ;
( 4 ) d-sda-bang ;
: d-sda
140 # startwave
$4 # red #!
$5 # grn #!
$f # blu #!
begin
sda-dispatch
again
: 9hi
9 # 6 #for hi 6 #next ;
: 2lo
2 # 6 #for lo 6 #next ;
: d-scl-stop
9hi
change
2lo
a+ drop;
: d-scl-byte
a+
9 # 6 #for
lo change
6 #next
drop;
: d-scl-start
d-scl-byte
2lo
change
9hi
;
: d-scl-none
label-scl [ 1 + ] ##p!
(label) ;
: scl-dispatch
@+ jumptable
( 0 ) d-scl-none ;
( 1 ) d-scl-stop ;
( 2 ) d-scl-start ;
( 3 ) d-scl-byte ;
( 4 ) d-sda-bang ;
here [ DRAW-SEGMENT xor $f800 and throw ]
: d-scl
152 # startwave
$c # red #!
$b # grn #!
$1 # blu #!
begin
scl-dispatch
again
: rtl
%10101000 #
: >madctl
MADCTL # write-cmd write-data ;
: ltr
%11001000 # >madctl ;
: drawmode
black
0# 0# 2dup 10 # 9 # wash
white xy! mode #@ ch ;
: fixed
rtl
3 # setgray
$08 #
112 # 6 #for
dup d-addr
1+
6 #next
ltr
drawmode
tplan ##p!
begin
@p+ 0=if drop; then
@p+ xy!
setcolor
str
again
: d-slash
talked. if.
ptalked. if.
ptalker #@ talker @=if drop; then
unslash
then
talker #@ slash ;
then
ptalker #@ unslash ;
: cool1 ( addr - )
\ talker @=if talked. if. drop; then then
dup heatmap @x if ( addr h )
1- (!x) ingrad
d-addr ;
then
2drop ;
: cool
rtl
$08 #
112 # 6 #for
dup cool1
1+
6 #next
drop
ltr ;
\ talked. is true when talker is valid
\ ptalked. and ptalker hold previous values
\ slashx is set to the X of the slash line
: waves
\ pinkwash
rtl
122 # 0 # xy!
$ff # talk0 #!
$00 # talk1 #!
talked. clr
story # a!
l-dispatch
d-sda
d-scl
ltr
d-slash
d-slashbar
talker #@ ptalker #!
[ talked. movbc ptalked. movcb ]
DISPON # write-cmd
;
================================================
FILE: hardware/i2cdriver.brd
================================================
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
<eagle version="6.4">
<drawing>
<settings>
<setting alwaysvectorfont="no"/>
<setting verticaltext="up"/>
</settings>
<grid distance="1" unitdist="mil" unit="mil" style="lines" multiple="1" display="yes" altdistance="0.025" altunitdist="inch" altunit="inch"/>
<layers>
<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="2" name="Route2" color="1" fill="3" visible="yes" active="yes"/>
<layer number="3" name="Route3" color="4" fill="3" visible="no" active="yes"/>
<layer number="4" name="Route4" color="1" fill="4" visible="no" active="yes"/>
<layer number="5" name="Route5" color="4" fill="4" visible="no" active="yes"/>
<layer number="6" name="Route6" color="1" fill="8" visible="no" active="yes"/>
<layer number="7" name="Route7" color="4" fill="8" visible="no" active="yes"/>
<layer number="8" name="Route8" color="1" fill="2" visible="no" active="yes"/>
<layer number="9" name="Route9" color="4" fill="2" visible="no" active="yes"/>
<layer number="10" name="Route10" color="1" fill="7" visible="no" active="yes"/>
<layer number="11" name="Route11" color="4" fill="7" visible="no" active="yes"/>
<layer number="12" name="Route12" color="1" fill="5" visible="no" active="yes"/>
<layer number="13" name="Route13" color="4" fill="5" visible="no" active="yes"/>
<layer number="14" name="Route14" color="1" fill="6" visible="no" active="yes"/>
<layer number="15" name="Route15" color="4" fill="6" visible="yes" active="yes"/>
<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>
<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>
<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>
<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>
<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>
<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>
<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="26" name="bNames" color="7" fill="1" visible="no" active="yes"/>
<layer number="27" name="tValues" color="7" fill="1" visible="no" active="yes"/>
<layer number="28" name="bValues" color="7" fill="1" visible="no" active="yes"/>
<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>
<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>
<layer number="31" name="tCream" color="7" fill="4" visible="yes" active="yes"/>
<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>
<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>
<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>
<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>
<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>
<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>
<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>
<layer number="39" name="tKeepout" color="4" fill="11" visible="yes" active="yes"/>
<layer number="40" name="bKeepout" color="1" fill="11" visible="yes" active="yes"/>
<layer number="41" name="tRestrict" color="4" fill="10" visible="yes" active="yes"/>
<layer number="42" name="bRestrict" color="1" fill="10" visible="yes" active="yes"/>
<layer number="43" name="vRestrict" color="2" fill="10" visible="yes" active="yes"/>
<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>
<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>
<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>
<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>
<layer number="50" name="dxf" color="7" fill="1" visible="no" active="yes"/>
<layer number="51" name="tDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="52" name="bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="53" name="tGND_GNDA" color="7" fill="9" visible="no" active="no"/>
<layer number="54" name="bGND_GNDA" color="1" fill="9" visible="no" active="no"/>
<layer number="56" name="wert" color="7" fill="1" visible="yes" active="yes"/>
<layer number="57" name="tCAD" color="7" fill="1" visible="no" active="no"/>
<layer number="58" name="bCAD" color="11" fill="1" visible="no" active="no"/>
<layer number="59" name="tCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="60" name="bCarbon" color="7" fill="1" visible="no" active="no"/>
<layer number="90" name="Modules" color="7" fill="1" visible="no" active="yes"/>
<layer number="91" name="Nets" color="2" fill="1" visible="no" active="no"/>
<layer number="92" name="Busses" color="1" fill="1" visible="no" active="no"/>
<layer number="93" name="Pins" color="2" fill="1" visible="no" active="no"/>
<layer number="94" name="Symbols" color="4" fill="1" visible="no" active="no"/>
<layer number="95" name="Names" color="7" fill="1" visible="no" active="no"/>
<layer number="96" name="Values" color="7" fill="1" visible="no" active="no"/>
<layer number="97" name="Info" color="7" fill="1" visible="no" active="no"/>
<layer number="98" name="Guide" color="6" fill="1" visible="no" active="no"/>
<layer number="99" name="SpiceOrder" color="7" fill="1" visible="no" active="no"/>
<layer number="100" name="Muster" color="7" fill="1" visible="no" active="no"/>
<layer number="101" name="Patch_Top" color="12" fill="4" visible="yes" active="yes"/>
<layer number="102" name="Vscore" color="7" fill="1" visible="yes" active="yes"/>
<layer number="103" name="fp3" color="7" fill="1" visible="no" active="yes"/>
<layer number="104" name="Name" color="7" fill="1" visible="yes" active="yes"/>
<layer number="105" name="Beschreib" color="9" fill="1" visible="yes" active="yes"/>
<layer number="106" name="BGA-Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="107" name="BD-Top" color="5" fill="1" visible="yes" active="yes"/>
<layer number="108" name="fp8" color="7" fill="1" visible="no" active="yes"/>
<layer number="109" name="fp9" color="7" fill="1" visible="no" active="yes"/>
<layer number="110" name="fp0" color="7" fill="1" visible="no" active="yes"/>
<layer number="111" name="111" color="7" fill="1" visible="no" active="yes"/>
<layer number="112" name="tSilk" color="7" fill="1" visible="no" active="yes"/>
<layer number="113" name="ReferenceLS" color="7" fill="1" visible="no" active="no"/>
<layer number="114" name="Route14" color="7" fill="1" visible="no" active="no"/>
<layer number="115" name="115bmp" color="1" fill="10" visible="yes" active="yes"/>
<layer number="116" name="Patch_BOT" color="9" fill="4" visible="yes" active="yes"/>
<layer number="117" name="mPads" color="7" fill="1" visible="no" active="no"/>
<layer number="118" name="Rect_Pads" color="7" fill="1" visible="no" active="yes"/>
<layer number="119" name="mUnrouted" color="7" fill="1" visible="no" active="no"/>
<layer number="120" name="mDimension" color="7" fill="1" visible="no" active="no"/>
<layer number="121" name="_tsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="122" name="_bsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="123" name="tTestmark" color="7" fill="1" visible="no" active="yes"/>
<layer number="124" name="bTestmark" color="7" fill="1" visible="no" active="yes"/>
<layer number="125" name="_tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="126" name="_bNames" color="7" fill="1" visible="no" active="yes"/>
<layer number="127" name="_tValues" color="7" fill="1" visible="no" active="yes"/>
<layer number="128" name="_bValues" color="7" fill="1" visible="no" active="yes"/>
<layer number="129" name="Mask" color="7" fill="1" visible="yes" active="yes"/>
<layer number="130" name="mbStop" color="7" fill="1" visible="no" active="no"/>
<layer number="131" name="tAdjust" color="7" fill="1" visible="no" active="yes"/>
<layer number="132" name="bAdjust" color="7" fill="1" visible="no" active="yes"/>
<layer number="133" name="mtFinish" color="7" fill="1" visible="no" active="no"/>
<layer number="134" name="mbFinish" color="7" fill="1" visible="no" active="no"/>
<layer number="135" name="mtGlue" color="7" fill="1" visible="no" active="no"/>
<layer number="136" name="mbGlue" color="7" fill="1" visible="no" active="no"/>
<layer number="137" name="mtTest" color="7" fill="1" visible="no" active="no"/>
<layer number="138" name="mbTest" color="7" fill="1" visible="no" active="no"/>
<layer number="139" name="mtKeepout" color="7" fill="1" visible="no" active="no"/>
<layer number="140" name="mbKeepout" color="7" fill="1" visible="no" active="no"/>
<layer number="141" name="mtRestrict" color="7" fill="1" visible="no" active="no"/>
<layer number="142" name="mbRestrict" color="7" fill="1" visible="no" active="no"/>
<layer number="143" name="mvRestrict" color="7" fill="1" visible="no" active="no"/>
<layer number="144" name="Drill_legend" color="7" fill="1" visible="yes" active="yes"/>
<layer number="145" name="mHoles" color="7" fill="1" visible="no" active="no"/>
<layer number="146" name="mMilling" color="7" fill="1" visible="no" active="no"/>
<layer number="147" name="mMeasures" color="7" fill="1" visible="no" active="no"/>
<layer number="148" name="mDocument" color="7" fill="1" visible="no" active="no"/>
<layer number="149" name="mReference" color="7" fill="1" visible="no" active="no"/>
<layer number="150" name="Notes" color="7" fill="1" visible="no" active="yes"/>
<layer number="151" name="HeatSink" color="7" fill="1" visible="yes" active="yes"/>
<layer number="152" name="_bDocu" color="7" fill="1" visible="no" active="yes"/>
<layer number="153" name="FabDoc1" color="6" fill="1" visible="no" active="no"/>
<layer number="154" name="FabDoc2" color="2" fill="1" visible="no" active="no"/>
<layer number="155" name="FabDoc3" color="7" fill="15" visible="no" active="no"/>
<layer number="191" name="mNets" color="7" fill="1" visible="no" active="no"/>
<layer number="192" name="mBusses" color="7" fill="1" visible="no" active="no"/>
<layer number="193" name="mPins" color="7" fill="1" visible="no" active="no"/>
<layer number="194" name="mSymbols" color="7" fill="1" visible="no" active="no"/>
<layer number="195" name="mNames" color="7" fill="1" visible="no" active="no"/>
<layer number="196" name="mValues" color="7" fill="1" visible="no" active="no"/>
<layer number="199" name="Contour" color="7" fill="1" visible="yes" active="yes"/>
<layer number="200" name="200bmp" color="1" fill="10" visible="yes" active="yes"/>
<layer number="201" name="201bmp" color="2" fill="1" visible="no" active="no"/>
<layer number="202" name="202bmp" color="3" fill="1" visible="no" active="no"/>
<layer number="203" name="203bmp" color="4" fill="10" visible="yes" active="yes"/>
<layer number="204" name="204bmp" color="5" fill="10" visible="yes" active="yes"/>
<layer number="205" name="205bmp" color="6" fill="10" visible="yes" active="yes"/>
<layer number="206" name="206bmp" color="7" fill="10" visible="yes" active="yes"/>
<layer number="207" name="207bmp" color="8" fill="10" visible="yes" active="yes"/>
<layer number="208" name="208bmp" color="9" fill="10" visible="yes" active="yes"/>
<layer number="209" name="209bmp" color="7" fill="1" visible="no" active="yes"/>
<layer number="210" name="210bmp" color="7" fill="1" visible="no" active="yes"/>
<layer number="211" name="211bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="212" name="212bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="213" name="213bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="214" name="214bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="215" name="215bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="216" name="216bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="217" name="217bmp" color="18" fill="1" visible="no" active="no"/>
<layer number="218" name="218bmp" color="19" fill="1" visible="no" active="no"/>
<layer number="219" name="219bmp" color="20" fill="1" visible="no" active="no"/>
<layer number="220" name="220bmp" color="21" fill="1" visible="no" active="no"/>
<layer number="221" name="221bmp" color="22" fill="1" visible="no" active="no"/>
<layer number="222" name="222bmp" color="23" fill="1" visible="no" active="no"/>
<layer number="223" name="223bmp" color="24" fill="1" visible="no" active="no"/>
<layer number="224" name="224bmp" color="25" fill="1" visible="no" active="no"/>
<layer number="225" name="225bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="226" name="226bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="227" name="227bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="228" name="228bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="229" name="229bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="230" name="230bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="231" name="Eagle3D_PG1" color="7" fill="1" visible="no" active="no"/>
<layer number="232" name="Eagle3D_PG2" color="7" fill="1" visible="no" active="no"/>
<layer number="233" name="Eagle3D_PG3" color="7" fill="1" visible="no" active="no"/>
<layer number="248" name="Housing" color="7" fill="1" visible="no" active="yes"/>
<layer number="249" name="Edge" color="7" fill="1" visible="no" active="yes"/>
<layer number="250" name="Descript" color="7" fill="1" visible="no" active="no"/>
<layer number="251" name="SMDround" color="7" fill="1" visible="no" active="no"/>
<layer number="254" name="cooling" color="7" fill="1" visible="yes" active="yes"/>
<layer number="255" name="routoute" color="7" fill="1" visible="yes" active="yes"/>
</layers>
<board>
<plain>
<wire x1="10.6" y1="15.7" x2="72.35" y2="15.7" width="0.4064" layer="20"/>
<wire x1="72.35" y1="15.7" x2="72.35" y2="64.2" width="0.4064" layer="20"/>
<wire x1="72.35" y1="64.2" x2="10.6" y2="64.2" width="0.4064" layer="20"/>
<wire x1="10.6" y1="64.2" x2="10.6" y2="15.7" width="0.4064" layer="20"/>
<rectangle x1="11.67256875" y1="47.5653125" x2="11.771625" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="11.47445" y1="47.5653125" x2="12.0357875" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="11.3753875" y1="47.565309375" x2="12.2008875" y2="47.598328125" layer="200" rot="R270"/>
<rectangle x1="11.061696875" y1="52.0065" x2="12.580615625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.32585625" y1="47.581821875" x2="12.31645625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.50011875" y1="37.5767625" x2="20.14219375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.09471875" y1="52.0065" x2="12.6136375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.292840625" y1="47.581821875" x2="12.415515625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.533140625" y1="37.5767625" x2="20.175215625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.1277375" y1="52.0065" x2="12.64665625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.25981875" y1="47.581821875" x2="12.514575" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.566159375" y1="37.5767625" x2="20.208234375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.160759375" y1="52.0065" x2="12.679678125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2268" y1="47.581821875" x2="12.6136375" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.59918125" y1="37.5767625" x2="20.24125625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.193778125" y1="52.0065" x2="12.712696875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2268" y1="47.581821875" x2="12.679675" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.6322" y1="37.5767625" x2="20.274275" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.226796875" y1="52.0065" x2="12.745715625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.226796875" y1="47.581821875" x2="12.745715625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.66521875" y1="37.5767625" x2="20.30729375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.25981875" y1="52.0065" x2="12.7787375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2268" y1="47.581821875" x2="12.81175625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.698240625" y1="37.5767625" x2="20.340315625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.2928375" y1="52.0065" x2="12.81175625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2102875" y1="47.59833125" x2="12.89430625" y2="47.63135" layer="200" rot="R270"/>
<rectangle x1="3.731259375" y1="37.5767625" x2="20.373334375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.325859375" y1="52.0065" x2="12.844778125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2268" y1="47.581821875" x2="12.9438375" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.76428125" y1="37.5767625" x2="20.40635625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.358878125" y1="52.0065" x2="12.877796875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2102875" y1="47.59833125" x2="13.0263875" y2="47.63135" layer="200" rot="R270"/>
<rectangle x1="3.7973" y1="37.5767625" x2="20.439375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.391896875" y1="52.0065" x2="12.910815625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.226796875" y1="47.581821875" x2="13.075915625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.83031875" y1="37.5767625" x2="20.47239375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.42491875" y1="52.0065" x2="12.9438375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2268" y1="47.581821875" x2="13.14195625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.863340625" y1="37.5767625" x2="20.505415625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.4579375" y1="52.0065" x2="12.97685625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.226796875" y1="47.581821875" x2="13.207996875" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.896359375" y1="37.5767625" x2="20.538434375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.490959375" y1="52.0065" x2="13.009878125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.243309375" y1="47.59833125" x2="13.257528125" y2="47.63135" layer="200" rot="R270"/>
<rectangle x1="3.92938125" y1="37.5767625" x2="20.57145625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.523978125" y1="52.0065" x2="13.042896875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.25981875" y1="47.581821875" x2="13.30705625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.9624" y1="37.5767625" x2="20.604475" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.556996875" y1="52.0065" x2="13.075915625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.25981875" y1="47.581821875" x2="13.37309375" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="3.99541875" y1="37.5767625" x2="20.63749375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.59001875" y1="52.0065" x2="13.1089375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.276328125" y1="47.59833125" x2="13.422628125" y2="47.63135" layer="200" rot="R270"/>
<rectangle x1="4.028440625" y1="37.5767625" x2="20.670515625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.6230375" y1="52.0065" x2="13.14195625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.2928375" y1="47.581821875" x2="13.47215625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="4.061459375" y1="37.5767625" x2="20.703534375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.656059375" y1="52.0065" x2="13.174978125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.30935" y1="47.59833125" x2="13.5216875" y2="47.63135" layer="200" rot="R270"/>
<rectangle x1="4.09448125" y1="37.5767625" x2="20.73655625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.689078125" y1="52.0065" x2="13.207996875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.325859375" y1="47.581821875" x2="13.571215625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="4.1275" y1="37.5767625" x2="20.769575" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="11.722096875" y1="52.0065" x2="13.241015625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="11.342365625" y1="47.59833125" x2="13.620746875" y2="47.63135" layer="200" rot="R270"/>
<rectangle x1="4.16051875" y1="37.5767625" x2="20.80259375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="12.151359375" y1="52.006503125" x2="12.877796875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="11.358878125" y1="47.581821875" x2="13.670278125" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="12.184378125" y1="52.006503125" x2="12.910815625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.019278125" y1="48.242221875" x2="13.075915625" y2="48.275240625" layer="200" rot="R270"/>
<rectangle x1="12.052296875" y1="46.921421875" x2="13.042896875" y2="46.954440625" layer="200" rot="R270"/>
<rectangle x1="12.2174" y1="52.006503125" x2="12.9438375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.101828125" y1="48.29175" x2="13.059409375" y2="48.32476875" layer="200" rot="R270"/>
<rectangle x1="12.118340625" y1="46.85538125" x2="13.042896875" y2="46.8884" layer="200" rot="R270"/>
<rectangle x1="12.25041875" y1="52.006503125" x2="12.97685625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.16786875" y1="48.324771875" x2="13.05940625" y2="48.357790625" layer="200" rot="R270"/>
<rectangle x1="12.184378125" y1="46.8223625" x2="13.042896875" y2="46.85538125" layer="200" rot="R270"/>
<rectangle x1="12.2834375" y1="52.006503125" x2="13.009875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.2008875" y1="48.357790625" x2="13.092425" y2="48.390809375" layer="200" rot="R270"/>
<rectangle x1="12.217396875" y1="46.789340625" x2="13.075915625" y2="46.822359375" layer="200" rot="R270"/>
<rectangle x1="12.316459375" y1="52.006503125" x2="13.042896875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.266928125" y1="48.390809375" x2="13.092428125" y2="48.423828125" layer="200" rot="R270"/>
<rectangle x1="12.266928125" y1="46.77283125" x2="13.092428125" y2="46.80585" layer="200" rot="R270"/>
<rectangle x1="12.349478125" y1="52.006503125" x2="13.075915625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.2834375" y1="48.407321875" x2="13.14195625" y2="48.440340625" layer="200" rot="R270"/>
<rectangle x1="12.33296875" y1="46.7398125" x2="13.092425" y2="46.77283125" layer="200" rot="R270"/>
<rectangle x1="12.3825" y1="52.006503125" x2="13.1089375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.33296875" y1="48.42383125" x2="13.15846875" y2="48.45685" layer="200" rot="R270"/>
<rectangle x1="12.3825" y1="46.756321875" x2="13.1089375" y2="46.789340625" layer="200" rot="R270"/>
<rectangle x1="12.41551875" y1="52.006503125" x2="13.14195625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.382496875" y1="48.440340625" x2="13.174978125" y2="48.473359375" layer="200" rot="R270"/>
<rectangle x1="12.4485375" y1="46.756321875" x2="13.1089375" y2="46.789340625" layer="200" rot="R270"/>
<rectangle x1="12.4485375" y1="52.006503125" x2="13.174975" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.41551875" y1="48.4733625" x2="13.20799375" y2="48.50638125" layer="200" rot="R270"/>
<rectangle x1="12.5310875" y1="46.77283125" x2="13.092425" y2="46.80585" layer="200" rot="R270"/>
<rectangle x1="12.481559375" y1="52.006503125" x2="13.207996875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.448540625" y1="48.4733625" x2="13.241015625" y2="48.50638125" layer="200" rot="R270"/>
<rectangle x1="12.58061875" y1="46.789340625" x2="13.1089375" y2="46.822359375" layer="200" rot="R270"/>
<rectangle x1="12.514578125" y1="52.006503125" x2="13.241015625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.49806875" y1="48.489871875" x2="13.257525" y2="48.522890625" layer="200" rot="R270"/>
<rectangle x1="12.64665625" y1="46.789340625" x2="13.1089375" y2="46.822359375" layer="200" rot="R270"/>
<rectangle x1="12.5476" y1="52.006503125" x2="13.2740375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.514578125" y1="48.50638125" x2="13.307059375" y2="48.5394" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="46.80585" x2="13.092428125" y2="46.83886875" layer="200" rot="R270"/>
<rectangle x1="12.58061875" y1="52.006503125" x2="13.30705625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.56410625" y1="48.522890625" x2="13.32356875" y2="48.555909375" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="46.822359375" x2="13.1089375" y2="46.855378125" layer="200" rot="R270"/>
<rectangle x1="12.6136375" y1="52.006503125" x2="13.340075" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.597125" y1="48.522890625" x2="13.3565875" y2="48.555909375" layer="200" rot="R270"/>
<rectangle x1="12.82826875" y1="46.838871875" x2="13.12544375" y2="46.871890625" layer="200" rot="R270"/>
<rectangle x1="12.646659375" y1="52.006503125" x2="13.373096875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.646659375" y1="48.539403125" x2="13.373096875" y2="48.572421875" layer="200" rot="R270"/>
<rectangle x1="12.91081875" y1="46.85538125" x2="13.1089375" y2="46.8884" layer="200" rot="R270"/>
<rectangle x1="12.679678125" y1="52.006503125" x2="13.406115625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.679678125" y1="48.539403125" x2="13.406115625" y2="48.572421875" layer="200" rot="R270"/>
<rectangle x1="12.960346875" y1="46.871890625" x2="13.125446875" y2="46.904909375" layer="200" rot="R270"/>
<rectangle x1="12.7127" y1="52.006503125" x2="13.4391375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.7127" y1="48.539403125" x2="13.4391375" y2="48.572421875" layer="200" rot="R270"/>
<rectangle x1="13.0263875" y1="46.871890625" x2="13.12545" y2="46.904909375" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="52.006503125" x2="13.47215625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="48.5559125" x2="13.488665625" y2="48.58893125" layer="200" rot="R270"/>
<rectangle x1="13.092428125" y1="46.9049125" x2="13.125446875" y2="46.93793125" layer="200" rot="R270"/>
<rectangle x1="12.33296875" y1="45.0888125" x2="13.88490625" y2="45.12183125" layer="200" rot="R270"/>
<rectangle x1="12.762228125" y1="42.31513125" x2="13.455646875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.712696875" y1="40.515540625" x2="13.505178125" y2="40.548559375" layer="200" rot="R270"/>
<rectangle x1="12.33296875" y1="38.914071875" x2="13.88490625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.7127" y1="36.4210625" x2="13.505175" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.00276875" y1="33.465771875" x2="14.21510625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="31.402021875" x2="13.47215625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.712696875" y1="29.618940625" x2="13.505178125" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="52.006503125" x2="13.505175" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="48.572421875" x2="13.505175" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="12.266928125" y1="44.989753125" x2="14.016984375" y2="45.022771875" layer="200" rot="R270"/>
<rectangle x1="12.795246875" y1="42.31513125" x2="13.488665625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="40.5485625" x2="13.53819375" y2="40.58158125" layer="200" rot="R270"/>
<rectangle x1="12.3659875" y1="38.914071875" x2="13.917925" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.712696875" y1="36.4210625" x2="13.571215625" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.0357875" y1="33.465771875" x2="14.248125" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="31.402021875" x2="13.505175" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="29.6519625" x2="13.53819375" y2="29.68498125" layer="200" rot="R270"/>
<rectangle x1="12.811759375" y1="52.006503125" x2="13.538196875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.811759375" y1="48.572421875" x2="13.538196875" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="12.2174" y1="44.907203125" x2="14.13255625" y2="44.940221875" layer="200" rot="R270"/>
<rectangle x1="12.82826875" y1="42.31513125" x2="13.5216875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="40.58158125" x2="13.57121875" y2="40.6146" layer="200" rot="R270"/>
<rectangle x1="12.399009375" y1="38.914071875" x2="13.950946875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="36.437571875" x2="13.620746875" y2="36.470590625" layer="200" rot="R270"/>
<rectangle x1="12.068809375" y1="33.465771875" x2="14.281146875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.811759375" y1="31.402021875" x2="13.538196875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="29.68498125" x2="13.57121875" y2="29.718" layer="200" rot="R270"/>
<rectangle x1="12.844778125" y1="52.006503125" x2="13.571215625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.844778125" y1="48.572421875" x2="13.571215625" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="12.2008875" y1="44.857671875" x2="14.21510625" y2="44.890690625" layer="200" rot="R270"/>
<rectangle x1="12.8612875" y1="42.31513125" x2="13.55470625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.81175625" y1="40.6146" x2="13.6042375" y2="40.64761875" layer="200" rot="R270"/>
<rectangle x1="12.432028125" y1="38.914071875" x2="13.983965625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="36.4210625" x2="13.670275" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.101828125" y1="33.465771875" x2="14.314165625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.844778125" y1="31.402021875" x2="13.571215625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.81175625" y1="29.718" x2="13.6042375" y2="29.75101875" layer="200" rot="R270"/>
<rectangle x1="12.8778" y1="52.006503125" x2="13.6042375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.8778" y1="48.572421875" x2="13.6042375" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="12.184378125" y1="44.808140625" x2="14.297659375" y2="44.841159375" layer="200" rot="R270"/>
<rectangle x1="12.894309375" y1="42.31513125" x2="13.587728125" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.84478125" y1="40.647621875" x2="13.63725625" y2="40.680640625" layer="200" rot="R270"/>
<rectangle x1="12.46505" y1="38.914071875" x2="14.0169875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="36.421059375" x2="13.73631875" y2="36.454078125" layer="200" rot="R270"/>
<rectangle x1="12.13485" y1="33.465771875" x2="14.3471875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.8778" y1="31.402021875" x2="13.6042375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.861290625" y1="29.7345125" x2="13.620746875" y2="29.76753125" layer="200" rot="R270"/>
<rectangle x1="12.91081875" y1="52.006503125" x2="13.63725625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.91081875" y1="48.605440625" x2="13.63725625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="12.184378125" y1="44.775121875" x2="14.363696875" y2="44.808140625" layer="200" rot="R270"/>
<rectangle x1="12.927328125" y1="42.31513125" x2="13.620746875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.877796875" y1="40.680640625" x2="13.670278125" y2="40.713659375" layer="200" rot="R270"/>
<rectangle x1="12.49806875" y1="38.914071875" x2="14.05000625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="36.421059375" x2="13.7693375" y2="36.454078125" layer="200" rot="R270"/>
<rectangle x1="12.16786875" y1="33.465771875" x2="14.38020625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.91081875" y1="31.402021875" x2="13.63725625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.894309375" y1="29.76753125" x2="13.653765625" y2="29.80055" layer="200" rot="R270"/>
<rectangle x1="12.9438375" y1="52.006503125" x2="13.670275" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.9438375" y1="48.605440625" x2="13.670275" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="12.184378125" y1="44.742103125" x2="14.429734375" y2="44.775121875" layer="200" rot="R270"/>
<rectangle x1="12.960346875" y1="42.31513125" x2="13.653765625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.91081875" y1="40.7136625" x2="13.70329375" y2="40.74668125" layer="200" rot="R270"/>
<rectangle x1="12.5310875" y1="38.914071875" x2="14.083025" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="36.4210625" x2="13.835375" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.2008875" y1="33.465771875" x2="14.413225" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.9438375" y1="31.402021875" x2="13.670275" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.927328125" y1="29.800553125" x2="13.686784375" y2="29.833571875" layer="200" rot="R270"/>
<rectangle x1="12.976859375" y1="52.006503125" x2="13.703296875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="12.976859375" y1="48.605440625" x2="13.703296875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="12.2008875" y1="44.725590625" x2="14.47926875" y2="44.758609375" layer="200" rot="R270"/>
<rectangle x1="12.99336875" y1="42.31513125" x2="13.6867875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.9438375" y1="40.74668125" x2="13.73631875" y2="40.7797" layer="200" rot="R270"/>
<rectangle x1="12.564109375" y1="38.914071875" x2="14.116046875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.778740625" y1="36.4210625" x2="13.901415625" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.233909375" y1="33.465771875" x2="14.446246875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="12.976859375" y1="31.402021875" x2="13.703296875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.96035" y1="29.833571875" x2="13.71980625" y2="29.866590625" layer="200" rot="R270"/>
<rectangle x1="13.009878125" y1="52.006503125" x2="13.736315625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.009878125" y1="48.605440625" x2="13.736315625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="12.2008875" y1="44.692571875" x2="14.54530625" y2="44.725590625" layer="200" rot="R270"/>
<rectangle x1="13.0263875" y1="42.31513125" x2="13.71980625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="12.97685625" y1="40.7797" x2="13.7693375" y2="40.81271875" layer="200" rot="R270"/>
<rectangle x1="12.6136375" y1="38.8975625" x2="14.13255625" y2="38.93058125" layer="200" rot="R270"/>
<rectangle x1="12.811759375" y1="36.4210625" x2="13.934434375" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.266928125" y1="33.465771875" x2="14.479265625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.009878125" y1="31.402021875" x2="13.736315625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="12.993365625" y1="29.866590625" x2="13.752828125" y2="29.899609375" layer="200" rot="R270"/>
<rectangle x1="13.0429" y1="52.006503125" x2="13.7693375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.0429" y1="48.605440625" x2="13.7693375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="12.2174" y1="44.6760625" x2="14.5948375" y2="44.70908125" layer="200" rot="R270"/>
<rectangle x1="13.059409375" y1="42.31513125" x2="13.752828125" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.026390625" y1="40.7962125" x2="13.785846875" y2="40.82923125" layer="200" rot="R270"/>
<rectangle x1="13.059409375" y1="38.914071875" x2="13.752828125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.811759375" y1="36.4210625" x2="14.000478125" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="12.29995" y1="33.465771875" x2="14.5122875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.0429" y1="31.402021875" x2="13.7693375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.026390625" y1="29.8996125" x2="13.785846875" y2="29.93263125" layer="200" rot="R270"/>
<rectangle x1="13.07591875" y1="52.006503125" x2="13.80235625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.07591875" y1="48.605440625" x2="13.80235625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.092428125" y1="45.518071875" x2="13.785846875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="12.99336875" y1="43.900090625" x2="13.88490625" y2="43.933109375" layer="200" rot="R270"/>
<rectangle x1="13.092428125" y1="42.31513125" x2="13.785846875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.059409375" y1="40.82923125" x2="13.818865625" y2="40.86225" layer="200" rot="R270"/>
<rectangle x1="13.092428125" y1="38.914071875" x2="13.785846875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="12.811759375" y1="36.4210625" x2="14.066515625" y2="36.45408125" layer="200" rot="R270"/>
<rectangle x1="13.07591875" y1="34.208721875" x2="13.80235625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.07591875" y1="31.402021875" x2="13.80235625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.059409375" y1="29.93263125" x2="13.818865625" y2="29.96565" layer="200" rot="R270"/>
<rectangle x1="13.1089375" y1="52.006503125" x2="13.835375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.1089375" y1="48.605440625" x2="13.835375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.125446875" y1="45.518071875" x2="13.818865625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.05940625" y1="43.83405" x2="13.88490625" y2="43.86706875" layer="200" rot="R270"/>
<rectangle x1="13.125446875" y1="42.31513125" x2="13.818865625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.092428125" y1="40.862253125" x2="13.851884375" y2="40.895271875" layer="200" rot="R270"/>
<rectangle x1="13.125446875" y1="38.914071875" x2="13.818865625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.158465625" y1="36.73475" x2="13.785846875" y2="36.76776875" layer="200" rot="R270"/>
<rectangle x1="13.174978125" y1="36.0908625" x2="13.769334375" y2="36.12388125" layer="200" rot="R270"/>
<rectangle x1="13.1089375" y1="34.208721875" x2="13.835375" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.1089375" y1="31.402021875" x2="13.835375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.092428125" y1="29.965653125" x2="13.851884375" y2="29.998671875" layer="200" rot="R270"/>
<rectangle x1="13.141959375" y1="52.006503125" x2="13.868396875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.141959375" y1="48.605440625" x2="13.868396875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.15846875" y1="45.518071875" x2="13.8518875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.108940625" y1="43.784521875" x2="13.901415625" y2="43.817540625" layer="200" rot="R270"/>
<rectangle x1="13.15846875" y1="42.31513125" x2="13.8518875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.12545" y1="40.895271875" x2="13.88490625" y2="40.928290625" layer="200" rot="R270"/>
<rectangle x1="13.15846875" y1="38.914071875" x2="13.8518875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.191490625" y1="36.767771875" x2="13.818865625" y2="36.800790625" layer="200" rot="R270"/>
<rectangle x1="13.207996875" y1="36.057840625" x2="13.802359375" y2="36.090859375" layer="200" rot="R270"/>
<rectangle x1="13.141959375" y1="34.208721875" x2="13.868396875" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.141959375" y1="31.402021875" x2="13.868396875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.12545" y1="29.998671875" x2="13.88490625" y2="30.031690625" layer="200" rot="R270"/>
<rectangle x1="13.174978125" y1="52.006503125" x2="13.901415625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.174978125" y1="48.605440625" x2="13.901415625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.1914875" y1="45.518071875" x2="13.88490625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.158465625" y1="43.734990625" x2="13.917928125" y2="43.768009375" layer="200" rot="R270"/>
<rectangle x1="13.1914875" y1="42.31513125" x2="13.88490625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.158465625" y1="40.928290625" x2="13.917928125" y2="40.961309375" layer="200" rot="R270"/>
<rectangle x1="13.1914875" y1="38.914071875" x2="13.88490625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="36.767771875" x2="13.851884375" y2="36.800790625" layer="200" rot="R270"/>
<rectangle x1="13.22450625" y1="36.04133125" x2="13.8518875" y2="36.07435" layer="200" rot="R270"/>
<rectangle x1="13.174978125" y1="34.208721875" x2="13.901415625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.174978125" y1="31.402021875" x2="13.901415625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.158465625" y1="30.031690625" x2="13.917928125" y2="30.064709375" layer="200" rot="R270"/>
<rectangle x1="13.208" y1="52.006503125" x2="13.9344375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.208" y1="48.605440625" x2="13.9344375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="45.518071875" x2="13.917928125" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.208" y1="43.71848125" x2="13.9344375" y2="43.7515" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="42.31513125" x2="13.917928125" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.191490625" y1="40.9613125" x2="13.950946875" y2="40.99433125" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="38.914071875" x2="13.917928125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="36.800790625" x2="13.884909375" y2="36.833809375" layer="200" rot="R270"/>
<rectangle x1="13.274040625" y1="36.024821875" x2="13.868396875" y2="36.057840625" layer="200" rot="R270"/>
<rectangle x1="13.208" y1="34.208721875" x2="13.9344375" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.208" y1="31.402021875" x2="13.9344375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.191490625" y1="30.0647125" x2="13.950946875" y2="30.09773125" layer="200" rot="R270"/>
<rectangle x1="13.24101875" y1="52.006503125" x2="13.96745625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.24101875" y1="48.605440625" x2="13.96745625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="45.518071875" x2="13.950946875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.24101875" y1="43.6854625" x2="13.96745625" y2="43.71848125" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="42.31513125" x2="13.950946875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="40.99433125" x2="13.983965625" y2="41.02735" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="38.914071875" x2="13.950946875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.2740375" y1="36.8173" x2="13.9344375" y2="36.85031875" layer="200" rot="R270"/>
<rectangle x1="13.29055" y1="36.0083125" x2="13.917925" y2="36.04133125" layer="200" rot="R270"/>
<rectangle x1="13.24101875" y1="34.208721875" x2="13.96745625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.24101875" y1="31.402021875" x2="13.96745625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="30.09773125" x2="13.983965625" y2="30.13075" layer="200" rot="R270"/>
<rectangle x1="13.2740375" y1="52.006503125" x2="14.000475" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.2740375" y1="48.605440625" x2="14.000475" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.290546875" y1="45.518071875" x2="13.983965625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.290546875" y1="43.66895" x2="13.983965625" y2="43.70196875" layer="200" rot="R270"/>
<rectangle x1="13.290546875" y1="42.31513125" x2="13.983965625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="41.027353125" x2="14.016984375" y2="41.060371875" layer="200" rot="R270"/>
<rectangle x1="13.290546875" y1="38.914071875" x2="13.983965625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.32356875" y1="36.8338125" x2="13.95094375" y2="36.86683125" layer="200" rot="R270"/>
<rectangle x1="13.340078125" y1="35.991803125" x2="13.934434375" y2="36.024821875" layer="200" rot="R270"/>
<rectangle x1="13.2740375" y1="34.208721875" x2="14.000475" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.2740375" y1="31.402021875" x2="14.000475" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="30.130753125" x2="14.016984375" y2="30.163771875" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="52.006503125" x2="14.033496875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="48.605440625" x2="14.033496875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.32356875" y1="45.518071875" x2="14.0169875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="43.652440625" x2="14.033496875" y2="43.685459375" layer="200" rot="R270"/>
<rectangle x1="13.32356875" y1="42.31513125" x2="14.0169875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.29055" y1="41.060371875" x2="14.05000625" y2="41.093390625" layer="200" rot="R270"/>
<rectangle x1="13.32356875" y1="38.914071875" x2="14.0169875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.340078125" y1="36.850321875" x2="14.000478125" y2="36.883340625" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="35.975290625" x2="13.98396875" y2="36.008309375" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="34.208721875" x2="14.033496875" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="31.402021875" x2="14.033496875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.29055" y1="30.163771875" x2="14.05000625" y2="30.196790625" layer="200" rot="R270"/>
<rectangle x1="13.340078125" y1="52.006503125" x2="14.066515625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.340078125" y1="48.605440625" x2="14.066515625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="45.518071875" x2="14.05000625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.340078125" y1="43.652440625" x2="14.066515625" y2="43.685459375" layer="200" rot="R270"/>
<rectangle x1="12.72920625" y1="41.68775" x2="14.6773875" y2="41.72076875" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="38.914071875" x2="14.05000625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.373096875" y1="36.883340625" x2="14.033496875" y2="36.916359375" layer="200" rot="R270"/>
<rectangle x1="13.389609375" y1="35.942271875" x2="14.016984375" y2="35.975290625" layer="200" rot="R270"/>
<rectangle x1="13.340078125" y1="34.208721875" x2="14.066515625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="12.72920625" y1="30.79115" x2="14.6773875" y2="30.82416875" layer="200" rot="R270"/>
<rectangle x1="13.3731" y1="52.006503125" x2="14.0995375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.3731" y1="48.605440625" x2="14.0995375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.389609375" y1="45.518071875" x2="14.083028125" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.3731" y1="43.652440625" x2="14.0995375" y2="43.685459375" layer="200" rot="R270"/>
<rectangle x1="12.778740625" y1="41.7042625" x2="14.693896875" y2="41.73728125" layer="200" rot="R270"/>
<rectangle x1="13.389609375" y1="38.914071875" x2="14.083028125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.40611875" y1="36.883340625" x2="14.06651875" y2="36.916359375" layer="200" rot="R270"/>
<rectangle x1="13.42263125" y1="35.942271875" x2="14.05000625" y2="35.975290625" layer="200" rot="R270"/>
<rectangle x1="13.3731" y1="34.208721875" x2="14.0995375" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="12.762228125" y1="30.79115" x2="14.710409375" y2="30.82416875" layer="200" rot="R270"/>
<rectangle x1="13.40611875" y1="52.006503125" x2="14.13255625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.40611875" y1="48.605440625" x2="14.13255625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.422628125" y1="45.518071875" x2="14.116046875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.40611875" y1="43.619421875" x2="14.13255625" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="41.638221875" x2="14.79295625" y2="41.671240625" layer="200" rot="R270"/>
<rectangle x1="13.422628125" y1="38.914071875" x2="14.116046875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.4391375" y1="36.916359375" x2="14.0995375" y2="36.949378125" layer="200" rot="R270"/>
<rectangle x1="13.455646875" y1="35.90925" x2="14.083028125" y2="35.94226875" layer="200" rot="R270"/>
<rectangle x1="12.7787375" y1="33.581340625" x2="14.7599375" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="30.7251125" x2="14.809465625" y2="30.75813125" layer="200" rot="R270"/>
<rectangle x1="13.4391375" y1="52.006503125" x2="14.165575" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.4391375" y1="48.605440625" x2="14.165575" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.455646875" y1="45.518071875" x2="14.149065625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.4391375" y1="43.619421875" x2="14.165575" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.72920625" y1="41.588690625" x2="14.87550625" y2="41.621709375" layer="200" rot="R270"/>
<rectangle x1="13.455646875" y1="38.914071875" x2="14.149065625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.455646875" y1="36.932871875" x2="14.149065625" y2="36.965890625" layer="200" rot="R270"/>
<rectangle x1="13.47215625" y1="35.892740625" x2="14.13255625" y2="35.925759375" layer="200" rot="R270"/>
<rectangle x1="12.81175625" y1="33.581340625" x2="14.79295625" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.72920625" y1="30.692090625" x2="14.87550625" y2="30.725109375" layer="200" rot="R270"/>
<rectangle x1="13.472159375" y1="52.006503125" x2="14.198596875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.472159375" y1="48.605440625" x2="14.198596875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.48866875" y1="45.518071875" x2="14.1820875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.472159375" y1="43.619421875" x2="14.198596875" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="41.555671875" x2="14.941546875" y2="41.588690625" layer="200" rot="R270"/>
<rectangle x1="13.48866875" y1="38.914071875" x2="14.1820875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.505178125" y1="36.94938125" x2="14.165578125" y2="36.9824" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="35.87623125" x2="14.14906875" y2="35.90925" layer="200" rot="R270"/>
<rectangle x1="12.844778125" y1="33.581340625" x2="14.825978125" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.7127" y1="30.6425625" x2="14.95805625" y2="30.67558125" layer="200" rot="R270"/>
<rectangle x1="13.505178125" y1="52.006503125" x2="14.231615625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.505178125" y1="48.605440625" x2="14.231615625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="45.518071875" x2="14.21510625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.505178125" y1="43.619421875" x2="14.231615625" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.72920625" y1="41.52265" x2="15.0075875" y2="41.55566875" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="38.914071875" x2="14.21510625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="36.965890625" x2="14.21510625" y2="36.998909375" layer="200" rot="R270"/>
<rectangle x1="13.538196875" y1="35.859721875" x2="14.198596875" y2="35.892740625" layer="200" rot="R270"/>
<rectangle x1="12.877796875" y1="33.581340625" x2="14.858996875" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.72920625" y1="30.62605" x2="15.0075875" y2="30.65906875" layer="200" rot="R270"/>
<rectangle x1="13.5382" y1="52.006503125" x2="14.2646375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.5382" y1="48.605440625" x2="14.2646375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.554709375" y1="45.518071875" x2="14.248128125" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.5382" y1="43.619421875" x2="14.2646375" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="41.48963125" x2="15.073628125" y2="41.52265" layer="200" rot="R270"/>
<rectangle x1="13.554709375" y1="38.914071875" x2="14.248128125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.57121875" y1="36.9824" x2="14.23161875" y2="37.01541875" layer="200" rot="R270"/>
<rectangle x1="13.58773125" y1="35.8432125" x2="14.21510625" y2="35.87623125" layer="200" rot="R270"/>
<rectangle x1="12.91081875" y1="33.581340625" x2="14.89201875" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.729209375" y1="30.59303125" x2="15.073628125" y2="30.62605" layer="200" rot="R270"/>
<rectangle x1="13.57121875" y1="52.006503125" x2="14.29765625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.57121875" y1="48.605440625" x2="14.29765625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.587728125" y1="45.518071875" x2="14.281146875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.57121875" y1="43.619421875" x2="14.29765625" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="41.473121875" x2="15.12315625" y2="41.506140625" layer="200" rot="R270"/>
<rectangle x1="13.587728125" y1="38.914071875" x2="14.281146875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.587728125" y1="36.9989125" x2="14.281146875" y2="37.03193125" layer="200" rot="R270"/>
<rectangle x1="13.6042375" y1="35.8267" x2="14.2646375" y2="35.85971875" layer="200" rot="R270"/>
<rectangle x1="12.9438375" y1="33.581340625" x2="14.9250375" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.74571875" y1="30.576521875" x2="15.12315625" y2="30.609540625" layer="200" rot="R270"/>
<rectangle x1="13.6042375" y1="52.006503125" x2="14.330675" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.6042375" y1="48.605440625" x2="14.330675" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.620746875" y1="45.518071875" x2="14.314165625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.6042375" y1="43.619421875" x2="14.330675" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="12.762228125" y1="41.4566125" x2="15.172684375" y2="41.48963125" layer="200" rot="R270"/>
<rectangle x1="13.620746875" y1="38.914071875" x2="14.314165625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.620746875" y1="37.03193125" x2="14.314165625" y2="37.06495" layer="200" rot="R270"/>
<rectangle x1="13.63725625" y1="35.79368125" x2="14.29765625" y2="35.8267" layer="200" rot="R270"/>
<rectangle x1="12.97685625" y1="33.581340625" x2="14.95805625" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="12.762228125" y1="30.5600125" x2="15.172684375" y2="30.59303125" layer="200" rot="R270"/>
<rectangle x1="13.637259375" y1="52.006503125" x2="14.363696875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.637259375" y1="48.605440625" x2="14.363696875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.65376875" y1="45.518071875" x2="14.3471875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.637259375" y1="43.619421875" x2="14.363696875" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="13.637259375" y1="42.298621875" x2="14.363696875" y2="42.331640625" layer="200" rot="R270"/>
<rectangle x1="13.505178125" y1="40.713659375" x2="14.495778125" y2="40.746678125" layer="200" rot="R270"/>
<rectangle x1="13.65376875" y1="38.914071875" x2="14.3471875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.65376875" y1="37.03193125" x2="14.3471875" y2="37.06495" layer="200" rot="R270"/>
<rectangle x1="13.670278125" y1="35.79368125" x2="14.330678125" y2="35.8267" layer="200" rot="R270"/>
<rectangle x1="13.009878125" y1="33.581340625" x2="14.991078125" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="13.637259375" y1="31.402021875" x2="14.363696875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="29.80055" x2="14.47926875" y2="29.83356875" layer="200" rot="R270"/>
<rectangle x1="13.670278125" y1="52.006503125" x2="14.396715625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.670278125" y1="48.605440625" x2="14.396715625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.6867875" y1="45.518071875" x2="14.38020625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.670278125" y1="43.619421875" x2="14.396715625" y2="43.652440625" layer="200" rot="R270"/>
<rectangle x1="13.6867875" y1="42.31513125" x2="14.38020625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.653765625" y1="40.598090625" x2="14.413228125" y2="40.631109375" layer="200" rot="R270"/>
<rectangle x1="13.6867875" y1="38.914071875" x2="14.38020625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.6867875" y1="37.06495" x2="14.38020625" y2="37.09796875" layer="200" rot="R270"/>
<rectangle x1="13.703296875" y1="35.760659375" x2="14.363696875" y2="35.793678125" layer="200" rot="R270"/>
<rectangle x1="13.042896875" y1="33.581340625" x2="15.024096875" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="13.670278125" y1="31.402021875" x2="14.396715625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.653765625" y1="29.701490625" x2="14.413228125" y2="29.734509375" layer="200" rot="R270"/>
<rectangle x1="13.7033" y1="52.006503125" x2="14.4297375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.7033" y1="48.605440625" x2="14.4297375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.719809375" y1="45.518071875" x2="14.413228125" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.686790625" y1="43.63593125" x2="14.446246875" y2="43.66895" layer="200" rot="R270"/>
<rectangle x1="13.719809375" y1="42.31513125" x2="14.413228125" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.686790625" y1="40.565071875" x2="14.446246875" y2="40.598090625" layer="200" rot="R270"/>
<rectangle x1="13.719809375" y1="38.914071875" x2="14.413228125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.7033" y1="37.0814625" x2="14.4297375" y2="37.11448125" layer="200" rot="R270"/>
<rectangle x1="13.719809375" y1="35.74415" x2="14.413228125" y2="35.77716875" layer="200" rot="R270"/>
<rectangle x1="13.07591875" y1="33.581340625" x2="15.05711875" y2="33.614359375" layer="200" rot="R270"/>
<rectangle x1="13.7033" y1="31.402021875" x2="14.4297375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.686790625" y1="29.668471875" x2="14.446246875" y2="29.701490625" layer="200" rot="R270"/>
<rectangle x1="13.73631875" y1="52.006503125" x2="14.46275625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.73631875" y1="48.605440625" x2="14.46275625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="45.518071875" x2="14.446246875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.73631875" y1="43.652440625" x2="14.46275625" y2="43.685459375" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="42.31513125" x2="14.446246875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.73631875" y1="40.5485625" x2="14.46275625" y2="40.58158125" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="38.914071875" x2="14.446246875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="37.097971875" x2="14.446246875" y2="37.130990625" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="35.727640625" x2="14.4297375" y2="35.760659375" layer="200" rot="R270"/>
<rectangle x1="13.73631875" y1="34.208721875" x2="14.46275625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.73631875" y1="31.402021875" x2="14.46275625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="29.63545" x2="14.446246875" y2="29.66846875" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="52.006503125" x2="14.495775" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="48.605440625" x2="14.495775" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.785846875" y1="45.518071875" x2="14.479265625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="43.652440625" x2="14.495775" y2="43.685459375" layer="200" rot="R270"/>
<rectangle x1="13.785846875" y1="42.31513125" x2="14.479265625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.785846875" y1="40.53205" x2="14.479265625" y2="40.56506875" layer="200" rot="R270"/>
<rectangle x1="13.785846875" y1="38.914071875" x2="14.479265625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.785846875" y1="37.130990625" x2="14.479265625" y2="37.164009375" layer="200" rot="R270"/>
<rectangle x1="13.80235625" y1="35.694621875" x2="14.46275625" y2="35.727640625" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="34.208721875" x2="14.495775" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="31.402021875" x2="14.495775" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.7693375" y1="29.618940625" x2="14.495775" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="52.006503125" x2="14.528796875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.422628125" y1="50.10785" x2="14.908528125" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="48.605440625" x2="14.528796875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.81886875" y1="45.518071875" x2="14.5122875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="43.652440625" x2="14.528796875" y2="43.685459375" layer="200" rot="R270"/>
<rectangle x1="13.81886875" y1="42.31513125" x2="14.5122875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="40.515540625" x2="14.528796875" y2="40.548559375" layer="200" rot="R270"/>
<rectangle x1="13.81886875" y1="38.914071875" x2="14.5122875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="37.147503125" x2="14.528796875" y2="37.180521875" layer="200" rot="R270"/>
<rectangle x1="13.81886875" y1="35.6781125" x2="14.5122875" y2="35.71113125" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="34.208721875" x2="14.528796875" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="31.402021875" x2="14.528796875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.802359375" y1="29.618940625" x2="14.528796875" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="52.006503125" x2="14.561815625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.455646875" y1="50.10785" x2="14.941546875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="48.605440625" x2="14.561815625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="45.518071875" x2="14.54530625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="43.6854625" x2="14.561815625" y2="43.71848125" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="42.31513125" x2="14.54530625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="40.515540625" x2="14.561815625" y2="40.548559375" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="38.914071875" x2="14.54530625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="37.1640125" x2="14.54530625" y2="37.19703125" layer="200" rot="R270"/>
<rectangle x1="13.868396875" y1="35.6616" x2="14.528796875" y2="35.69461875" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="34.208721875" x2="14.561815625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="31.402021875" x2="14.561815625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.835378125" y1="29.618940625" x2="14.561815625" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="52.006503125" x2="14.5948375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.48866875" y1="50.10785" x2="14.97456875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="48.605440625" x2="14.5948375" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.884909375" y1="45.518071875" x2="14.578328125" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="43.6854625" x2="14.5948375" y2="43.71848125" layer="200" rot="R270"/>
<rectangle x1="13.884909375" y1="42.31513125" x2="14.578328125" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="40.515540625" x2="14.5948375" y2="40.548559375" layer="200" rot="R270"/>
<rectangle x1="13.884909375" y1="38.914071875" x2="14.578328125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.884909375" y1="37.19703125" x2="14.578328125" y2="37.23005" layer="200" rot="R270"/>
<rectangle x1="13.884909375" y1="35.645090625" x2="14.578328125" y2="35.678109375" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="34.208721875" x2="14.5948375" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="31.402021875" x2="14.5948375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.8684" y1="29.618940625" x2="14.5948375" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="52.006503125" x2="14.62785625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="50.10785" x2="15.0075875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="48.605440625" x2="14.62785625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.917928125" y1="45.518071875" x2="14.611346875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="43.71848125" x2="14.62785625" y2="43.7515" layer="200" rot="R270"/>
<rectangle x1="13.917928125" y1="42.31513125" x2="14.611346875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="40.515540625" x2="14.62785625" y2="40.548559375" layer="200" rot="R270"/>
<rectangle x1="13.917928125" y1="38.914071875" x2="14.611346875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.917928125" y1="37.19703125" x2="14.611346875" y2="37.23005" layer="200" rot="R270"/>
<rectangle x1="13.917928125" y1="35.612071875" x2="14.611346875" y2="35.645090625" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="34.208721875" x2="14.62785625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="31.402021875" x2="14.62785625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.90141875" y1="29.618940625" x2="14.62785625" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="13.9344375" y1="52.006503125" x2="14.660875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.55470625" y1="50.10785" x2="15.04060625" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="13.9344375" y1="48.605440625" x2="14.660875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.950946875" y1="45.518071875" x2="14.644365625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.901415625" y1="43.7515" x2="14.693896875" y2="43.78451875" layer="200" rot="R270"/>
<rectangle x1="13.950946875" y1="42.31513125" x2="14.644365625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.950946875" y1="40.53205" x2="14.644365625" y2="40.56506875" layer="200" rot="R270"/>
<rectangle x1="13.950946875" y1="38.914071875" x2="14.644365625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.950946875" y1="37.23005" x2="14.644365625" y2="37.26306875" layer="200" rot="R270"/>
<rectangle x1="13.96745625" y1="35.595559375" x2="14.62785625" y2="35.628578125" layer="200" rot="R270"/>
<rectangle x1="13.9344375" y1="34.208721875" x2="14.660875" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.9344375" y1="31.402021875" x2="14.660875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.9344375" y1="29.618940625" x2="14.660875" y2="29.651959375" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="52.006503125" x2="14.693896875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.587728125" y1="50.10785" x2="15.073628125" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="48.605440625" x2="14.693896875" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="13.98396875" y1="45.518071875" x2="14.6773875" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.934440625" y1="43.784521875" x2="14.726915625" y2="43.817540625" layer="200" rot="R270"/>
<rectangle x1="13.98396875" y1="42.31513125" x2="14.6773875" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="40.5485625" x2="14.693896875" y2="40.58158125" layer="200" rot="R270"/>
<rectangle x1="13.98396875" y1="38.914071875" x2="14.6773875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="37.2465625" x2="14.693896875" y2="37.27958125" layer="200" rot="R270"/>
<rectangle x1="13.98396875" y1="35.57905" x2="14.6773875" y2="35.61206875" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="34.208721875" x2="14.693896875" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="31.402021875" x2="14.693896875" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.967459375" y1="29.6519625" x2="14.693896875" y2="29.68498125" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="52.006503125" x2="14.726915625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.620746875" y1="50.10785" x2="15.106646875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="48.605440625" x2="14.726915625" y2="48.638459375" layer="200" rot="R270"/>
<rectangle x1="14.0169875" y1="45.518071875" x2="14.71040625" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.9344375" y1="43.8505625" x2="14.79295625" y2="43.88358125" layer="200" rot="R270"/>
<rectangle x1="14.0169875" y1="42.31513125" x2="14.71040625" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="13.98396875" y1="40.565071875" x2="14.743425" y2="40.598090625" layer="200" rot="R270"/>
<rectangle x1="14.0169875" y1="38.914071875" x2="14.71040625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.0169875" y1="37.263071875" x2="14.71040625" y2="37.296090625" layer="200" rot="R270"/>
<rectangle x1="14.033496875" y1="35.562540625" x2="14.693896875" y2="35.595559375" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="34.208721875" x2="14.726915625" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="31.402021875" x2="14.726915625" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="13.98396875" y1="29.668471875" x2="14.743425" y2="29.701490625" layer="200" rot="R270"/>
<rectangle x1="14.0335" y1="52.006503125" x2="14.7599375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.65376875" y1="50.10785" x2="15.13966875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.050009375" y1="48.58893125" x2="14.743428125" y2="48.62195" layer="200" rot="R270"/>
<rectangle x1="14.050009375" y1="45.518071875" x2="14.743428125" y2="45.551090625" layer="200" rot="R270"/>
<rectangle x1="13.934440625" y1="43.916603125" x2="14.858996875" y2="43.949621875" layer="200" rot="R270"/>
<rectangle x1="14.050009375" y1="42.31513125" x2="14.743428125" y2="42.34815" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="40.6146" x2="14.792959375" y2="40.64761875" layer="200" rot="R270"/>
<rectangle x1="14.050009375" y1="38.914071875" x2="14.743428125" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.050009375" y1="37.296090625" x2="14.743428125" y2="37.329109375" layer="200" rot="R270"/>
<rectangle x1="14.06651875" y1="35.529521875" x2="14.72691875" y2="35.562540625" layer="200" rot="R270"/>
<rectangle x1="14.0335" y1="34.208721875" x2="14.7599375" y2="34.241740625" layer="200" rot="R270"/>
<rectangle x1="14.0335" y1="31.402021875" x2="14.7599375" y2="31.435040625" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="29.718" x2="14.792959375" y2="29.75101875" layer="200" rot="R270"/>
<rectangle x1="14.06651875" y1="52.006503125" x2="14.79295625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.6867875" y1="50.10785" x2="15.1726875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.083028125" y1="48.58893125" x2="14.776446875" y2="48.62195" layer="200" rot="R270"/>
<rectangle x1="13.24101875" y1="44.6760625" x2="15.61845625" y2="44.70908125" layer="200" rot="R270"/>
<rectangle x1="13.224509375" y1="41.4566125" x2="15.634965625" y2="41.48963125" layer="200" rot="R270"/>
<rectangle x1="14.083028125" y1="38.914071875" x2="14.776446875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.06651875" y1="37.312603125" x2="14.79295625" y2="37.345621875" layer="200" rot="R270"/>
<rectangle x1="14.083028125" y1="35.5130125" x2="14.776446875" y2="35.54603125" layer="200" rot="R270"/>
<rectangle x1="13.32356875" y1="33.465771875" x2="15.53590625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.207996875" y1="30.5435" x2="15.651478125" y2="30.57651875" layer="200" rot="R270"/>
<rectangle x1="14.0995375" y1="52.006503125" x2="14.825975" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.71980625" y1="50.10785" x2="15.20570625" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.0995375" y1="48.572421875" x2="14.825975" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="13.290546875" y1="44.692571875" x2="15.634965625" y2="44.725590625" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="41.4566125" x2="15.667984375" y2="41.48963125" layer="200" rot="R270"/>
<rectangle x1="13.6867875" y1="38.914071875" x2="15.238725" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.116046875" y1="37.3291125" x2="14.809465625" y2="37.36213125" layer="200" rot="R270"/>
<rectangle x1="14.13255625" y1="35.4965" x2="14.79295625" y2="35.52951875" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="33.465771875" x2="15.568925" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.257528125" y1="30.5600125" x2="15.667984375" y2="30.59303125" layer="200" rot="R270"/>
<rectangle x1="14.132559375" y1="52.006503125" x2="14.858996875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="50.10785" x2="15.238728125" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.132559375" y1="48.572421875" x2="14.858996875" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="44.725590625" x2="15.63496875" y2="44.758609375" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="41.473121875" x2="15.684496875" y2="41.506140625" layer="200" rot="R270"/>
<rectangle x1="13.719809375" y1="38.914071875" x2="15.271746875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.132559375" y1="37.345621875" x2="14.858996875" y2="37.378640625" layer="200" rot="R270"/>
<rectangle x1="14.14906875" y1="35.479990625" x2="14.8424875" y2="35.513009375" layer="200" rot="R270"/>
<rectangle x1="13.389609375" y1="33.465771875" x2="15.601946875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.307059375" y1="30.576521875" x2="15.684496875" y2="30.609540625" layer="200" rot="R270"/>
<rectangle x1="14.165578125" y1="52.006503125" x2="14.892015625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.785846875" y1="50.10785" x2="15.271746875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.165578125" y1="48.572421875" x2="14.892015625" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="13.40611875" y1="44.742103125" x2="15.651475" y2="44.775121875" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="41.48963125" x2="15.70100625" y2="41.52265" layer="200" rot="R270"/>
<rectangle x1="13.752828125" y1="38.914071875" x2="15.304765625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.1820875" y1="37.36213125" x2="14.87550625" y2="37.39515" layer="200" rot="R270"/>
<rectangle x1="14.1820875" y1="35.446971875" x2="14.87550625" y2="35.479990625" layer="200" rot="R270"/>
<rectangle x1="13.422628125" y1="33.465771875" x2="15.634965625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.3565875" y1="30.59303125" x2="15.70100625" y2="30.62605" layer="200" rot="R270"/>
<rectangle x1="14.1986" y1="52.006503125" x2="14.9250375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.81886875" y1="50.10785" x2="15.30476875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.1986" y1="48.572421875" x2="14.9250375" y2="48.605440625" layer="200" rot="R270"/>
<rectangle x1="13.48866875" y1="44.79163125" x2="15.63496875" y2="44.82465" layer="200" rot="R270"/>
<rectangle x1="13.422628125" y1="41.52265" x2="15.701009375" y2="41.55566875" layer="200" rot="R270"/>
<rectangle x1="13.78585" y1="38.914071875" x2="15.3377875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.215109375" y1="37.39515" x2="14.908528125" y2="37.42816875" layer="200" rot="R270"/>
<rectangle x1="14.23161875" y1="35.430459375" x2="14.89201875" y2="35.463478125" layer="200" rot="R270"/>
<rectangle x1="13.45565" y1="33.465771875" x2="15.6679875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.422628125" y1="30.62605" x2="15.701009375" y2="30.65906875" layer="200" rot="R270"/>
<rectangle x1="14.23161875" y1="52.006503125" x2="14.95805625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="50.10785" x2="15.3377875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.248128125" y1="48.5559125" x2="14.941546875" y2="48.58893125" layer="200" rot="R270"/>
<rectangle x1="13.554709375" y1="44.824653125" x2="15.634965625" y2="44.857671875" layer="200" rot="R270"/>
<rectangle x1="13.472159375" y1="41.5391625" x2="15.717515625" y2="41.57218125" layer="200" rot="R270"/>
<rectangle x1="13.81886875" y1="38.914071875" x2="15.37080625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.23161875" y1="37.4116625" x2="14.95805625" y2="37.44468125" layer="200" rot="R270"/>
<rectangle x1="14.248128125" y1="35.41395" x2="14.941546875" y2="35.44696875" layer="200" rot="R270"/>
<rectangle x1="13.48866875" y1="33.465771875" x2="15.70100625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.472159375" y1="30.6425625" x2="15.717515625" y2="30.67558125" layer="200" rot="R270"/>
<rectangle x1="14.2646375" y1="52.006503125" x2="14.991075" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="13.88490625" y1="50.10785" x2="15.37080625" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="14.2646375" y1="48.539403125" x2="14.991075" y2="48.572421875" layer="200" rot="R270"/>
<rectangle x1="13.63725625" y1="44.87418125" x2="15.61845625" y2="44.9072" layer="200" rot="R270"/>
<rectangle x1="13.55470625" y1="41.588690625" x2="15.70100625" y2="41.621709375" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="38.914071875" x2="15.403825" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.281146875" y1="37.428171875" x2="14.974565625" y2="37.461190625" layer="200" rot="R270"/>
<rectangle x1="14.281146875" y1="35.38093125" x2="14.974565625" y2="35.41395" layer="200" rot="R270"/>
<rectangle x1="13.5216875" y1="33.465771875" x2="15.734025" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.55470625" y1="30.692090625" x2="15.70100625" y2="30.725109375" layer="200" rot="R270"/>
<rectangle x1="14.297659375" y1="52.006503125" x2="15.024096875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.39671875" y1="50.586640625" x2="14.9250375" y2="50.619659375" layer="200" rot="R270"/>
<rectangle x1="14.297659375" y1="48.539403125" x2="15.024096875" y2="48.572421875" layer="200" rot="R270"/>
<rectangle x1="14.61135" y1="46.93793125" x2="14.71040625" y2="46.97095" layer="200" rot="R270"/>
<rectangle x1="13.719809375" y1="44.9237125" x2="15.601946875" y2="44.95673125" layer="200" rot="R270"/>
<rectangle x1="13.62075" y1="41.6217125" x2="15.70100625" y2="41.65473125" layer="200" rot="R270"/>
<rectangle x1="13.884909375" y1="38.914071875" x2="15.436846875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.297659375" y1="37.44468125" x2="15.024096875" y2="37.4777" layer="200" rot="R270"/>
<rectangle x1="14.31416875" y1="35.38093125" x2="15.0075875" y2="35.41395" layer="200" rot="R270"/>
<rectangle x1="13.554709375" y1="33.465771875" x2="15.767046875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.62075" y1="30.7251125" x2="15.70100625" y2="30.75813125" layer="200" rot="R270"/>
<rectangle x1="14.330678125" y1="52.006503125" x2="15.057115625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.4297375" y1="50.553621875" x2="14.95805625" y2="50.586640625" layer="200" rot="R270"/>
<rectangle x1="14.330678125" y1="48.539403125" x2="15.057115625" y2="48.572421875" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="46.921421875" x2="14.759934375" y2="46.954440625" layer="200" rot="R270"/>
<rectangle x1="13.8518875" y1="45.022771875" x2="15.53590625" y2="45.055790625" layer="200" rot="R270"/>
<rectangle x1="13.71980625" y1="41.68775" x2="15.6679875" y2="41.72076875" layer="200" rot="R270"/>
<rectangle x1="13.917928125" y1="38.914071875" x2="15.469865625" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.330678125" y1="37.477703125" x2="15.057115625" y2="37.510721875" layer="200" rot="R270"/>
<rectangle x1="14.3471875" y1="35.3479125" x2="15.04060625" y2="35.38093125" layer="200" rot="R270"/>
<rectangle x1="13.587728125" y1="33.465771875" x2="15.800065625" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.71980625" y1="30.79115" x2="15.6679875" y2="30.82416875" layer="200" rot="R270"/>
<rectangle x1="14.3637" y1="52.006503125" x2="15.0901375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.44625" y1="50.5371125" x2="15.0075875" y2="50.57013125" layer="200" rot="R270"/>
<rectangle x1="14.3471875" y1="48.522890625" x2="15.10665" y2="48.555909375" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="46.8884" x2="14.825978125" y2="46.92141875" layer="200" rot="R270"/>
<rectangle x1="14.000478125" y1="45.138340625" x2="15.453359375" y2="45.171359375" layer="200" rot="R270"/>
<rectangle x1="13.851890625" y1="41.7868125" x2="15.601946875" y2="41.81983125" layer="200" rot="R270"/>
<rectangle x1="13.95095" y1="38.914071875" x2="15.5028875" y2="38.947090625" layer="200" rot="R270"/>
<rectangle x1="14.380209375" y1="37.4942125" x2="15.073628125" y2="37.52723125" layer="200" rot="R270"/>
<rectangle x1="14.39671875" y1="35.3314" x2="15.05711875" y2="35.36441875" layer="200" rot="R270"/>
<rectangle x1="13.62075" y1="33.465771875" x2="15.8330875" y2="33.498790625" layer="200" rot="R270"/>
<rectangle x1="13.851890625" y1="30.8902125" x2="15.601946875" y2="30.92323125" layer="200" rot="R270"/>
<rectangle x1="14.39671875" y1="52.006503125" x2="15.12315625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.47926875" y1="50.504090625" x2="15.04060625" y2="50.537109375" layer="200" rot="R270"/>
<rectangle x1="14.39671875" y1="48.50638125" x2="15.12315625" y2="48.5394" layer="200" rot="R270"/>
<rectangle x1="14.64436875" y1="46.871890625" x2="14.87550625" y2="46.904909375" layer="200" rot="R270"/>
<rectangle x1="14.4297375" y1="52.006503125" x2="15.156175" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.5122875" y1="50.471071875" x2="15.073625" y2="50.504090625" layer="200" rot="R270"/>
<rectangle x1="14.4297375" y1="48.50638125" x2="15.156175" y2="48.5394" layer="200" rot="R270"/>
<rectangle x1="14.62785625" y1="46.85538125" x2="14.95805625" y2="46.8884" layer="200" rot="R270"/>
<rectangle x1="14.462759375" y1="52.006503125" x2="15.189196875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.545309375" y1="50.438053125" x2="15.106646875" y2="50.471071875" layer="200" rot="R270"/>
<rectangle x1="14.44625" y1="48.489871875" x2="15.20570625" y2="48.522890625" layer="200" rot="R270"/>
<rectangle x1="14.64436875" y1="46.838871875" x2="15.0075875" y2="46.871890625" layer="200" rot="R270"/>
<rectangle x1="14.495778125" y1="52.006503125" x2="15.222215625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.578328125" y1="50.40503125" x2="15.139665625" y2="50.43805" layer="200" rot="R270"/>
<rectangle x1="14.47926875" y1="48.489871875" x2="15.238725" y2="48.522890625" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="46.8223625" x2="15.090134375" y2="46.85538125" layer="200" rot="R270"/>
<rectangle x1="14.5288" y1="52.006503125" x2="15.2552375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.61135" y1="50.3720125" x2="15.1726875" y2="50.40503125" layer="200" rot="R270"/>
<rectangle x1="14.512290625" y1="48.456853125" x2="15.271746875" y2="48.489871875" layer="200" rot="R270"/>
<rectangle x1="14.64436875" y1="46.80585" x2="15.13966875" y2="46.83886875" layer="200" rot="R270"/>
<rectangle x1="14.56181875" y1="52.006503125" x2="15.28825625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.64436875" y1="50.338990625" x2="15.20570625" y2="50.372009375" layer="200" rot="R270"/>
<rectangle x1="14.528796875" y1="48.440340625" x2="15.321278125" y2="48.473359375" layer="200" rot="R270"/>
<rectangle x1="14.62785625" y1="46.789340625" x2="15.22221875" y2="46.822359375" layer="200" rot="R270"/>
<rectangle x1="14.5948375" y1="52.006503125" x2="15.321275" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.6773875" y1="50.305971875" x2="15.238725" y2="50.338990625" layer="200" rot="R270"/>
<rectangle x1="14.561815625" y1="48.440340625" x2="15.354296875" y2="48.473359375" layer="200" rot="R270"/>
<rectangle x1="14.644365625" y1="46.77283125" x2="15.271746875" y2="46.80585" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="52.006503125" x2="15.354296875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.710409375" y1="50.272953125" x2="15.271746875" y2="50.305971875" layer="200" rot="R270"/>
<rectangle x1="14.594840625" y1="48.407321875" x2="15.387315625" y2="48.440340625" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="46.756321875" x2="15.354296875" y2="46.789340625" layer="200" rot="R270"/>
<rectangle x1="14.660878125" y1="52.006503125" x2="15.387315625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.726915625" y1="50.256440625" x2="15.321278125" y2="50.289459375" layer="200" rot="R270"/>
<rectangle x1="14.611346875" y1="48.390809375" x2="15.436846875" y2="48.423828125" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="46.756321875" x2="15.420334375" y2="46.789340625" layer="200" rot="R270"/>
<rectangle x1="14.6939" y1="52.006503125" x2="15.4203375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.759940625" y1="50.223421875" x2="15.354296875" y2="50.256440625" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="48.3743" x2="15.486378125" y2="48.40731875" layer="200" rot="R270"/>
<rectangle x1="14.64436875" y1="46.77283125" x2="15.46986875" y2="46.80585" layer="200" rot="R270"/>
<rectangle x1="14.72691875" y1="52.006503125" x2="15.45335625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.792959375" y1="50.190403125" x2="15.387315625" y2="50.223421875" layer="200" rot="R270"/>
<rectangle x1="14.64436875" y1="48.324771875" x2="15.53590625" y2="48.357790625" layer="200" rot="R270"/>
<rectangle x1="14.6773875" y1="46.80585" x2="15.5028875" y2="46.83886875" layer="200" rot="R270"/>
<rectangle x1="14.7599375" y1="52.006503125" x2="15.486375" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.8424875" y1="50.173890625" x2="15.403825" y2="50.206909375" layer="200" rot="R270"/>
<rectangle x1="14.660878125" y1="48.3082625" x2="15.585434375" y2="48.34128125" layer="200" rot="R270"/>
<rectangle x1="14.6773875" y1="46.838871875" x2="15.568925" y2="46.871890625" layer="200" rot="R270"/>
<rectangle x1="14.792959375" y1="52.006503125" x2="15.519396875" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.875509375" y1="50.140871875" x2="15.436846875" y2="50.173890625" layer="200" rot="R270"/>
<rectangle x1="14.660878125" y1="48.242221875" x2="15.651478125" y2="48.275240625" layer="200" rot="R270"/>
<rectangle x1="14.6773875" y1="46.871890625" x2="15.63496875" y2="46.904909375" layer="200" rot="R270"/>
<rectangle x1="14.825978125" y1="52.006503125" x2="15.552415625" y2="52.039521875" layer="200" rot="R270"/>
<rectangle x1="14.908528125" y1="50.107853125" x2="15.469865625" y2="50.140871875" layer="200" rot="R270"/>
<rectangle x1="14.62785625" y1="48.17618125" x2="15.7505375" y2="48.2092" layer="200" rot="R270"/>
<rectangle x1="14.6773875" y1="46.93793125" x2="15.70100625" y2="46.97095" layer="200" rot="R270"/>
<rectangle x1="14.462759375" y1="52.0065" x2="15.981678125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="14.94155" y1="50.07483125" x2="15.5028875" y2="50.10785" layer="200" rot="R270"/>
<rectangle x1="14.08303125" y1="47.5653125" x2="16.36140625" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="14.495778125" y1="52.0065" x2="16.014696875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="14.97456875" y1="50.0418125" x2="15.53590625" y2="50.07483125" layer="200" rot="R270"/>
<rectangle x1="14.132559375" y1="47.581821875" x2="16.377915625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="6.9342" y1="37.5767625" x2="23.576275" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.528796875" y1="52.0065" x2="16.047715625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.0075875" y1="50.008790625" x2="15.568925" y2="50.041809375" layer="200" rot="R270"/>
<rectangle x1="14.165578125" y1="47.581821875" x2="16.410934375" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="6.96721875" y1="37.5767625" x2="23.60929375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.56181875" y1="52.0065" x2="16.0807375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.040609375" y1="49.975771875" x2="15.601946875" y2="50.008790625" layer="200" rot="R270"/>
<rectangle x1="14.23161875" y1="47.581821875" x2="16.4109375" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="7.000240625" y1="37.5767625" x2="23.642315625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.5948375" y1="52.0065" x2="16.11375625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.073628125" y1="49.942753125" x2="15.634965625" y2="49.975771875" layer="200" rot="R270"/>
<rectangle x1="14.281146875" y1="47.565309375" x2="16.427446875" y2="47.598328125" layer="200" rot="R270"/>
<rectangle x1="7.033259375" y1="37.5767625" x2="23.675334375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.627859375" y1="52.0065" x2="16.146778125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.0901375" y1="49.926240625" x2="15.6845" y2="49.959259375" layer="200" rot="R270"/>
<rectangle x1="14.33068125" y1="47.581821875" x2="16.44395625" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="7.06628125" y1="37.5767625" x2="23.70835625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.660878125" y1="52.0065" x2="16.179796875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.13966875" y1="49.90973125" x2="15.70100625" y2="49.94275" layer="200" rot="R270"/>
<rectangle x1="14.380209375" y1="47.5653125" x2="16.460465625" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.0993" y1="37.5767625" x2="23.741375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.693896875" y1="52.0065" x2="16.212815625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.1726875" y1="49.8767125" x2="15.734025" y2="49.90973125" layer="200" rot="R270"/>
<rectangle x1="14.446246875" y1="47.5653125" x2="16.460465625" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.13231875" y1="37.5767625" x2="23.77439375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.72691875" y1="52.0065" x2="16.2458375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.205709375" y1="49.843690625" x2="15.767046875" y2="49.876709375" layer="200" rot="R270"/>
<rectangle x1="14.495778125" y1="47.581821875" x2="16.476978125" y2="47.614840625" layer="200" rot="R270"/>
<rectangle x1="7.165340625" y1="37.5767625" x2="23.807415625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.7599375" y1="52.0065" x2="16.27885625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.2552375" y1="49.82718125" x2="15.78355625" y2="49.8602" layer="200" rot="R270"/>
<rectangle x1="14.545309375" y1="47.5653125" x2="16.493484375" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.198359375" y1="37.5767625" x2="23.840434375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.792959375" y1="52.0065" x2="16.311878125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.288259375" y1="49.7941625" x2="15.816578125" y2="49.82718125" layer="200" rot="R270"/>
<rectangle x1="14.61135" y1="47.5653125" x2="16.4934875" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.23138125" y1="37.5767625" x2="23.87345625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.825978125" y1="52.0065" x2="16.344896875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.3377875" y1="49.77765" x2="15.8330875" y2="49.81066875" layer="200" rot="R270"/>
<rectangle x1="14.6773875" y1="47.565309375" x2="16.4934875" y2="47.598328125" layer="200" rot="R270"/>
<rectangle x1="7.2644" y1="37.5767625" x2="23.906475" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.858996875" y1="52.0065" x2="16.377915625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.354296875" y1="49.761140625" x2="15.882615625" y2="49.794159375" layer="200" rot="R270"/>
<rectangle x1="14.743428125" y1="47.5653125" x2="16.493484375" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.29741875" y1="37.5767625" x2="23.93949375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.89201875" y1="52.0065" x2="16.4109375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.403828125" y1="49.74463125" x2="15.899128125" y2="49.77765" layer="200" rot="R270"/>
<rectangle x1="14.80946875" y1="47.5653125" x2="16.4934875" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.330440625" y1="37.5767625" x2="23.972515625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.9250375" y1="52.0065" x2="16.44395625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.4203375" y1="49.728121875" x2="15.94865625" y2="49.761140625" layer="200" rot="R270"/>
<rectangle x1="14.875509375" y1="47.5653125" x2="16.493484375" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.363459375" y1="37.5767625" x2="24.005534375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.958059375" y1="52.0065" x2="16.476978125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.46986875" y1="49.711609375" x2="15.96516875" y2="49.744628125" layer="200" rot="R270"/>
<rectangle x1="14.94155" y1="47.5653125" x2="16.4934875" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.39648125" y1="37.5767625" x2="24.03855625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="14.991078125" y1="52.0065" x2="16.509996875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.5028875" y1="49.711609375" x2="15.9981875" y2="49.744628125" layer="200" rot="R270"/>
<rectangle x1="15.0075875" y1="47.565309375" x2="16.4934875" y2="47.598328125" layer="200" rot="R270"/>
<rectangle x1="7.4295" y1="37.5767625" x2="24.071575" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="15.024096875" y1="52.0065" x2="16.543015625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.53590625" y1="49.678590625" x2="16.03120625" y2="49.711609375" layer="200" rot="R270"/>
<rectangle x1="15.073628125" y1="47.5653125" x2="16.493484375" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.46251875" y1="37.5767625" x2="24.10459375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="15.05711875" y1="52.0065" x2="16.5760375" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.568928125" y1="49.678590625" x2="16.064228125" y2="49.711609375" layer="200" rot="R270"/>
<rectangle x1="15.172690625" y1="47.5653125" x2="16.460465625" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="7.495540625" y1="37.5767625" x2="24.137615625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="15.0901375" y1="52.0065" x2="16.60905625" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.61845625" y1="49.66208125" x2="16.0807375" y2="49.6951" layer="200" rot="R270"/>
<rectangle x1="15.2552375" y1="47.5488" x2="16.44395625" y2="47.58181875" layer="200" rot="R270"/>
<rectangle x1="7.528559375" y1="37.5767625" x2="24.170634375" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="15.123159375" y1="52.0065" x2="16.642078125" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.651478125" y1="49.66208125" x2="16.113759375" y2="49.6951" layer="200" rot="R270"/>
<rectangle x1="15.3543" y1="47.548803125" x2="16.4109375" y2="47.581821875" layer="200" rot="R270"/>
<rectangle x1="7.56158125" y1="37.5767625" x2="24.20365625" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="15.156178125" y1="52.0065" x2="16.675096875" y2="52.03951875" layer="200" rot="R270"/>
<rectangle x1="15.684496875" y1="49.66208125" x2="16.146778125" y2="49.6951" layer="200" rot="R270"/>
<rectangle x1="15.453359375" y1="47.548803125" x2="16.377915625" y2="47.581821875" layer="200" rot="R270"/>
<rectangle x1="7.5946" y1="37.5767625" x2="24.236675" y2="37.60978125" layer="200" rot="R270"/>
<rectangle x1="15.70100625" y1="49.645571875" x2="16.19630625" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.601946875" y1="47.5653125" x2="16.295365625" y2="47.59833125" layer="200" rot="R270"/>
<rectangle x1="15.734028125" y1="49.645571875" x2="16.229328125" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.783559375" y1="47.548803125" x2="16.179796875" y2="47.581821875" layer="200" rot="R270"/>
<rectangle x1="15.767046875" y1="49.645571875" x2="16.262346875" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="16.0147" y1="50.520603125" x2="16.0807375" y2="50.553621875" layer="200" rot="R270"/>
<rectangle x1="15.80006875" y1="49.645571875" x2="16.29536875" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.9981875" y1="50.57013125" x2="16.1632875" y2="50.60315" layer="200" rot="R270"/>
<rectangle x1="15.8330875" y1="49.645571875" x2="16.3283875" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.9981875" y1="50.57013125" x2="16.229325" y2="50.60315" layer="200" rot="R270"/>
<rectangle x1="15.86610625" y1="49.645571875" x2="16.36140625" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.981678125" y1="50.619659375" x2="16.311878125" y2="50.652678125" layer="200" rot="R270"/>
<rectangle x1="15.899128125" y1="49.645571875" x2="16.394428125" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.9981875" y1="50.636171875" x2="16.36140625" y2="50.669190625" layer="200" rot="R270"/>
<rectangle x1="15.932146875" y1="49.645571875" x2="16.427446875" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="15.981678125" y1="50.65268125" x2="16.443959375" y2="50.6857" layer="200" rot="R270"/>
<rectangle x1="15.96516875" y1="49.645571875" x2="16.46046875" y2="49.678590625" layer="200" rot="R270"/>
<rectangle x1="16.014696875" y1="50.65268125" x2="16.476978125" y2="50.6857" layer="200" rot="R270"/>
<rectangle x1="15.9981875" y1="49.678590625" x2="16.4934875" y2="49.711609375" layer="200" rot="R270"/>
<rectangle x1="16.03120625" y1="50.636171875" x2="16.52650625" y2="50.669190625" layer="200" rot="R270"/>
<rectangle x1="16.014696875" y1="49.6951" x2="16.543015625" y2="49.72811875" layer="200" rot="R270"/>
<rectangle x1="16.064228125" y1="50.60315" x2="16.559528125" y2="50.63616875" layer="200" rot="R270"/>
<rectangle x1="16.04771875" y1="49.6951" x2="16.5760375" y2="49.72811875" layer="200" rot="R270"/>
<rectangle x1="16.0807375" y1="50.586640625" x2="16.60905625" y2="50.619659375" layer="200" rot="R270"/>
<rectangle x1="16.04771875" y1="49.728121875" x2="16.642075" y2="49.761140625" layer="200" rot="R270"/>
<rectangle x1="16.09725" y1="50.5371125" x2="16.6585875" y2="50.57013125" layer="200" rot="R270"/>
<rectangle x1="16.04771875" y1="49.761140625" x2="16.70811875" y2="49.794159375" layer="200" rot="R270"/>
<rectangle x1="15.734028125" y1="50.140871875" x2="17.087846875" y2="50.173890625" layer="200" rot="R270"/>
<rectangle x1="15.767046875" y1="50.140871875" x2="17.120865625" y2="50.173890625" layer="200" rot="R270"/>
<rectangle x1="15.833090625" y1="50.140871875" x2="17.120865625" y2="50.173890625" layer="200" rot="R270"/>
<rectangle x1="15.88261875" y1="50.1243625" x2="17.137375" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="15.915640625" y1="50.1243625" x2="17.170396875" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="15.981678125" y1="50.1243625" x2="17.170396875" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="16.04771875" y1="50.1243625" x2="17.17039375" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="16.080740625" y1="50.1243625" x2="17.203415625" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="16.146778125" y1="50.1243625" x2="17.203415625" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="16.21281875" y1="50.124359375" x2="17.20341875" y2="50.157378125" layer="200" rot="R270"/>
<rectangle x1="16.29536875" y1="50.107853125" x2="17.18690625" y2="50.140871875" layer="200" rot="R270"/>
<rectangle x1="16.37791875" y1="50.1243625" x2="17.17039375" y2="50.15738125" layer="200" rot="R270"/>
<rectangle x1="16.46046875" y1="50.10785" x2="17.1538875" y2="50.14086875" layer="200" rot="R270"/>
<rectangle x1="16.559528125" y1="50.107853125" x2="17.120865625" y2="50.140871875" layer="200" rot="R270"/>
<rectangle x1="16.70811875" y1="50.124359375" x2="17.03831875" y2="50.157378125" layer="200" rot="R270"/>
<rectangle x1="65.6971" y1="26.6827" x2="72.1741" y2="26.7081" layer="200"/>
<rectangle x1="65.6971" y1="26.7081" x2="72.1741" y2="26.7335" layer="200"/>
<rectangle x1="65.6971" y1="26.7335" x2="72.1741" y2="26.7589" layer="200"/>
<rectangle x1="65.6971" y1="26.7589" x2="72.1741" y2="26.7843" layer="200"/>
<rectangle x1="65.6971" y1="26.7843" x2="72.1741" y2="26.8097" layer="200"/>
<rectangle x1="67.8307" y1="27.3177" x2="68.0847" y2="27.3431" layer="200"/>
<rectangle x1="69.1007" y1="27.3177" x2="69.3547" y2="27.3431" layer="200"/>
<rectangle x1="67.7291" y1="27.3431" x2="68.1863" y2="27.3685" layer="200"/>
<rectangle x1="69.0245" y1="27.3431" x2="69.4563" y2="27.3685" layer="200"/>
<rectangle x1="69.9389" y1="27.3431" x2="70.7009" y2="27.3685" layer="200"/>
<rectangle x1="67.6529" y1="27.3685" x2="68.2371" y2="27.3939" layer="200"/>
<rectangle x1="68.9483" y1="27.3685" x2="69.5071" y2="27.3939" layer="200"/>
<rectangle x1="69.9389" y1="27.3685" x2="70.7009" y2="27.3939" layer="200"/>
<rectangle x1="67.6021" y1="27.3939" x2="68.2879" y2="27.4193" layer="200"/>
<rectangle x1="68.9229" y1="27.3939" x2="69.5579" y2="27.4193" layer="200"/>
<rectangle x1="69.9389" y1="27.3939" x2="70.7009" y2="27.4193" layer="200"/>
<rectangle x1="67.5767" y1="27.4193" x2="68.3133" y2="27.4447" layer="200"/>
<rectangle x1="68.8721" y1="27.4193" x2="69.5833" y2="27.4447" layer="200"/>
<rectangle x1="69.9389" y1="27.4193" x2="70.7009" y2="27.4447" layer="200"/>
<rectangle x1="67.5513" y1="27.4447" x2="68.3387" y2="27.4701" layer="200"/>
<rectangle x1="68.8467" y1="27.4447" x2="69.6087" y2="27.4701" layer="200"/>
<rectangle x1="69.9389" y1="27.4447" x2="70.7009" y2="27.4701" layer="200"/>
<rectangle x1="67.5005" y1="27.4701" x2="68.3641" y2="27.4955" layer="200"/>
<rectangle x1="68.8213" y1="27.4701" x2="69.6341" y2="27.4955" layer="200"/>
<rectangle x1="69.9389" y1="27.4701" x2="70.7009" y2="27.4955" layer="200"/>
<rectangle x1="67.4751" y1="27.4955" x2="68.3895" y2="27.5209" layer="200"/>
<rectangle x1="68.7959" y1="27.4955" x2="69.6595" y2="27.5209" layer="200"/>
<rectangle x1="69.9389" y1="27.4955" x2="70.7009" y2="27.5209" layer="200"/>
<rectangle x1="67.4751" y1="27.5209" x2="68.4149" y2="27.5463" layer="200"/>
<rectangle x1="68.7959" y1="27.5209" x2="69.6595" y2="27.5463" layer="200"/>
<rectangle x1="69.9389" y1="27.5209" x2="70.7009" y2="27.5463" layer="200"/>
<rectangle x1="67.4751" y1="27.5463" x2="68.4149" y2="27.5717" layer="200"/>
<rectangle x1="68.7705" y1="27.5463" x2="69.6849" y2="27.5717" layer="200"/>
<rectangle x1="69.9389" y1="27.5463" x2="70.7009" y2="27.5717" layer="200"/>
<rectangle x1="67.5005" y1="27.5717" x2="67.8815" y2="27.5971" layer="200"/>
<rectangle x1="68.0593" y1="27.5717" x2="68.4403" y2="27.5971" layer="200"/>
<rectangle x1="68.7705" y1="27.5717" x2="69.1515" y2="27.5971" layer="200"/>
<rectangle x1="69.3293" y1="27.5717" x2="69.7103" y2="27.5971" layer="200"/>
<rectangle x1="69.9389" y1="27.5717" x2="70.7009" y2="27.5971" layer="200"/>
<rectangle x1="67.5259" y1="27.5971" x2="67.8053" y2="27.6225" layer="200"/>
<rectangle x1="68.1355" y1="27.5971" x2="68.4403" y2="27.6225" layer="200"/>
<rectangle x1="68.7451" y1="27.5971" x2="69.1007" y2="27.6225" layer="200"/>
<rectangle x1="69.3801" y1="27.5971" x2="69.7103" y2="27.6225" layer="200"/>
<rectangle x1="69.9389" y1="27.5971" x2="70.2183" y2="27.6225" layer="200"/>
<rectangle x1="67.5513" y1="27.6225" x2="67.7545" y2="27.6479" layer="200"/>
<rectangle x1="68.1609" y1="27.6225" x2="68.4403" y2="27.6479" layer="200"/>
<rectangle x1="68.7451" y1="27.6225" x2="69.0753" y2="27.6479" layer="200"/>
<rectangle x1="69.4055" y1="27.6225" x2="69.7103" y2="27.6479" layer="200"/>
<rectangle x1="69.9389" y1="27.6225" x2="70.2183" y2="27.6479" layer="200"/>
<rectangle x1="67.5767" y1="27.6479" x2="67.7037" y2="27.6733" layer="200"/>
<rectangle x1="68.1609" y1="27.6479" x2="68.4657" y2="27.6733" layer="200"/>
<rectangle x1="68.7197" y1="27.6479" x2="69.0499" y2="27.6733" layer="200"/>
<rectangle x1="69.4309" y1="27.6479" x2="69.6849" y2="27.6733" layer="200"/>
<rectangle x1="69.9389" y1="27.6479" x2="70.2183" y2="27.6733" layer="200"/>
<rectangle x1="67.6021" y1="27.6733" x2="67.6783" y2="27.6987" layer="200"/>
<rectangle x1="68.1863" y1="27.6733" x2="68.4657" y2="27.6987" layer="200"/>
<rectangle x1="68.7197" y1="27.6733" x2="69.0245" y2="27.6987" layer="200"/>
<rectangle x1="69.4563" y1="27.6733" x2="69.6341" y2="27.6987" layer="200"/>
<rectangle x1="69.9389" y1="27.6733" x2="70.2183" y2="27.6987" layer="200"/>
<rectangle x1="67.6275" y1="27.6987" x2="67.6529" y2="27.7241" layer="200"/>
<rectangle x1="68.1863" y1="27.6987" x2="68.4657" y2="27.7241" layer="200"/>
<rectangle x1="68.6943" y1="27.6987" x2="69.0245" y2="27.7241" layer="200"/>
<rectangle x1="69.4817" y1="27.6987" x2="69.6087" y2="27.7241" layer="200"/>
<rectangle x1="69.9389" y1="27.6987" x2="70.2183" y2="27.7241" layer="200"/>
<rectangle x1="68.1863" y1="27.7241" x2="68.4657" y2="27.7495" layer="200"/>
<rectangle x1="68.6943" y1="27.7241" x2="68.9991" y2="27.7495" layer="200"/>
<rectangle x1="69.4817" y1="27.7241" x2="69.5579" y2="27.7495" layer="200"/>
<rectangle x1="69.9389" y1="27.7241" x2="70.2183" y2="27.7495" layer="200"/>
<rectangle x1="68.1863" y1="27.7495" x2="68.4657" y2="27.7749" layer="200"/>
<rectangle x1="68.6943" y1="27.7495" x2="68.9991" y2="27.7749" layer="200"/>
<rectangle x1="69.9389" y1="27.7495" x2="70.2183" y2="27.7749" layer="200"/>
<rectangle x1="68.1863" y1="27.7749" x2="68.4657" y2="27.8003" layer="200"/>
<rectangle x1="68.6943" y1="27.7749" x2="68.9737" y2="27.8003" layer="200"/>
<rectangle x1="69.9389" y1="27.7749" x2="70.2183" y2="27.8003" layer="200"/>
<rectangle x1="68.1609" y1="27.8003" x2="68.4657" y2="27.8257" layer="200"/>
<rectangle x1="68.6943" y1="27.8003" x2="68.9737" y2="27.8257" layer="200"/>
<rectangle x1="69.9389" y1="27.8003" x2="70.2183" y2="27.8257" layer="200"/>
<rectangle x1="68.1355" y1="27.8257" x2="68.4657" y2="27.8511" layer="200"/>
<rectangle x1="68.6689" y1="27.8257" x2="68.9737" y2="27.8511" layer="200"/>
<rectangle x1="69.9389" y1="27.8257" x2="70.2183" y2="27.8511" layer="200"/>
<rectangle x1="68.0847" y1="27.8511" x2="68.4403" y2="27.8765" layer="200"/>
<rectangle x1="68.6689" y1="27.8511" x2="68.9737" y2="27.8765" layer="200"/>
<rectangle x1="69.9389" y1="27.8511" x2="70.2183" y2="27.8765" layer="200"/>
<rectangle x1="67.9069" y1="27.8765" x2="68.4403" y2="27.9019" layer="200"/>
<rectangle x1="68.6689" y1="27.8765" x2="68.9737" y2="27.9019" layer="200"/>
<rectangle x1="69.9389" y1="27.8765" x2="70.2183" y2="27.9019" layer="200"/>
<rectangle x1="67.7799" y1="27.9019" x2="68.4403" y2="27.9273" layer="200"/>
<rectangle x1="68.6689" y1="27.9019" x2="68.9737" y2="27.9273" layer="200"/>
<rectangle x1="69.9389" y1="27.9019" x2="70.2183" y2="27.9273" layer="200"/>
<rectangle x1="67.7291" y1="27.9273" x2="68.4149" y2="27.9527" layer="200"/>
<rectangle x1="68.6689" y1="27.9273" x2="68.9737" y2="27.9527" layer="200"/>
<rectangle x1="69.9389" y1="27.9273" x2="70.2183" y2="27.9527" layer="200"/>
<rectangle x1="67.6783" y1="27.9527" x2="68.4149" y2="27.9781" layer="200"/>
<rectangle x1="68.6689" y1="27.9527" x2="68.9737" y2="27.9781" layer="200"/>
<rectangle x1="69.9389" y1="27.9527" x2="70.2183" y2="27.9781" layer="200"/>
<rectangle x1="67.6275" y1="27.9781" x2="68.3895" y2="28.0035" layer="200"/>
<rectangle x1="68.6689" y1="27.9781" x2="68.9737" y2="28.0035" layer="200"/>
<rectangle x1="69.9389" y1="27.9781" x2="70.2183" y2="28.0035" layer="200"/>
<rectangle x1="67.6021" y1="28.0035" x2="68.3641" y2="28.0289" layer="200"/>
<rectangle x1="68.6689" y1="28.0035" x2="68.9737" y2="28.0289" layer="200"/>
<rectangle x1="69.9389" y1="28.0035" x2="70.2183" y2="28.0289" layer="200"/>
<rectangle x1="67.5767" y1="28.0289" x2="68.3387" y2="28.0543" layer="200"/>
<rectangle x1="68.6689" y1="28.0289" x2="68.9737" y2="28.0543" layer="200"/>
<rectangle x1="69.9389" y1="28.0289" x2="70.2183" y2="28.0543" layer="200"/>
<rectangle x1="67.5513" y1="28.0543" x2="68.2879" y2="28.0797" layer="200"/>
<rectangle x1="68.6689" y1="28.0543" x2="68.9737" y2="28.0797" layer="200"/>
<rectangle x1="69.9389" y1="28.0543" x2="70.2183" y2="28.0797" layer="200"/>
<rectangle x1="67.5513" y1="28.0797" x2="68.2371" y2="28.1051" layer="200"/>
<rectangle x1="68.6689" y1="28.0797" x2="68.9737" y2="28.1051" layer="200"/>
<rectangle x1="69.9389" y1="28.0797" x2="70.2183" y2="28.1051" layer="200"/>
<rectangle x1="67.5259" y1="28.1051" x2="68.1863" y2="28.1305" layer="200"/>
<rectangle x1="68.6689" y1="28.1051" x2="68.9737" y2="28.1305" layer="200"/>
<rectangle x1="69.9389" y1="28.1051" x2="70.2183" y2="28.1305" layer="200"/>
<rectangle x1="67.5259" y1="28.1305" x2="68.0593" y2="28.1559" layer="200"/>
<rectangle x1="68.6689" y1="28.1305" x2="68.9737" y2="28.1559" layer="200"/>
<rectangle x1="69.9389" y1="28.1305" x2="70.2183" y2="28.1559" layer="200"/>
<rectangle x1="67.5259" y1="28.1559" x2="67.9069" y2="28.1813" layer="200"/>
<rectangle x1="68.6943" y1="28.1559" x2="68.9737" y2="28.1813" layer="200"/>
<rectangle x1="69.9389" y1="28.1559" x2="70.2183" y2="28.1813" layer="200"/>
<rectangle x1="67.5005" y1="28.1813" x2="67.8307" y2="28.2067" layer="200"/>
<rectangle x1="68.6943" y1="28.1813" x2="68.9737" y2="28.2067" layer="200"/>
<rectangle x1="69.9389" y1="28.1813" x2="70.2183" y2="28.2067" layer="200"/>
<rectangle x1="67.5005" y1="28.2067" x2="67.8053" y2="28.2321" layer="200"/>
<rectangle x1="68.6943" y1="28.2067" x2="68.9991" y2="28.2321" layer="200"/>
<rectangle x1="69.9389" y1="28.2067" x2="70.2183" y2="28.2321" layer="200"/>
<rectangle x1="67.5005" y1="28.2321" x2="67.7799" y2="28.2575" layer="200"/>
<rectangle x1="68.6943" y1="28.2321" x2="68.9991" y2="28.2575" layer="200"/>
<rectangle x1="69.9389" y1="28.2321" x2="70.2183" y2="28.2575" layer="200"/>
<rectangle x1="67.5005" y1="28.2575" x2="67.7799" y2="28.2829" layer="200"/>
<rectangle x1="68.6943" y1="28.2575" x2="68.9991" y2="28.2829" layer="200"/>
<rectangle x1="69.4817" y1="28.2575" x2="69.5325" y2="28.2829" layer="200"/>
<rectangle x1="69.9389" y1="28.2575" x2="70.2183" y2="28.2829" layer="200"/>
<rectangle x1="67.5005" y1="28.2829" x2="67.7799" y2="28.3083" layer="200"/>
<rectangle x1="68.7197" y1="28.2829" x2="69.0245" y2="28.3083" layer="200"/>
<rectangle x1="69.4563" y1="28.2829" x2="69.5833" y2="28.3083" layer="200"/>
<rectangle x1="69.9389" y1="28.2829" x2="70.2183" y2="28.3083" layer="200"/>
<rectangle x1="67.5005" y1="28.3083" x2="67.7799" y2="28.3337" layer="200"/>
<rectangle x1="68.2371" y1="28.3083" x2="68.2625" y2="28.3337" layer="200"/>
<rectangle x1="68.7197" y1="28.3083" x2="69.0245" y2="28.3337" layer="200"/>
<rectangle x1="69.4563" y1="28.3083" x2="69.6087" y2="28.3337" layer="200"/>
<rectangle x1="69.9389" y1="28.3083" x2="70.2183" y2="28.3337" layer="200"/>
<rectangle x1="67.5005" y1="28.3337" x2="67.7799" y2="28.3591" layer="200"/>
<rectangle x1="68.2117" y1="28.3337" x2="68.2879" y2="28.3591" layer="200"/>
<rectangle x1="68.7197" y1="28.3337" x2="69.0499" y2="28.3591" layer="200"/>
<rectangle x1="69.4309" y1="28.3337" x2="69.6595" y2="28.3591" layer="200"/>
<rectangle x1="69.9389" y1="28.3337" x2="70.2183" y2="28.3591" layer="200"/>
<rectangle x1="67.5005" y1="28.3591" x2="67.8053" y2="28.3845" layer="200"/>
<rectangle x1="68.1863" y1="28.3591" x2="68.3133" y2="28.3845" layer="200"/>
<rectangle x1="68.7451" y1="28.3591" x2="69.0753" y2="28.3845" layer="200"/>
<rectangle x1="69.4055" y1="28.3591" x2="69.7103" y2="28.3845" layer="200"/>
<rectangle x1="69.9389" y1="28.3591" x2="70.2183" y2="28.3845" layer="200"/>
<rectangle x1="67.5259" y1="28.3845" x2="67.8307" y2="28.4099" layer="200"/>
<rectangle x1="68.1355" y1="28.3845" x2="68.3387" y2="28.4099" layer="200"/>
<rectangle x1="68.7451" y1="28.3845" x2="69.1007" y2="28.4099" layer="200"/>
<rectangle x1="69.3801" y1="28.3845" x2="69.7103" y2="28.4099" layer="200"/>
<rectangle x1="69.9389" y1="28.3845" x2="70.2183" y2="28.4099" layer="200"/>
<rectangle x1="67.5259" y1="28.4099" x2="67.8815" y2="28.4353" layer="200"/>
<rectangle x1="68.0847" y1="28.4099" x2="68.3641" y2="28.4353" layer="200"/>
<rectangle x1="68.7705" y1="28.4099" x2="69.1515" y2="28.4353" layer="200"/>
<rectangle x1="69.3293" y1="28.4099" x2="69.7103" y2="28.4353" layer="200"/>
<rectangle x1="69.9389" y1="28.4099" x2="70.2183" y2="28.4353" layer="200"/>
<rectangle x1="67.5259" y1="28.4353" x2="68.3895" y2="28.4607" layer="200"/>
<rectangle x1="68.7705" y1="28.4353" x2="69.6849" y2="28.4607" layer="200"/>
<rectangle x1="69.9389" y1="28.4353" x2="70.2183" y2="28.4607" layer="200"/>
<rectangle x1="67.5513" y1="28.4607" x2="68.4149" y2="28.4861" layer="200"/>
<rectangle x1="68.7959" y1="28.4607" x2="69.6849" y2="28.4861" layer="200"/>
<rectangle x1="69.9389" y1="28.4607" x2="70.2183" y2="28.4861" layer="200"/>
<rectangle x1="67.5513" y1="28.4861" x2="68.4403" y2="28.5115" layer="200"/>
<rectangle x1="68.8213" y1="28.4861" x2="69.6595" y2="28.5115" layer="200"/>
<rectangle x1="69.9389" y1="28.4861" x2="70.2183" y2="28.5115" layer="200"/>
<rectangle x1="67.5767" y1="28.5115" x2="68.4149" y2="28.5369" layer="200"/>
<rectangle x1="68.8467" y1="28.5115" x2="69.6341" y2="28.5369" layer="200"/>
<rectangle x1="69.9389" y1="28.5115" x2="70.2183" y2="28.5369" layer="200"/>
<rectangle x1="67.6021" y1="28.5369" x2="68.3895" y2="28.5623" layer="200"/>
<rectangle x1="68.8721" y1="28.5369" x2="69.6087" y2="28.5623" layer="200"/>
<rectangle x1="69.9389" y1="28.5369" x2="70.2183" y2="28.5623" layer="200"/>
<rectangle x1="67.6275" y1="28.5623" x2="68.3641" y2="28.5877" layer="200"/>
<rectangle x1="68.8975" y1="28.5623" x2="69.5833" y2="28.5877" layer="200"/>
<rectangle x1="69.9389" y1="28.5623" x2="70.2183" y2="28.5877" layer="200"/>
<rectangle x1="67.6529" y1="28.5877" x2="68.3387" y2="28.6131" layer="200"/>
<rectangle x1="68.9229" y1="28.5877" x2="69.5579" y2="28.6131" layer="200"/>
<rectangle x1="69.9389" y1="28.5877" x2="70.2183" y2="28.6131" layer="200"/>
<rectangle x1="67.7037" y1="28.6131" x2="68.2879" y2="28.6385" layer="200"/>
<rectangle x1="68.9737" y1="28.6131" x2="69.5071" y2="28.6385" layer="200"/>
<rectangle x1="69.9389" y1="28.6131" x2="70.2183" y2="28.6385" layer="200"/>
<rectangle x1="67.7545" y1="28.6385" x2="68.2117" y2="28.6639" layer="200"/>
<rectangle x1="69.0245" y1="28.6385" x2="69.4563" y2="28.6639" layer="200"/>
<rectangle x1="69.9389" y1="28.6385" x2="70.2183" y2="28.6639" layer="200"/>
<rectangle x1="67.8561" y1="28.6639" x2="68.1355" y2="28.6893" layer="200"/>
<rectangle x1="69.1261" y1="28.6639" x2="69.3801" y2="28.6893" layer="200"/>
<rectangle x1="65.6971" y1="29.2227" x2="72.1741" y2="29.2481" layer="200"/>
<rectangle x1="65.6971" y1="29.2481" x2="72.1741" y2="29.2735" layer="200"/>
<rectangle x1="65.6971" y1="29.2735" x2="72.1741" y2="29.2989" layer="200"/>
<rectangle x1="65.6971" y1="29.2989" x2="72.1741" y2="29.3243" layer="200"/>
<rectangle x1="65.6971" y1="29.3243" x2="72.1741" y2="29.3497" layer="200"/>
<rectangle x1="67.6783" y1="29.8831" x2="67.9323" y2="29.9085" layer="200"/>
<rectangle x1="67.5767" y1="29.9085" x2="68.0339" y2="29.9339" layer="200"/>
<rectangle x1="68.5673" y1="29.9085" x2="69.1769" y2="29.9339" layer="200"/>
<rectangle x1="69.6849" y1="29.9085" x2="69.9643" y2="29.9339" layer="200"/>
<rectangle x1="70.5739" y1="29.9085" x2="70.8787" y2="29.9339" layer="200"/>
<rectangle x1="67.5005" y1="29.9339" x2="68.0847" y2="29.9593" layer="200"/>
<rectangle x1="68.5673" y1="29.9339" x2="69.2531" y2="29.9593" layer="200"/>
<rectangle x1="69.6849" y1="29.9339" x2="69.9897" y2="29.9593" layer="200"/>
<rectangle x1="70.5739" y1="29.9339" x2="70.8787" y2="29.9593" layer="200"/>
<rectangle x1="67.4497" y1="29.9593" x2="68.1355" y2="29.9847" layer="200"/>
<rectangle x1="68.5673" y1="29.9593" x2="69.3293" y2="29.9847" layer="200"/>
<rectangle x1="69.7103" y1="29.9593" x2="69.9897" y2="29.9847" layer="200"/>
<rectangle x1="70.5739" y1="29.9593" x2="70.8533" y2="29.9847" layer="200"/>
<rectangle x1="67.4243" y1="29.9847" x2="68.1609" y2="30.0101" layer="200"/>
<rectangle x1="68.5673" y1="29.9847" x2="69.3547" y2="30.0101" layer="200"/>
<rectangle x1="69.7103" y1="29.9847" x2="69.9897" y2="30.0101" layer="200"/>
<rectangle x1="70.5485" y1="29.9847" x2="70.8533" y2="30.0101" layer="200"/>
<rectangle x1="67.3989" y1="30.0101" x2="68.1863" y2="30.0355" layer="200"/>
<rectangle x1="68.5673" y1="30.0101" x2="69.4055" y2="30.0355" layer="200"/>
<rectangle x1="69.7103" y1="30.0101" x2="70.0151" y2="30.0355" layer="200"/>
<rectangle x1="70.5485" y1="30.0101" x2="70.8533" y2="30.0355" layer="200"/>
<rectangle x1="67.3481" y1="30.0355" x2="68.2117" y2="30.0609" layer="200"/>
<rectangle x1="68.5673" y1="30.0355" x2="69.4309" y2="30.0609" layer="200"/>
<rectangle x1="69.7357" y1="30.0355" x2="70.0151" y2="30.0609" layer="200"/>
<rectangle x1="70.5485" y1="30.0355" x2="70.8279" y2="30.0609" layer="200"/>
<rectangle x1="67.3227" y1="30.0609" x2="68.2371" y2="30.0863" layer="200"/>
<rectangle x1="68.5673" y1="30.0609" x2="69.4563" y2="30.0863" layer="200"/>
<rectangle x1="69.7357" y1="30.0609" x2="70.0151" y2="30.0863" layer="200"/>
<rectangle x1="70.5485" y1="30.0609" x2="70.8279" y2="30.0863" layer="200"/>
<rectangle x1="67.3227" y1="30.0863" x2="68.2625" y2="30.1117" layer="200"/>
<rectangle x1="68.5673" y1="30.0863" x2="69.4817" y2="30.1117" layer="200"/>
<rectangle x1="69.7357" y1="30.0863" x2="70.0151" y2="30.1117" layer="200"/>
<rectangle x1="70.5231" y1="30.0863" x2="70.8279" y2="30.1117" layer="200"/>
<rectangle x1="67.3227" y1="30.1117" x2="68.2625" y2="30.1371" layer="200"/>
<rectangle x1="68.5673" y1="30.1117" x2="69.4817" y2="30.1371" layer="200"/>
<rectangle x1="69.7611" y1="30.1117" x2="70.0405" y2="30.1371" layer="200"/>
<rectangle x1="70.5231" y1="30.1117" x2="70.8025" y2="30.1371" layer="200"/>
<rectangle x1="67.3481" y1="30.1371" x2="67.7291" y2="30.1625" layer="200"/>
<rectangle x1="67.9069" y1="30.1371" x2="68.2879" y2="30.1625" layer="200"/>
<rectangle x1="68.5673" y1="30.1371" x2="69.5071" y2="30.1625" layer="200"/>
<rectangle x1="69.7611" y1="30.1371" x2="70.0405" y2="30.1625" layer="200"/>
<rectangle x1="70.5231" y1="30.1371" x2="70.8025" y2="30.1625" layer="200"/>
<rectangle x1="67.3735" y1="30.1625" x2="67.6529" y2="30.1879" layer="200"/>
<rectangle x1="67.9831" y1="30.1625" x2="68.2879" y2="30.1879" layer="200"/>
<rectangle x1="68.5673" y1="30.1625" x2="68.8467" y2="30.1879"
gitextract_xb_7azzl/ ├── .github/ │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .readthedocs.yml ├── .travis.yml ├── LICENSE ├── README.md ├── c/ │ ├── common/ │ │ ├── i2cdriver.c │ │ └── i2cdriver.h │ ├── go │ ├── linux/ │ │ ├── Makefile │ │ ├── Makefile.clang │ │ └── i2c.c │ └── win32/ │ ├── Makefile │ └── i2c.c ├── firmware/ │ ├── README.md │ ├── assets/ │ │ ├── IBMPlexSans-SemiBold.otf │ │ ├── go │ │ └── mkfont.py │ ├── capture.fs │ ├── font.fs │ ├── fontsize.fs │ ├── main.fs │ └── st7735.fs ├── hardware/ │ ├── i2cdriver.brd │ └── i2cdriver.sch ├── nsis/ │ ├── .gitignore │ ├── go.bat │ ├── i2cdriver.nsi │ └── license.txt ├── python/ │ ├── .gitignore │ ├── EDS.py │ ├── MANIFEST │ ├── docs/ │ │ ├── Makefile │ │ ├── conf.py │ │ ├── go │ │ ├── index.rst │ │ └── requirements.txt │ ├── go │ ├── i2cdriver.py │ ├── lm75b.py │ ├── samples/ │ │ ├── EDS-ACCEL.py │ │ ├── EDS-BEEP.py │ │ ├── EDS-CLOCK.py │ │ ├── EDS-DIG2.py │ │ ├── EDS-EPROM.py │ │ ├── EDS-LED.py │ │ ├── EDS-MAGNET.py │ │ ├── EDS-POT.py │ │ ├── EDS-REMOTE.py │ │ ├── EDS-TEMP.py │ │ ├── EDS-color-compass.py │ │ ├── EDS-egg-timer.py │ │ ├── EDS-take-a-ticket.py │ │ ├── bargraph.py │ │ ├── bmp390.py │ │ ├── bno080.py │ │ ├── capture.py │ │ ├── cp437-8x8 │ │ ├── go │ │ ├── ht16k33.py │ │ ├── i2cgui.py │ │ ├── lcd1602.py │ │ ├── led8x8.py │ │ ├── mag3110.py │ │ ├── mux.py │ │ ├── oled.py │ │ ├── pca9685.py │ │ ├── qwiic-joystick.py │ │ ├── qwiic-keypad.py │ │ ├── read-temperature.py │ │ ├── touch.py │ │ └── wii.py │ ├── setup.py │ └── tests/ │ └── accept.py ├── python3/ │ ├── .gitignore │ ├── EDS.py │ ├── README.md │ ├── go │ ├── i2cdriver.py │ ├── pyproject.toml │ └── samples/ │ ├── EDS-ACCEL.py │ ├── EDS-BEEP.py │ ├── EDS-CLOCK.py │ ├── EDS-DIG2.py │ ├── EDS-EPROM.py │ ├── EDS-LED.py │ ├── EDS-MAGNET.py │ ├── EDS-POT.py │ ├── EDS-REMOTE.py │ ├── EDS-TEMP.py │ ├── EDS-color-compass.py │ ├── EDS-egg-timer.py │ ├── EDS-take-a-ticket.py │ ├── bargraph.py │ ├── bmp390.py │ ├── bno080.py │ ├── capture.py │ ├── cp437-8x8 │ ├── go │ ├── ht16k33.py │ ├── i2cgui.py │ ├── lcd1602.py │ ├── led8x8.py │ ├── mag3110.py │ ├── mux.py │ ├── oled.py │ ├── pca9685.py │ ├── qwiic-joystick.py │ ├── qwiic-keypad.py │ ├── read-temperature.py │ ├── tcr.py │ ├── touch.py │ └── wii.py └── testall
SYMBOL INDEX (477 symbols across 44 files)
FILE: c/common/i2cdriver.c
function ErrorExit (line 27) | void ErrorExit(const char *func_name)
function HANDLE (line 54) | HANDLE openSerialPort(const char *portname)
function DWORD (line 98) | DWORD readFromSerialPort(HANDLE hSerial, uint8_t * buffer, int buffersize)
function DWORD (line 107) | DWORD writeToSerialPort(HANDLE hSerial, const uint8_t * data, int length)
function closeSerialPort (line 116) | void closeSerialPort(HANDLE hSerial)
function openSerialPort (line 125) | int openSerialPort(const char *portname)
function readFromSerialPort (line 160) | int readFromSerialPort(int fd, uint8_t *b, size_t s)
function writeToSerialPort (line 179) | void writeToSerialPort(int fd, const uint8_t *b, size_t s)
function closeSerialPort (line 191) | void closeSerialPort(HANDLE hSerial)
function crc_update (line 235) | static void crc_update(I2CDriver *sd, const uint8_t *data, size_t data_len)
function i2c_connect (line 250) | void i2c_connect(I2CDriver *sd, const char* portname)
function i2c_disconnect (line 278) | void i2c_disconnect(I2CDriver *sd)
function charCommand (line 287) | static void charCommand(I2CDriver *sd, char c)
function i2c_ack (line 292) | static int i2c_ack(I2CDriver *sd)
function i2c_getstatus (line 300) | void i2c_getstatus(I2CDriver *sd)
function i2c_setspeed (line 327) | bool i2c_setspeed(I2CDriver *sd, unsigned int speed_khz)
function i2c_scan (line 348) | void i2c_scan(I2CDriver *sd, uint8_t devices[128])
function i2c_reset (line 354) | uint8_t i2c_reset(I2CDriver *sd)
function i2c_start (line 363) | int i2c_start(I2CDriver *sd, uint8_t dev, uint8_t op)
function i2c_stop (line 370) | void i2c_stop(I2CDriver *sd)
function i2c_write (line 375) | int i2c_write(I2CDriver *sd, const uint8_t bytes[], size_t nn)
function i2c_read (line 391) | void i2c_read(I2CDriver *sd, uint8_t bytes[], size_t nn)
function i2c_monitor (line 404) | void i2c_monitor(I2CDriver *sd, int enable)
function i2c_capture (line 409) | void i2c_capture(I2CDriver *sd)
function i2c_commands (line 459) | int i2c_commands(I2CDriver *sd, int argc, char *argv[])
FILE: c/common/i2cdriver.h
type I2CDriver (line 13) | typedef struct {
FILE: c/linux/i2c.c
function main (line 6) | int main(int argc, char *argv[])
FILE: c/win32/i2c.c
function main (line 6) | int main(int argc, char *argv[])
FILE: firmware/assets/mkfont.py
function rand (line 10) | def rand(n):
function as565 (line 13) | def as565(im):
function c3 (line 20) | def c3(rgb):
function pad2 (line 28) | def pad2(s):
function rfont2 (line 33) | def rfont2(c):
function rf (line 48) | def rf(c, font):
function nybbles (line 78) | def nybbles(nn):
FILE: python/EDS.py
class Dig2 (line 8) | class Dig2:
method __init__ (line 11) | def __init__(self, i2, a = 0x14):
method raw (line 15) | def raw(self, b0, b1):
method hex (line 19) | def hex(self, b):
method dec (line 23) | def dec(self, b):
method dp (line 27) | def dp(self, p0, p1):
method brightness (line 31) | def brightness(self, b):
class LED (line 35) | class LED:
method __init__ (line 37) | def __init__(self, i2, a = 0x08):
method rgb (line 41) | def rgb(self, r, g, b, t = 0):
method hex (line 54) | def hex(self, hhh, t = 0):
class Pot (line 65) | class Pot:
method __init__ (line 67) | def __init__(self, i2, a = 0x28):
method raw (line 71) | def raw(self):
method rd (line 77) | def rd(self, r):
class Beep (line 84) | class Beep:
method __init__ (line 86) | def __init__(self, i2, a = 0x30):
method beep (line 90) | def beep(self, dur, note):
class Remote (line 98) | class Remote:
method __init__ (line 100) | def __init__(self, i2, a = 0x60):
method key (line 104) | def key(self):
method raw (line 124) | def raw(self):
class Temp (line 138) | class Temp:
method __init__ (line 140) | def __init__(self, i2, a = 0x48):
method reg (line 144) | def reg(self, r):
method read (line 147) | def read(self):
class EPROM (line 151) | class EPROM:
method __init__ (line 153) | def __init__(self, i2, a = 0x50):
method write (line 157) | def write(self, addr, data):
method read (line 167) | def read(self, addr, n):
class Clock (line 177) | class Clock:
method __init__ (line 179) | def __init__(self, i2, a = 0x68):
method set (line 183) | def set(self, t = None):
method read (line 197) | def read(self):
method dump (line 214) | def dump(self):
class Magnet (line 222) | class Magnet:
method __init__ (line 224) | def __init__(self, i2, a = 0x1c):
method rd (line 229) | def rd(self):
method measurement (line 233) | def measurement(self):
class Accel (line 240) | class Accel:
method __init__ (line 243) | def __init__(self, i2, a = 0x19):
method measurement (line 251) | def measurement(self):
FILE: python/i2cdriver.py
class I2CTimeout (line 13) | class I2CTimeout(Exception):
class InternalState (line 16) | class InternalState(OrderedDict):
method __repr__ (line 17) | def __repr__(self):
class _I2CEvent (line 20) | class _I2CEvent:
method rrw (line 21) | def rrw(self):
method rack (line 23) | def rack(self):
class START (line 26) | class START(_I2CEvent):
method __init__ (line 27) | def __init__(self, addr, rw, ack):
method __repr__ (line 31) | def __repr__(self):
method dump (line 33) | def dump(self, f, fmt):
method __eq__ (line 38) | def __eq__(self, other):
class STOP (line 41) | class STOP(_I2CEvent):
method __repr__ (line 42) | def __repr__(self):
method dump (line 44) | def dump(self, f, fmt):
method __eq__ (line 49) | def __eq__(self, other):
class BYTE (line 52) | class BYTE(_I2CEvent):
method __init__ (line 53) | def __init__(self, b, rw, ack):
method __repr__ (line 57) | def __repr__(self):
method dump (line 59) | def dump(self, f, fmt):
method __eq__ (line 64) | def __eq__(self, other):
class I2CDriver (line 67) | class I2CDriver:
method __init__ (line 93) | def __init__(self, port = "/dev/ttyUSB0", reset = True):
method __ser_w (line 132) | def __ser_w(self, s):
method __ser_w (line 137) | def __ser_w(self, s):
method __echo (line 142) | def __echo(self, c):
method setspeed (line 150) | def setspeed(self, s):
method setpullups (line 162) | def setpullups(self, s):
method scan (line 172) | def scan(self, silent = False):
method reset (line 208) | def reset(self):
method start (line 213) | def start(self, dev, rw):
method ack (line 230) | def ack(self):
method read (line 236) | def read(self, l):
method write (line 250) | def write(self, bb):
method stop (line 264) | def stop(self):
method reboot (line 268) | def reboot(self):
method regrd (line 272) | def regrd(self, dev, reg, fmt = "B"):
method regwr (line 305) | def regwr(self, dev, reg, vv):
method monitor (line 331) | def monitor(self, s):
method introspect (line 345) | def introspect(self):
method restore (line 358) | def restore(self):
method __repr__ (line 361) | def __repr__(self):
method capture_start (line 369) | def capture_start(self, idle=False, start = START, abyte = BYTE, stop ...
method capture_stop (line 419) | def capture_stop(self):
method capture (line 427) | def capture(self):
method getstatus (line 461) | def getstatus(self):
FILE: python/lm75b.py
class LM75B (line 1) | class LM75B:
method __init__ (line 2) | def __init__(self, i2, a = 0x48):
method reg (line 6) | def reg(self, r):
method read (line 9) | def read(self):
FILE: python/samples/EDS-egg-timer.py
function millis (line 21) | def millis():
function eggtimer (line 24) | def eggtimer(i2c):
FILE: python/samples/bargraph.py
class bargraph (line 14) | class bargraph(HT16K33):
method set (line 15) | def set(self, pix):
FILE: python/samples/bmp390.py
function const (line 34) | def const(x): return x
class BMP3XX (line 58) | class BMP3XX:
method __init__ (line 61) | def __init__(self):
method pressure (line 72) | def pressure(self):
method temperature (line 77) | def temperature(self):
method altitude (line 82) | def altitude(self):
method pressure_oversampling (line 88) | def pressure_oversampling(self):
method pressure_oversampling (line 93) | def pressure_oversampling(self, oversample):
method temperature_oversampling (line 102) | def temperature_oversampling(self):
method temperature_oversampling (line 107) | def temperature_oversampling(self, oversample):
method filter_coefficient (line 116) | def filter_coefficient(self):
method filter_coefficient (line 121) | def filter_coefficient(self, coef):
method reset (line 128) | def reset(self):
method _read (line 134) | def _read(self):
method _read_coefficients (line 182) | def _read_coefficients(self):
method _read_byte (line 209) | def _read_byte(self, register):
method _read_register (line 213) | def _read_register(self, register, length):
method _write_register_byte (line 217) | def _write_register_byte(self, register, value):
class BMP3XX_I2C (line 222) | class BMP3XX_I2C(BMP3XX):
method __init__ (line 256) | def __init__(self, i2c, address=0x77):
method _read_register (line 262) | def _read_register(self, register, length):
method _write_register_byte (line 270) | def _write_register_byte(self, register, value):
class BMP3XX_SPI (line 276) | class BMP3XX_SPI(BMP3XX):
method __init__ (line 312) | def __init__(self, spi, cs):
method _read_register (line 321) | def _read_register(self, register, length):
method _write_register_byte (line 330) | def _write_register_byte(self, register, value):
class BMP3XX_I2CDriver (line 341) | class BMP3XX_I2CDriver(BMP3XX):
method __init__ (line 374) | def __init__(self, i2c, address=0x77):
method _read_register (line 379) | def _read_register(self, register, length):
method _write_register_byte (line 383) | def _write_register_byte(self, register, value):
FILE: python/samples/bno080.py
function hexdump (line 14) | def hexdump(s):
function normalize (line 86) | def normalize(v, tolerance=0.00001):
class BNO080 (line 93) | class BNO080:
method __init__ (line 94) | def __init__(self, i2, a = 0x4b):
method read_quaternion (line 108) | def read_quaternion(self):
method setFeature (line 133) | def setFeature(self, reportID, timeBetweenReports, specificConfig = 0):
method sendPacket (line 144) | def sendPacket(self, channel, data):
method receivePacket (line 152) | def receivePacket(self):
method showpacket (line 176) | def showpacket(self, data):
method showpacket_00 (line 185) | def showpacket_00(self, ad):
FILE: python/samples/ht16k33.py
class HT16K33 (line 1) | class HT16K33:
method __init__ (line 2) | def __init__(self, i2, a = 0x70):
method bright (line 10) | def bright(self, n):
method command (line 14) | def command(self, b):
method load (line 19) | def load(self, b128):
FILE: python/samples/i2cgui.py
function ping_thr (line 38) | def ping_thr(win):
function capture_thr (line 45) | def capture_thr(sd, log_csv):
class HexTextCtrl (line 59) | class HexTextCtrl(wx.TextCtrl):
method __init__ (line 60) | def __init__(self, *args, **kwargs):
method on_text (line 63) | def on_text(self, event):
class MyDialog (line 72) | class MyDialog(wx.Dialog):
method __init__ (line 73) | def __init__(self, parent, title):
class Frame (line 78) | class Frame(wx.Frame):
method __init__ (line 79) | def __init__(self, preferred = None):
method start (line 269) | def start(self, rw):
method stop (line 274) | def stop(self, e = None):
method reset (line 279) | def reset(self, e = None):
method write (line 283) | def write(self, htc, e):
method read (line 289) | def read(self, e):
method devices (line 298) | def devices(self):
method connect (line 318) | def connect(self, dev):
method refresh (line 323) | def refresh(self, e):
method choose_device (line 349) | def choose_device(self, e):
method no_addr (line 352) | def no_addr(self):
method choose_addr (line 355) | def choose_addr(self, e):
method check_m (line 362) | def check_m(self, e):
method check_c (line 369) | def check_c(self, e):
method set_speed (line 398) | def set_speed(self, e):
method set_pullups (line 403) | def set_pullups(self, e):
method hot (line 409) | def hot(self, i, s):
FILE: python/samples/lcd1602.py
class HD44780 (line 16) | class HD44780:
method __init__ (line 18) | def __init__(self, i2, a = 0x27):
method clear (line 34) | def clear(self):
method show (line 39) | def show(self, line, text):
method cmd (line 45) | def cmd(self, b):
method data (line 50) | def data(self, b):
method nybble (line 63) | def nybble(self, n, rs = 0):
method port (line 71) | def port(self, *bb):
FILE: python/samples/led8x8.py
class led8x8 (line 15) | class led8x8(HT16K33):
method image (line 16) | def image(self, bb):
method char (line 24) | def char(self, c):
FILE: python/samples/mag3110.py
class MAG3110 (line 12) | class MAG3110:
method __init__ (line 13) | def __init__(self, i2, a = 0x0e):
method rd (line 18) | def rd(self):
method measurement (line 22) | def measurement(self):
FILE: python/samples/mux.py
class Mux (line 8) | class Mux:
method __init__ (line 9) | def __init__(self, i2, a = 0x70):
method select (line 13) | def select(self, n):
function read (line 34) | def read(chan, dev):
FILE: python/samples/oled.py
class OLED (line 41) | class OLED:
method __init__ (line 42) | def __init__(self, i2, a = 0x3c):
method command (line 68) | def command(self, *c):
method image (line 73) | def image(self, im):
method cls (line 94) | def cls(self):
FILE: python/samples/pca9685.py
class PCA9685 (line 8) | class PCA9685:
method __init__ (line 9) | def __init__(self, i2, a = 0x40):
method set (line 14) | def set(self, channel, t_on, t_off):
FILE: python/samples/qwiic-joystick.py
class Joystick (line 12) | class Joystick:
method __init__ (line 13) | def __init__(self, i2, a = 0x20):
method axis (line 17) | def axis(self, i):
method read (line 26) | def read(self):
FILE: python/samples/qwiic-keypad.py
class Keypad (line 12) | class Keypad:
method __init__ (line 13) | def __init__(self, i2, a = 0x4b):
method read_ts (line 17) | def read_ts(self):
method read (line 30) | def read(self):
FILE: python/samples/touch.py
class MPR121 (line 14) | class MPR121:
method __init__ (line 15) | def __init__(self, i2, a = 0x5a):
method read (line 20) | def read(self):
FILE: python/samples/wii.py
class Wii (line 10) | class Wii:
method __init__ (line 11) | def __init__(self, i2, a = 0x52):
method rdreg (line 27) | def rdreg(self, addr, n):
method wii_classic_pro (line 37) | def wii_classic_pro(self):
FILE: python/tests/accept.py
function bit (line 14) | def bit(b, x):
function byte (line 17) | def byte(x):
class TestDUT (line 20) | class TestDUT(unittest.TestCase):
method setUp (line 21) | def setUp(self):
method init (line 25) | def init(self):
method lm75_read (line 31) | def lm75_read(self, i, reg):
method lm75_slow_read (line 35) | def lm75_slow_read(self, i, reg):
method lm75_write (line 43) | def lm75_write(self, i, reg, v):
method stack0 (line 48) | def stack0(self):
method stacksame (line 51) | def stacksame(self):
method confirm (line 56) | def confirm(self):
method confirm_sampling (line 60) | def confirm_sampling(self):
method test_temperature (line 71) | def test_temperature(self):
method test_coldstart (line 85) | def test_coldstart(self):
method test_scan (line 91) | def test_scan(self):
method test_lm75_reg (line 101) | def test_lm75_reg(self):
method test_regrd256 (line 119) | def test_regrd256(self):
method test_regwr (line 126) | def test_regwr(self):
method test_setspeed (line 140) | def test_setspeed(self):
method test_cap_idle (line 150) | def test_cap_idle(self):
method test_cap_0 (line 161) | def test_cap_0(self):
method test_pullups (line 194) | def test_pullups(self):
method test_zz5s (line 215) | def test_zz5s(self):
method checkmode (line 221) | def checkmode(self, c):
method test_bitbang (line 225) | def test_bitbang(self):
method test_bitbang_idem (line 242) | def test_bitbang_idem(self):
method test_bitbang_bidir (line 262) | def test_bitbang_bidir(self):
method test_reset (line 288) | def test_reset(self):
method test_sampling (line 298) | def test_sampling(self):
method test_weigh (line 301) | def test_weigh(self):
FILE: python3/EDS.py
class Dig2 (line 8) | class Dig2:
method __init__ (line 11) | def __init__(self, i2, a = 0x14):
method raw (line 15) | def raw(self, b0, b1):
method hex (line 19) | def hex(self, b):
method dec (line 23) | def dec(self, b):
method dp (line 27) | def dp(self, p0, p1):
method brightness (line 31) | def brightness(self, b):
class LED (line 35) | class LED:
method __init__ (line 37) | def __init__(self, i2, a = 0x08):
method rgb (line 41) | def rgb(self, r, g, b, t = 0):
method hex (line 54) | def hex(self, hhh, t = 0):
class Pot (line 65) | class Pot:
method __init__ (line 67) | def __init__(self, i2, a = 0x28):
method raw (line 71) | def raw(self):
method rd (line 77) | def rd(self, r):
class Beep (line 84) | class Beep:
method __init__ (line 86) | def __init__(self, i2, a = 0x30):
method beep (line 90) | def beep(self, dur, note):
class Remote (line 98) | class Remote:
method __init__ (line 100) | def __init__(self, i2, a = 0x60):
method key (line 104) | def key(self):
method raw (line 124) | def raw(self):
class Temp (line 138) | class Temp:
method __init__ (line 140) | def __init__(self, i2, a = 0x48):
method reg (line 144) | def reg(self, r):
method read (line 147) | def read(self):
class EPROM (line 151) | class EPROM:
method __init__ (line 153) | def __init__(self, i2, a = 0x50):
method write (line 157) | def write(self, addr, data):
method read (line 167) | def read(self, addr, n):
class Clock (line 177) | class Clock:
method __init__ (line 179) | def __init__(self, i2, a = 0x68):
method set (line 183) | def set(self, t = None):
method read (line 197) | def read(self):
method dump (line 214) | def dump(self):
class Magnet (line 222) | class Magnet:
method __init__ (line 224) | def __init__(self, i2, a = 0x1c):
method rd (line 229) | def rd(self):
method measurement (line 233) | def measurement(self):
class Accel (line 240) | class Accel:
method __init__ (line 243) | def __init__(self, i2, a = 0x19):
method measurement (line 251) | def measurement(self):
FILE: python3/i2cdriver.py
class I2CTimeout (line 13) | class I2CTimeout(Exception):
class InternalState (line 16) | class InternalState(OrderedDict):
method __repr__ (line 17) | def __repr__(self):
class _I2CEvent (line 20) | class _I2CEvent:
method rrw (line 21) | def rrw(self):
method rack (line 23) | def rack(self):
class START (line 26) | class START(_I2CEvent):
method __init__ (line 27) | def __init__(self, addr, rw, ack):
method __repr__ (line 31) | def __repr__(self):
method dump (line 33) | def dump(self, f, fmt):
method __eq__ (line 38) | def __eq__(self, other):
class STOP (line 41) | class STOP(_I2CEvent):
method __repr__ (line 42) | def __repr__(self):
method dump (line 44) | def dump(self, f, fmt):
method __eq__ (line 49) | def __eq__(self, other):
class BYTE (line 52) | class BYTE(_I2CEvent):
method __init__ (line 53) | def __init__(self, b, rw, ack):
method __repr__ (line 57) | def __repr__(self):
method dump (line 59) | def dump(self, f, fmt):
method __eq__ (line 64) | def __eq__(self, other):
class I2CDriver (line 67) | class I2CDriver:
method __init__ (line 93) | def __init__(self, port = "/dev/ttyUSB0", reset = True):
method __ser_w (line 132) | def __ser_w(self, s):
method __ser_w (line 137) | def __ser_w(self, s):
method __echo (line 142) | def __echo(self, c):
method setspeed (line 150) | def setspeed(self, s):
method setpullups (line 162) | def setpullups(self, s):
method scan (line 172) | def scan(self, silent = False):
method reset (line 208) | def reset(self):
method start (line 213) | def start(self, dev, rw):
method ack (line 230) | def ack(self):
method read (line 236) | def read(self, l):
method write (line 250) | def write(self, bb):
method stop (line 264) | def stop(self):
method reboot (line 268) | def reboot(self):
method regrd (line 272) | def regrd(self, dev, reg, fmt = "B"):
method regwr (line 305) | def regwr(self, dev, reg, vv):
method monitor (line 331) | def monitor(self, s):
method introspect (line 345) | def introspect(self):
method restore (line 358) | def restore(self):
method __repr__ (line 361) | def __repr__(self):
method capture_start (line 369) | def capture_start(self, idle=False, start = START, abyte = BYTE, stop ...
method capture_stop (line 419) | def capture_stop(self):
method capture (line 427) | def capture(self):
method getstatus (line 461) | def getstatus(self):
FILE: python3/samples/EDS-egg-timer.py
function millis (line 21) | def millis():
function eggtimer (line 24) | def eggtimer(i2c):
FILE: python3/samples/bargraph.py
class bargraph (line 14) | class bargraph(HT16K33):
method set (line 15) | def set(self, pix):
FILE: python3/samples/bmp390.py
function const (line 34) | def const(x): return x
class BMP3XX (line 58) | class BMP3XX:
method __init__ (line 61) | def __init__(self):
method pressure (line 72) | def pressure(self):
method temperature (line 77) | def temperature(self):
method altitude (line 82) | def altitude(self):
method pressure_oversampling (line 88) | def pressure_oversampling(self):
method pressure_oversampling (line 93) | def pressure_oversampling(self, oversample):
method temperature_oversampling (line 102) | def temperature_oversampling(self):
method temperature_oversampling (line 107) | def temperature_oversampling(self, oversample):
method filter_coefficient (line 116) | def filter_coefficient(self):
method filter_coefficient (line 121) | def filter_coefficient(self, coef):
method reset (line 128) | def reset(self):
method _read (line 134) | def _read(self):
method _read_coefficients (line 182) | def _read_coefficients(self):
method _read_byte (line 209) | def _read_byte(self, register):
method _read_register (line 213) | def _read_register(self, register, length):
method _write_register_byte (line 217) | def _write_register_byte(self, register, value):
class BMP3XX_I2C (line 222) | class BMP3XX_I2C(BMP3XX):
method __init__ (line 256) | def __init__(self, i2c, address=0x77):
method _read_register (line 262) | def _read_register(self, register, length):
method _write_register_byte (line 270) | def _write_register_byte(self, register, value):
class BMP3XX_SPI (line 276) | class BMP3XX_SPI(BMP3XX):
method __init__ (line 312) | def __init__(self, spi, cs):
method _read_register (line 321) | def _read_register(self, register, length):
method _write_register_byte (line 330) | def _write_register_byte(self, register, value):
class BMP3XX_I2CDriver (line 341) | class BMP3XX_I2CDriver(BMP3XX):
method __init__ (line 374) | def __init__(self, i2c, address=0x77):
method _read_register (line 379) | def _read_register(self, register, length):
method _write_register_byte (line 383) | def _write_register_byte(self, register, value):
FILE: python3/samples/bno080.py
function hexdump (line 14) | def hexdump(s):
function normalize (line 86) | def normalize(v, tolerance=0.00001):
class BNO080 (line 93) | class BNO080:
method __init__ (line 94) | def __init__(self, i2, a = 0x4b):
method read_quaternion (line 108) | def read_quaternion(self):
method setFeature (line 133) | def setFeature(self, reportID, timeBetweenReports, specificConfig = 0):
method sendPacket (line 144) | def sendPacket(self, channel, data):
method receivePacket (line 152) | def receivePacket(self):
method showpacket (line 176) | def showpacket(self, data):
method showpacket_00 (line 185) | def showpacket_00(self, ad):
FILE: python3/samples/ht16k33.py
class HT16K33 (line 1) | class HT16K33:
method __init__ (line 2) | def __init__(self, i2, a = 0x70):
method bright (line 10) | def bright(self, n):
method command (line 14) | def command(self, b):
method load (line 19) | def load(self, b128):
FILE: python3/samples/i2cgui.py
function ping_thr (line 38) | def ping_thr(win):
function capture_thr (line 45) | def capture_thr(sd, log_csv):
class HexTextCtrl (line 59) | class HexTextCtrl(wx.TextCtrl):
method __init__ (line 60) | def __init__(self, *args, **kwargs):
method on_text (line 63) | def on_text(self, event):
class MyDialog (line 72) | class MyDialog(wx.Dialog):
method __init__ (line 73) | def __init__(self, parent, title):
class Frame (line 78) | class Frame(wx.Frame):
method __init__ (line 79) | def __init__(self, preferred = None):
method start (line 269) | def start(self, rw):
method stop (line 274) | def stop(self, e = None):
method reset (line 279) | def reset(self, e = None):
method write (line 283) | def write(self, htc, e):
method read (line 289) | def read(self, e):
method devices (line 298) | def devices(self):
method connect (line 318) | def connect(self, dev):
method refresh (line 323) | def refresh(self, e):
method choose_device (line 349) | def choose_device(self, e):
method no_addr (line 352) | def no_addr(self):
method choose_addr (line 355) | def choose_addr(self, e):
method check_m (line 362) | def check_m(self, e):
method check_c (line 369) | def check_c(self, e):
method set_speed (line 398) | def set_speed(self, e):
method set_pullups (line 403) | def set_pullups(self, e):
method hot (line 409) | def hot(self, i, s):
function main (line 421) | def main():
FILE: python3/samples/lcd1602.py
class HD44780 (line 16) | class HD44780:
method __init__ (line 18) | def __init__(self, i2, a = 0x27):
method clear (line 34) | def clear(self):
method show (line 39) | def show(self, line, text):
method cmd (line 45) | def cmd(self, b):
method data (line 50) | def data(self, b):
method nybble (line 63) | def nybble(self, n, rs = 0):
method port (line 71) | def port(self, *bb):
FILE: python3/samples/led8x8.py
class led8x8 (line 15) | class led8x8(HT16K33):
method image (line 16) | def image(self, bb):
method char (line 24) | def char(self, c):
FILE: python3/samples/mag3110.py
class MAG3110 (line 12) | class MAG3110:
method __init__ (line 13) | def __init__(self, i2, a = 0x0e):
method rd (line 18) | def rd(self):
method measurement (line 22) | def measurement(self):
FILE: python3/samples/mux.py
class Mux (line 8) | class Mux:
method __init__ (line 9) | def __init__(self, i2, a = 0x70):
method select (line 13) | def select(self, n):
function read (line 34) | def read(chan, dev):
FILE: python3/samples/oled.py
class OLED (line 41) | class OLED:
method __init__ (line 42) | def __init__(self, i2, a = 0x3c):
method command (line 68) | def command(self, *c):
method image (line 73) | def image(self, im):
method cls (line 94) | def cls(self):
FILE: python3/samples/pca9685.py
class PCA9685 (line 8) | class PCA9685:
method __init__ (line 9) | def __init__(self, i2, a = 0x40):
method set (line 14) | def set(self, channel, t_on, t_off):
FILE: python3/samples/qwiic-joystick.py
class Joystick (line 12) | class Joystick:
method __init__ (line 13) | def __init__(self, i2, a = 0x20):
method axis (line 17) | def axis(self, i):
method read (line 26) | def read(self):
FILE: python3/samples/qwiic-keypad.py
class Keypad (line 12) | class Keypad:
method __init__ (line 13) | def __init__(self, i2, a = 0x4b):
method read_ts (line 17) | def read_ts(self):
method read (line 30) | def read(self):
FILE: python3/samples/tcr.py
class TCR (line 5) | class TCR:
FILE: python3/samples/touch.py
class MPR121 (line 14) | class MPR121:
method __init__ (line 15) | def __init__(self, i2, a = 0x5a):
method read (line 20) | def read(self):
FILE: python3/samples/wii.py
class Wii (line 10) | class Wii:
method __init__ (line 11) | def __init__(self, i2, a = 0x52):
method rdreg (line 27) | def rdreg(self, addr, n):
method wii_classic_pro (line 37) | def wii_classic_pro(self):
Condensed preview — 114 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,335K chars).
[
{
"path": ".github/workflows/ci.yml",
"chars": 439,
"preview": "name: Lightweight regressions\non: [push]\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/chec"
},
{
"path": ".gitignore",
"chars": 44,
"preview": "__pycache__\n*.pyc\n/c/build/\n/c/bin/\n/c/obj/\n"
},
{
"path": ".readthedocs.yml",
"chars": 412,
"preview": "# .readthedocs.yml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html fo"
},
{
"path": ".travis.yml",
"chars": 570,
"preview": "language: generic\nscript: ./testall\n\nmatrix:\n include:\n - os: linux\n sudo: required\n python:"
},
{
"path": "LICENSE",
"chars": 1512,
"preview": "BSD 3-Clause License\n\nCopyright (c) 2019, James Bowman\nAll rights reserved.\n\nRedistribution and use in source and binary"
},
{
"path": "README.md",
"chars": 1963,
"preview": "\n\n[](https://trav"
},
{
"path": "c/common/i2cdriver.c",
"chars": 14931,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <assert.h>\n#include <memory.h>\n#include <fcntl.h>\n#if !defined(WIN32)\n#i"
},
{
"path": "c/common/i2cdriver.h",
"chars": 1455,
"preview": "#ifndef I2CDRIVER_H\n#define I2CDRIVER_H\n\n#include <stdint.h>\n#include <stdbool.h>\n\n#if defined(WIN32)\n#include <windows."
},
{
"path": "c/go",
"chars": 351,
"preview": "set -e\n\nrm -rf build/*\nmake -f linux/Makefile\n# build/i2ccl /dev/ttyUSB0 i d\n# build/i2ccl /dev/ttyUSB0 w 0x48 3 r 0x48 "
},
{
"path": "c/linux/Makefile",
"chars": 214,
"preview": "CFLAGS += -I common -Wall -Wpointer-sign # -Werror\n\nall: build/i2ccl\n\ninstall: all\n\tcp build/i2ccl /usr/local/bin\n\nbuild"
},
{
"path": "c/linux/Makefile.clang",
"chars": 240,
"preview": "CC=clang\nCFLAGS += -I common -Wall -Wpointer-sign -xc++ -std=c++17 # -Werror\n\nall: build/i2ccl\n\ninstall: all\n\tcp build/i"
},
{
"path": "c/linux/i2c.c",
"chars": 338,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n\n#include \"i2cdriver.h\"\n\nint main(int argc, char *argv[])\n{\n I2CDriver i2c;\n if"
},
{
"path": "c/win32/Makefile",
"chars": 214,
"preview": "CC = /usr/bin/i686-w64-mingw32-g++\nCFLAGS += -I common -static-libgcc -static-libstdc++\n\nall: build/i2ccl.exe\n\nbuild/i2c"
},
{
"path": "c/win32/i2c.c",
"chars": 334,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n\n#include \"i2cdriver.h\"\n\nint main(int argc, char *argv[])\n{\n I2CDriver sd;\n if "
},
{
"path": "firmware/README.md",
"chars": 270,
"preview": "This is the firmware for the I2CDriver.\nIt uses the [MyForth](http://www.kiblerelectronics.com/myf/myf.shtml) compiler w"
},
{
"path": "firmware/assets/go",
"chars": 26,
"preview": "set -e\n\npython2 mkfont.py\n"
},
{
"path": "firmware/assets/mkfont.py",
"chars": 3841,
"preview": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport sys\nfrom PIL import Image, ImageDraw, ImageFont\nimport numpy as np\nimp"
},
{
"path": "firmware/capture.fs",
"chars": 6192,
"preview": "\nhere constant CAPTURE-START\n\n[\n: fake ( a - u )\n dup 0= ] here [ and or ;\n]\n\n:m :: ( - )\n\t[ >in @ label >in !\n\tcre"
},
{
"path": "firmware/font.fs",
"chars": 8496,
"preview": "here constant tplan\n60 , 0 , $ff , $f , ,\" V\"\n108 , 0 , $ff , $f , ,\" mA\"\n0 ,\nhere constant font\n'.' , $49 , $00 , $00 "
},
{
"path": "firmware/fontsize.fs",
"chars": 29,
"preview": "&1385 constant FONTDATA_SIZE\n"
},
{
"path": "firmware/main.fs",
"chars": 19683,
"preview": "24500000 constant SYSCLK\n\n0 constant CLOSEUP\n\n\\ P0.0 SDA 2K2\n\\ P0.1 SDA 4K3\n\\ P0.2 SDA\n\\ P0.3 SDA 4K7\n\\ P0.4 RX\n\\ P"
},
{
"path": "firmware/st7735.fs",
"chars": 13134,
"preview": "$00 constant NOP $2B constant RASET $C2 constant PWCTR3\n$01 constant SWRESET $2C constant RAMWR $C3 constant"
},
{
"path": "hardware/i2cdriver.brd",
"chars": 434843,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.4\">\n<drawing>\n<settings>\n<s"
},
{
"path": "hardware/i2cdriver.sch",
"chars": 485634,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.4\">\n<drawing>\n<settings>\n<s"
},
{
"path": "nsis/.gitignore",
"chars": 6,
"preview": "*.exe\n"
},
{
"path": "nsis/go.bat",
"chars": 183,
"preview": "copy /Y ..\\c\\build\\i2ccl.exe\r\ncopy /Y ..\\python\\samples\\dist\\i2cgui.exe\r\n\r\n\"C:\\Program Files\\NSIS\\makensis.exe\" i2cdrive"
},
{
"path": "nsis/i2cdriver.nsi",
"chars": 10373,
"preview": "# This installs two files, app.exe and logo.ico, creates a start menu shortcut, builds an uninstaller, and\n# adds uninst"
},
{
"path": "nsis/license.txt",
"chars": 1532,
"preview": "BSD 3-Clause License\r\n\r\nCopyright (c) 2019, James Bowman\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and b"
},
{
"path": "python/.gitignore",
"chars": 47,
"preview": "_build/\nbuild/\ndist/\ni2cdriver.egg-info/\n*.csv\n"
},
{
"path": "python/EDS.py",
"chars": 7854,
"preview": "\"\"\"\nDrivers for electricdollarstore I2C parts\n\"\"\"\nimport struct\nimport time\nimport datetime\n\nclass Dig2:\n \"\"\" DIG2 is"
},
{
"path": "python/MANIFEST",
"chars": 65,
"preview": "# file GENERATED by distutils, do NOT edit\nsetup.py\nspidriver.py\n"
},
{
"path": "python/docs/Makefile",
"chars": 634,
"preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
},
{
"path": "python/docs/conf.py",
"chars": 2023,
"preview": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common op"
},
{
"path": "python/docs/go",
"chars": 63,
"preview": "set -e\n\n# pip install --upgrade --force-reinstall ..\nmake html\n"
},
{
"path": "python/docs/index.rst",
"chars": 2083,
"preview": "i2cdriver\n=========\n\n.. image:: /images/i2cdriver-hero-800.jpg\n :target: https://i2cdriver.com\n\n`I²CDriver <https://i2"
},
{
"path": "python/docs/requirements.txt",
"chars": 9,
"preview": "pyserial\n"
},
{
"path": "python/go",
"chars": 243,
"preview": "set -e\npython setup.py install # --user\n# python samples/i2cgui.py /dev/ttyUSB0\nmake -f Makefile.sphinx latexpdf\nexit\n\ne"
},
{
"path": "python/i2cdriver.py",
"chars": 14620,
"preview": "import sys\nimport serial\nimport time\nimport struct\nfrom collections import OrderedDict\n\n__version__ = '1.0.1'\n\nPYTHON2 ="
},
{
"path": "python/lm75b.py",
"chars": 231,
"preview": "class LM75B:\n def __init__(self, i2, a = 0x48):\n self.i2 = i2\n self.a = a\n\n def reg(self, r):\n "
},
{
"path": "python/samples/EDS-ACCEL.py",
"chars": 249,
"preview": "import sys\nimport struct\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python/samples/EDS-BEEP.py",
"chars": 312,
"preview": "import sys\nimport serial\nimport time\nimport struct\nimport random\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '"
},
{
"path": "python/samples/EDS-CLOCK.py",
"chars": 215,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1])"
},
{
"path": "python/samples/EDS-DIG2.py",
"chars": 223,
"preview": "import sys\nimport serial\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python/samples/EDS-EPROM.py",
"chars": 3755,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\ntext = b\"\"\"\\\nCHAPTER 1. Loomings.\n\nCall me Ishmael. Some y"
},
{
"path": "python/samples/EDS-LED.py",
"chars": 293,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1])"
},
{
"path": "python/samples/EDS-MAGNET.py",
"chars": 203,
"preview": "import sys\nimport struct\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python/samples/EDS-POT.py",
"chars": 299,
"preview": "import sys\nimport struct\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python/samples/EDS-REMOTE.py",
"chars": 522,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1],"
},
{
"path": "python/samples/EDS-TEMP.py",
"chars": 326,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1])"
},
{
"path": "python/samples/EDS-color-compass.py",
"chars": 769,
"preview": "\"\"\"\nDemo of a simple combination of parts from Electric Dollar Store:\n\n* MAGNET - 3-axis magnetometer\n* LED - RGB LED\n\nT"
},
{
"path": "python/samples/EDS-egg-timer.py",
"chars": 1616,
"preview": "\"\"\"\nDemo of a simple combination of parts from Electric Dollar Store:\n\n* POT - potentiometer\n* DIG2 - 2-digit display\n* "
},
{
"path": "python/samples/EDS-take-a-ticket.py",
"chars": 925,
"preview": "\"\"\"\nDemo of a simple combination of parts from Electric Dollar Store:\n\n* REMOTE - remote control receiver\n* DIG2 - 2-dig"
},
{
"path": "python/samples/bargraph.py",
"chars": 883,
"preview": "\"\"\"\nExample for Bi-Color (Red/Green) 24-Bar Bargraph, based on HT16K33.\nAvailable from Adafruit.\n\"\"\"\n\nimport sys\nimport "
},
{
"path": "python/samples/bmp390.py",
"chars": 12809,
"preview": "# SPDX-FileCopyrightText: 2018 Carter Nelson for Adafruit Industries\n#\n# SPDX-License-Identifier: MIT\n\n\"\"\"\n`adafruit_bmp"
},
{
"path": "python/samples/bno080.py",
"chars": 6752,
"preview": "\"\"\"\nExample for BNO080 integrated IMU.\nAvailable from Sparkfun.\n\"\"\"\n\nimport sys\nimport serial\nimport time\nimport struct\n"
},
{
"path": "python/samples/capture.py",
"chars": 739,
"preview": "\"\"\"\nExample showing how to use the capture feature.\n\"\"\"\n\nimport sys\nimport csv\n\nfrom i2cdriver import I2CDriver, START, "
},
{
"path": "python/samples/go",
"chars": 93,
"preview": "python mag3110.py /dev/ttyUSB0\n# python EDS-take-a-ticket.py /dev/ttyUSB0\n# python i2cgui.py\n"
},
{
"path": "python/samples/ht16k33.py",
"chars": 560,
"preview": "class HT16K33:\n def __init__(self, i2, a = 0x70):\n self.i2 = i2\n self.a = a\n self.command(0x21) "
},
{
"path": "python/samples/i2cgui.py",
"chars": 13824,
"preview": "#!/usr/bin/env python\n\nimport time\nimport struct\nimport sys\nimport os\nimport re\nimport csv\nimport threading\nfrom functoo"
},
{
"path": "python/samples/lcd1602.py",
"chars": 1936,
"preview": "\"\"\"\nExample for LCD1602, in which a PCF8574 I/O expander drives a HD44780.\nAvailable from various vendors.\n\nNote that th"
},
{
"path": "python/samples/led8x8.py",
"chars": 858,
"preview": "\"\"\"\nExample for 8x8 LED Matrix modules, based on HT16K33.\nAvailable from multiple vendors.\n\"\"\"\n\nimport sys\nimport time\n\n"
},
{
"path": "python/samples/mag3110.py",
"chars": 847,
"preview": "\"\"\"\nExample Xtrinsic MAG3110 Three-Axis Digital Magnetometer\nBreakout available from Sparkfun.\n\"\"\"\n\nimport sys\nimport st"
},
{
"path": "python/samples/mux.py",
"chars": 909,
"preview": "import sys\nfrom i2cdriver import I2CDriver, EDS\n\n# Using a TCA9548A Low-Voltage 8-Channel I2C Switch\n# Three LM75B tempe"
},
{
"path": "python/samples/oled.py",
"chars": 2874,
"preview": "\"\"\"\nExample for 128X64OLED Module \nAvailable from multiple vendors, e.g. DIYMall\n\nThis example loads the I2CDriver logo "
},
{
"path": "python/samples/pca9685.py",
"chars": 836,
"preview": "import sys\nimport time\nimport random\nimport struct\n\nfrom i2cdriver import I2CDriver\n\nclass PCA9685:\n def __init__(sel"
},
{
"path": "python/samples/qwiic-joystick.py",
"chars": 947,
"preview": "\"\"\"\nExample for Qwiic Joystick\nAvailable from Sparkfun.\n\"\"\"\n\nimport sys\nimport time\nimport struct\n\nfrom i2cdriver import"
},
{
"path": "python/samples/qwiic-keypad.py",
"chars": 825,
"preview": "\"\"\"\nExample for Qwiic Keypad\nAvailable from Sparkfun.\n\"\"\"\n\nimport sys\nimport time\nimport struct\n\nfrom i2cdriver import I"
},
{
"path": "python/samples/read-temperature.py",
"chars": 214,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, LM75B\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1"
},
{
"path": "python/samples/touch.py",
"chars": 659,
"preview": "\"\"\"\nExample for MPR121 Capacitive Touch Sensor.\nAvailable from multiple vendors.\n\"\"\"\n\nimport sys\nimport serial\nimport ti"
},
{
"path": "python/samples/wii.py",
"chars": 1638,
"preview": "import sys\nimport struct\nfrom i2cdriver import I2CDriver\n\n#\n# For details see\n# https://wiibrew.org/wiki/Wiimote/Extensi"
},
{
"path": "python/setup.py",
"chars": 836,
"preview": "# coding=utf-8\nfrom setuptools import setup\n\nLONG = \"\"\"\\\nI2CDriver is a tool for controlling, monitoring and capturing I"
},
{
"path": "python/tests/accept.py",
"chars": 11175,
"preview": "from __future__ import print_function, division\n\nimport sys\nimport time\nimport struct\nimport random\n\nimport i2cdriver\nim"
},
{
"path": "python3/.gitignore",
"chars": 26,
"preview": "dist/\ni2cdriver.egg-info/\n"
},
{
"path": "python3/EDS.py",
"chars": 7854,
"preview": "\"\"\"\nDrivers for electricdollarstore I2C parts\n\"\"\"\nimport struct\nimport time\nimport datetime\n\nclass Dig2:\n \"\"\" DIG2 is"
},
{
"path": "python3/README.md",
"chars": 196,
"preview": "i2cdriver\n=========\n\nI2CDriver is a tool for controlling, monitoring and capturing I2C from your PC's USB port. It conne"
},
{
"path": "python3/go",
"chars": 100,
"preview": "set -e\n\nrm -rf __pycache__/ dist/ i2cdriver.egg-info/\npython -m build\npython -m twine upload dist/*\n"
},
{
"path": "python3/i2cdriver.py",
"chars": 14620,
"preview": "import sys\nimport serial\nimport time\nimport struct\nfrom collections import OrderedDict\n\n__version__ = '1.0.6'\n\nPYTHON2 ="
},
{
"path": "python3/pyproject.toml",
"chars": 610,
"preview": "[build-system]\nrequires = [\"setuptools>=61\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"i2cdriver\"\nversi"
},
{
"path": "python3/samples/EDS-ACCEL.py",
"chars": 249,
"preview": "import sys\nimport struct\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python3/samples/EDS-BEEP.py",
"chars": 312,
"preview": "import sys\nimport serial\nimport time\nimport struct\nimport random\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '"
},
{
"path": "python3/samples/EDS-CLOCK.py",
"chars": 215,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1])"
},
{
"path": "python3/samples/EDS-DIG2.py",
"chars": 223,
"preview": "import sys\nimport serial\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python3/samples/EDS-EPROM.py",
"chars": 3755,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\ntext = b\"\"\"\\\nCHAPTER 1. Loomings.\n\nCall me Ishmael. Some y"
},
{
"path": "python3/samples/EDS-LED.py",
"chars": 293,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1])"
},
{
"path": "python3/samples/EDS-MAGNET.py",
"chars": 203,
"preview": "import sys\nimport struct\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python3/samples/EDS-POT.py",
"chars": 299,
"preview": "import sys\nimport struct\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDrive"
},
{
"path": "python3/samples/EDS-REMOTE.py",
"chars": 522,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1],"
},
{
"path": "python3/samples/EDS-TEMP.py",
"chars": 326,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, EDS\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1])"
},
{
"path": "python3/samples/EDS-color-compass.py",
"chars": 769,
"preview": "\"\"\"\nDemo of a simple combination of parts from Electric Dollar Store:\n\n* MAGNET - 3-axis magnetometer\n* LED - RGB LED\n\nT"
},
{
"path": "python3/samples/EDS-egg-timer.py",
"chars": 1616,
"preview": "\"\"\"\nDemo of a simple combination of parts from Electric Dollar Store:\n\n* POT - potentiometer\n* DIG2 - 2-digit display\n* "
},
{
"path": "python3/samples/EDS-take-a-ticket.py",
"chars": 925,
"preview": "\"\"\"\nDemo of a simple combination of parts from Electric Dollar Store:\n\n* REMOTE - remote control receiver\n* DIG2 - 2-dig"
},
{
"path": "python3/samples/bargraph.py",
"chars": 883,
"preview": "\"\"\"\nExample for Bi-Color (Red/Green) 24-Bar Bargraph, based on HT16K33.\nAvailable from Adafruit.\n\"\"\"\n\nimport sys\nimport "
},
{
"path": "python3/samples/bmp390.py",
"chars": 12809,
"preview": "# SPDX-FileCopyrightText: 2018 Carter Nelson for Adafruit Industries\n#\n# SPDX-License-Identifier: MIT\n\n\"\"\"\n`adafruit_bmp"
},
{
"path": "python3/samples/bno080.py",
"chars": 6752,
"preview": "\"\"\"\nExample for BNO080 integrated IMU.\nAvailable from Sparkfun.\n\"\"\"\n\nimport sys\nimport serial\nimport time\nimport struct\n"
},
{
"path": "python3/samples/capture.py",
"chars": 739,
"preview": "\"\"\"\nExample showing how to use the capture feature.\n\"\"\"\n\nimport sys\nimport csv\n\nfrom i2cdriver import I2CDriver, START, "
},
{
"path": "python3/samples/go",
"chars": 93,
"preview": "python mag3110.py /dev/ttyUSB0\n# python EDS-take-a-ticket.py /dev/ttyUSB0\n# python i2cgui.py\n"
},
{
"path": "python3/samples/ht16k33.py",
"chars": 560,
"preview": "class HT16K33:\n def __init__(self, i2, a = 0x70):\n self.i2 = i2\n self.a = a\n self.command(0x21) "
},
{
"path": "python3/samples/i2cgui.py",
"chars": 13848,
"preview": "#!/usr/bin/env python\n\nimport time\nimport struct\nimport sys\nimport os\nimport re\nimport csv\nimport threading\nfrom functoo"
},
{
"path": "python3/samples/lcd1602.py",
"chars": 1936,
"preview": "\"\"\"\nExample for LCD1602, in which a PCF8574 I/O expander drives a HD44780.\nAvailable from various vendors.\n\nNote that th"
},
{
"path": "python3/samples/led8x8.py",
"chars": 858,
"preview": "\"\"\"\nExample for 8x8 LED Matrix modules, based on HT16K33.\nAvailable from multiple vendors.\n\"\"\"\n\nimport sys\nimport time\n\n"
},
{
"path": "python3/samples/mag3110.py",
"chars": 847,
"preview": "\"\"\"\nExample Xtrinsic MAG3110 Three-Axis Digital Magnetometer\nBreakout available from Sparkfun.\n\"\"\"\n\nimport sys\nimport st"
},
{
"path": "python3/samples/mux.py",
"chars": 909,
"preview": "import sys\nfrom i2cdriver import I2CDriver, EDS\n\n# Using a TCA9548A Low-Voltage 8-Channel I2C Switch\n# Three LM75B tempe"
},
{
"path": "python3/samples/oled.py",
"chars": 2874,
"preview": "\"\"\"\nExample for 128X64OLED Module \nAvailable from multiple vendors, e.g. DIYMall\n\nThis example loads the I2CDriver logo "
},
{
"path": "python3/samples/pca9685.py",
"chars": 836,
"preview": "import sys\nimport time\nimport random\nimport struct\n\nfrom i2cdriver import I2CDriver\n\nclass PCA9685:\n def __init__(sel"
},
{
"path": "python3/samples/qwiic-joystick.py",
"chars": 947,
"preview": "\"\"\"\nExample for Qwiic Joystick\nAvailable from Sparkfun.\n\"\"\"\n\nimport sys\nimport time\nimport struct\n\nfrom i2cdriver import"
},
{
"path": "python3/samples/qwiic-keypad.py",
"chars": 825,
"preview": "\"\"\"\nExample for Qwiic Keypad\nAvailable from Sparkfun.\n\"\"\"\n\nimport sys\nimport time\nimport struct\n\nfrom i2cdriver import I"
},
{
"path": "python3/samples/read-temperature.py",
"chars": 214,
"preview": "import sys\nimport time\n\nfrom i2cdriver import I2CDriver, LM75B\n\nif __name__ == '__main__':\n i2 = I2CDriver(sys.argv[1"
},
{
"path": "python3/samples/tcr.py",
"chars": 398,
"preview": "import sys\nimport struct\nfrom i2cdriver import I2CDriver\n\nclass TCR:\n pass\n\nif __name__ == '__main__':\n i2 = I2CDr"
},
{
"path": "python3/samples/touch.py",
"chars": 659,
"preview": "\"\"\"\nExample for MPR121 Capacitive Touch Sensor.\nAvailable from multiple vendors.\n\"\"\"\n\nimport sys\nimport serial\nimport ti"
},
{
"path": "python3/samples/wii.py",
"chars": 1638,
"preview": "import sys\nimport struct\nfrom i2cdriver import I2CDriver\n\n#\n# For details see\n# https://wiibrew.org/wiki/Wiimote/Extensi"
},
{
"path": "testall",
"chars": 156,
"preview": "#!/bin/sh\n\nset -e\n\ncd python3\npip install -e .\npython -c 'from i2cdriver import I2CDriver' \ncd ..\n\ncd c\nmake -f linux/Ma"
}
]
// ... and 3 more files (download for full content)
About this extraction
This page contains the full source code of the jamesbowman/i2cdriver GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 114 files (1.1 MB), approximately 512.8k tokens, and a symbol index with 477 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.