Compare commits

...

8 Commits

Author SHA1 Message Date
Klaus Musch 6719daa787
Update README.md 2024-03-25 22:56:22 +01:00
Klaus Musch fb5f75da5a
Update README.md 2024-03-25 22:54:49 +01:00
Klaus Musch 574e34fb96
Update README.md 2024-03-20 07:32:34 +01:00
Matthew Colvin 7c9a0623fd
UI refactor (#50) 2023-10-22 20:35:49 +02:00
Paul Hortiatis 59897369ec
Fixing settings in the abstraction branch (#39)
* Fixing settings

* updating the simulator
2023-09-17 12:14:39 +02:00
Matthew Colvin 6a78c4cfa1
Refine and implement hardware interface (#37) 2023-09-14 06:34:04 +02:00
Matthew Colvin 7a9ee138db
Add platform io sim (#31)
* Lower default SPI Clock

Lowered the default SPI clock as some displays might show glitches with the SPI frequency set above 40MHz.

* Added missing library components

Added the missing library symbols, footprints and 3D-models. These are all in a project-specific library called "omoteLib" (#19)

* Implement MQTT publish in HardwareRevX

Change-Id: I7b6955a662716f83dd8daf34128a353efa26bf80

* add batteryStatus info and allow access to it through the interface.

Change-Id: Ieb748b1478d532f52ffff9edc783de3cbcf9f303

* rename hardwareAbstractionInterface

Change-Id: I39a9bcd7fc4d92b271a40a869faae7870d6d88a1

* rename HardwareAbstractionInterface files

Change-Id: Ifb6a96c38da61cb80aabc6c929e392a2fc91cf29

* fixed a typo

* Re work directory structure to support new architecture

Still need to get the Sim building

* lvgl simulator working.

* put init code into HardwareSimulator Class

* ensure all targets build
remove unused assets.c
add new github actions that reflect new simulator

* clean up build defines by using platform.ini to override default lv_config.
remove unneeded include directory.

Change-Id: Id63baa80dae89977d239a539b5db9ff67266e1d6

* Fix ESP32 Windows build after battling escape characters.
Add esp32 Windows target to Actions.

* Fixed screen height

- corrected the SCREEN_HEIGHT
- small graphical changes in OmoteUI to make it look like in the main branch

---------

Co-authored-by: Max <Max-MKA@web.de>
Co-authored-by: Matthew Colvin <Matthew.Colvin@garmin.com>
Co-authored-by: Matthew Colvin <35540398+Mc067415@users.noreply.github.com>
2023-08-12 00:16:48 +02:00
Matthew Colvin f1ff9ed3d2
Lay the ground work for a hardware abstraction layer (#15)
* Pull out OmoteUI into its own hpp/cpp that
only controls UI/UX
Added HardwareAbstractionInterface to allow UI to be decoupled

Add OmoteUI class/Header to visual studio solution
Bump the compiler to c++17 for std::clamp

* code format
update visual studio solution to build all versions properly

Pull pin defs into config file
use config file to allow USE_SIMULATOR checks in OmoteUI
this will allow the sim to compile in specific code within the UI

* put pin mode config into hardwarerevX class along with some other hardware things. Still lots of work to pull everything into the HAL.

Change-Id: If3cacc43d43670b0ff2233140b1cff66a4aeb48d

* pull Prefrences, IMU interrupt and sleep into the hardware class

Change-Id: I082ae086ed70306789df80eafce8870a5cdfd125

* pull in touch screen, IMU and slow screen wake into hardware

Change-Id: I61b49a6d0551463becbc3bdf1418ac9fde9d9376

* Pull wifi and IR into Hardware RevX
pull last bit of global variables into hardware rev

* un public everything

* clean up simulator build

* rename loop handler
reorder setup to better match the origional main

* Add Loop Handler that updates UI

* Add images to their own file to shrink OmoteUI

* Allow Wifi to be turned off with the macro

* Update Battery Update Task instead of a time based check and update

* Clean up abstract interface
move defenitions out of hardwareRevX.hpp into cpp

* reorder HardwareRevX functions

* Add comment blocks to top of headers

---------

Co-authored-by: Matthew Colvin <35540398+Mc067415@users.noreply.github.com>
Co-authored-by: Matthew Colvin <Matthew.Colvin@garmin.com>
2023-07-31 20:28:10 +02:00
142 changed files with 72027 additions and 2959 deletions

View File

@ -4,7 +4,10 @@ on: [push]
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ windows-latest, ubuntu-latest ]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
@ -22,4 +25,4 @@ jobs:
- name: Build PlatformIO Project - name: Build PlatformIO Project
working-directory: ./Platformio working-directory: ./Platformio
run: pio run run: pio run --environment esp32

View File

@ -0,0 +1,29 @@
name: Windows Simulator Build
on: [push]
jobs:
build-windows:
runs-on: windows-latest
steps:
- uses: msys2/setup-msys2@v2
with:
update: true
install: >-
mingw-w64-x86_64-gcc
mingw-w64-x86_64-SDL2
mingw-w64-x86_64-python
python3-pip
- uses: actions/checkout@v3
- name: Install Platform IOCore
run: pip install --upgrade platformio
- name: Put MSYS2_MinGW64 on PATH
# there is not yet an environment variable for this path from msys2/setup-msys2
run: echo "${{ runner.temp }}/msys64/mingw64/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: Build PlatformIO Project 64 bit sim
working-directory: ./Platformio
run: pio run --environment x64_sim

View File

@ -1,37 +1,28 @@
name: Simulator Build name: Ubuntu Simulator Build
on: [push] on: [push]
jobs: jobs:
build-x64: build-ubuntu:
runs-on: ubuntu-latest
runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: actions/cache@v3
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.1
with: with:
msbuild-architecture: x64 path: |
~/.cache/pip
# You can test your matrix by printing the current dotnet version ~/.platformio/.cache
- name: Build key: ${{ runner.os }}-pio
working-directory: ./LVGL Simulator - uses: actions/setup-python@v4
run: MSBuild.exe ./LVGL.Simulator.sln -target:Build /p:Platform="x64"
build-x86:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.1
with: with:
msbuild-architecture: x86 python-version: "3.9"
- name: Install PlatformIO Core
run: pip install --upgrade platformio
- name: Build - name: Install SDL2
working-directory: ./LVGL Simulator run : sudo apt-get update && sudo apt-get install -y libsdl2-dev
run: MSBuild.exe ./LVGL.Simulator.sln -target:Build /p:Platform="x86"
- name: Build PlatformIO Project 64 bit sim
working-directory: ./Platformio
run: pio run --environment x64_sim

View File

@ -0,0 +1 @@
#include "HardwareSimulator.hpp"

View File

@ -0,0 +1,29 @@
#pragma once
#include "HardwareInterface.h"
#include <iostream>
#include <string>
class HardwareSimulator : public HardwareInterface {
public:
HardwareSimulator() = default;
virtual void debugPrint(std::string message) override {
std::cout << message;
}
virtual void sendIR() override {}
virtual void MQTTPublish(const char *topic, const char *payload) override{
};
virtual void init() override { lv_init(); }
virtual batteryStatus getBatteryPercentage() {
batteryStatus fakeStatus;
fakeStatus.isCharging = false;
fakeStatus.percentage = 100;
fakeStatus.voltage = 4200;
return fakeStatus;
}
};

View File

@ -12,6 +12,10 @@
#include <string> #include <string>
#include "resource.h" #include "resource.h"
#include "omoteconfig.h"
#include "HardwareSimulator.hpp"
#include "OmoteUI.hpp"
#if _MSC_VER >= 1200 #if _MSC_VER >= 1200
// Disable compilation warnings. // Disable compilation warnings.
#pragma warning(push) #pragma warning(push)
@ -42,7 +46,6 @@ bool single_display_mode_initialization()
{ {
return false; return false;
} }
lv_win32_add_all_input_devices_to_group(NULL); lv_win32_add_all_input_devices_to_group(NULL);
return true; return true;
@ -56,10 +59,6 @@ bool g_initialization_status = false;
#define LVGL_SIMULATOR_MAXIMUM_DISPLAYS 16 #define LVGL_SIMULATOR_MAXIMUM_DISPLAYS 16
HWND g_display_window_handles[LVGL_SIMULATOR_MAXIMUM_DISPLAYS]; HWND g_display_window_handles[LVGL_SIMULATOR_MAXIMUM_DISPLAYS];
#define screenWidth 240
#define screenHeight 320
unsigned int __stdcall lv_win32_window_thread_entrypoint( unsigned int __stdcall lv_win32_window_thread_entrypoint(
void *raw_parameter) void *raw_parameter)
{ {
@ -138,8 +137,7 @@ bool multiple_display_mode_initialization()
} }
} }
lv_win32_window_context_t* context = (lv_win32_window_context_t*)( lv_win32_window_context_t *context = (lv_win32_window_context_t *)(lv_win32_get_window_context(g_display_window_handles[0]));
lv_win32_get_window_context(g_display_window_handles[0]));
if (context) if (context)
{ {
lv_win32_pointer_device_object = context->mouse_device_object; lv_win32_pointer_device_object = context->mouse_device_object;
@ -152,721 +150,23 @@ bool multiple_display_mode_initialization()
return true; return true;
} }
lv_obj_t* panel;
byte currentDevice = 4; // Current Device to control (allows switching mappings between devices)
byte virtualKeyMapTechnisat[10] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0 };
bool wakeupByIMUEnabled = true;
int backlight_brightness = 255;
lv_color_t color_primary = lv_color_hex(0x303030); // gray
// Set the page indicator scroll position relative to the tabview scroll position
static void store_scroll_value_event_cb(lv_event_t* e) {
float bias = (150.0 + 8.0) / 240.0;
int offset = 240 / 2 - 150 / 2 - 8 - 50 - 3;
lv_obj_t* screen = lv_event_get_target(e);
lv_obj_scroll_to_x(panel, lv_obj_get_scroll_x(screen) * bias - offset, LV_ANIM_OFF);
}
// Update current device when the tabview page is changes
static void tabview_device_event_cb(lv_event_t* e) {
currentDevice = lv_tabview_get_tab_act(lv_event_get_target(e));
}
// Backlight Slider Event handler
static void bl_slider_event_cb(lv_event_t* e) {
lv_obj_t* slider = lv_event_get_target(e);
backlight_brightness = 255;//constrain(lv_slider_get_value(slider), 60, 255);
}
// Apple Key Event handler
static void appleKey_event_cb(lv_event_t* e) {
}
// Wakeup by IMU Switch Event handler
static void WakeEnableSetting_event_cb(lv_event_t* e) {
wakeupByIMUEnabled = lv_obj_has_state(lv_event_get_target(e), LV_STATE_CHECKED);
}
// Smart Home Toggle Event handler
static void smartHomeToggle_event_cb(lv_event_t* e) {
}
// Smart Home Toggle Event handler
static void smartHomeSlider_event_cb(lv_event_t* e) {
}
// Virtual Keypad Event handler
static void virtualKeypad_event_cb(lv_event_t* e) {
lv_obj_t* target = lv_event_get_target(e);
lv_obj_t* cont = lv_event_get_current_target(e);
if (target == cont) return;
char buffer[100];
sprintf_s(buffer, "check it out: %d\n", virtualKeyMapTechnisat[(int)target->user_data]);
OutputDebugStringA(buffer);
}
#ifndef LV_ATTRIBUTE_MEM_ALIGN #ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN #define LV_ATTRIBUTE_MEM_ALIGN
#endif #endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t gradientLeft_map[] = {
0xfa, 0xf2, 0xea, 0xe2, 0xda, 0xd1, 0xc7, 0xbe, 0xb7, 0xae, 0xa6, 0x9e, 0x95, 0x8d, 0x84, 0x7d, 0x74, 0x6c, 0x62, 0x5a, 0x51, 0x48, 0x41, 0x38, 0x2f, 0x28, 0x1f, 0x17, 0x0f, 0x07,
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t gradientRight_map[] = {
0x07, 0x0f, 0x17, 0x1f, 0x28, 0x2f, 0x38, 0x41, 0x48, 0x51, 0x5a, 0x62, 0x6c, 0x74, 0x7d, 0x84, 0x8d, 0x95, 0x9e, 0xa6, 0xae, 0xb7, 0xbe, 0xc7, 0xd1, 0xda, 0xe2, 0xea, 0xf2, 0xfa,
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t appleTvIcon_map[] = {
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x55, 0xad, 0xdb, 0xde, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x21, 0x34, 0xa5, 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0x55, 0xad, 0xcf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x69, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x65, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0x8a, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0x9a, 0xd6, 0xd7, 0xbd, 0x8e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x73, 0xd7, 0xbd, 0xbb, 0xde, 0x3c, 0xe7, 0xfc, 0xe6, 0x39, 0xce, 0x72, 0x94, 0xa7, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0x8e, 0x73, 0xd7, 0xbd, 0x1c, 0xe7, 0x9e, 0xf7, 0xbe, 0xf7, 0x5d, 0xef, 0x9a, 0xd6, 0x34, 0xa5, 0x28, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x6b, 0xfb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7a, 0xd6, 0x71, 0x8c, 0xa6, 0x31, 0x2d, 0x6b, 0xb6, 0xb5, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xd7, 0xbd, 0xa3, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0xe7, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x69, 0x4a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x14, 0xa5,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xef, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x45, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xe7, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0c, 0x63, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0xeb, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x86, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x31, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xe7, 0x39, 0x00, 0x00,
0x00, 0x00, 0x8e, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xef, 0x86, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xd6, 0x3c, 0xe7, 0x3c, 0xe7, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x96, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xec, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x31, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xd3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xe4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x34, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x28, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x92, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x8a, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x28, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x45, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x75, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xf4, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0x86, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xa3, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xa6, 0x31, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0xef, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x00, 0x00, 0x29, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x39, 0xf3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x31, 0x29, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9c, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x39, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0xd3, 0x9c, 0x51, 0x8c, 0x34, 0xa5, 0x9a, 0xd6, 0xdf, 0xff, 0xf7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x31, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xe7, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0xe7, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x41, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf7, 0x39, 0xce, 0x72, 0x94, 0xcb, 0x5a, 0xa3, 0x18, 0x4d, 0x6b, 0x34, 0xa5, 0xfb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x72, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x7b, 0x3c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xd7, 0xbd, 0xeb, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x73, 0xf8, 0xc5, 0xba, 0xd6, 0xd7, 0xbd, 0xf0, 0x83, 0xa3, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0xf3, 0x9c, 0xf8, 0xc5, 0x59, 0xce, 0x55, 0xad, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x73, 0x76, 0xb5, 0x39, 0xce, 0x7a, 0xd6, 0x39, 0xce, 0xd7, 0xbd, 0xd3, 0x9c, 0xec, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x4a, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x49, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t appleDisplayIcon_map[] = {
0x23, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x3d,
0xaa, 0xfd, 0xad, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0xa1, 0xf7, 0xd8,
0xd0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xd2, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0xff,
0xc6, 0xea, 0x2a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1f, 0xcc, 0xf6,
0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x98,
0x00, 0x44, 0x7b, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7d, 0x56, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xb7, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc0, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xd3, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdb, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t appleBackIcon_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xbe, 0x94,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xe7, 0xff, 0xf0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xfa, 0xff, 0xf5, 0x31,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xfc, 0xff, 0xea, 0x3e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xee, 0xff, 0xe6, 0x48, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0xed, 0xff, 0xe9, 0x39, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x55, 0xfc, 0xff, 0xe7, 0x25, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x59, 0xff, 0xff, 0xe0, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5e, 0xf6, 0xff, 0xdb, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x64, 0xf4, 0xff, 0xd9, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4d, 0xff, 0xff, 0xce, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x6b, 0xff, 0xff, 0x9e, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x9c, 0xff, 0xff, 0xa8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x04, 0x8f, 0xff, 0xff, 0xb5, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x91, 0xff, 0xff, 0xba, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x93, 0xff, 0xff, 0xbb, 0x0a, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0xfc, 0xff, 0xbf, 0x14, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xfb, 0xff, 0xc5, 0x22, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x78, 0xff, 0xff, 0xca, 0x1e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xff, 0xff, 0xd0, 0x11,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6e, 0xfb, 0xff, 0xcc,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xea, 0xca,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x28, 0x18,
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t high_brightness_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5c, 0x8e, 0x04, 0x00, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x04, 0x8e, 0x5c, 0x00, 0x00,
0x00, 0x00, 0x8c, 0xff, 0xa8, 0x01, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x01, 0xa8, 0xff, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x04, 0xa9, 0xf5, 0x0d, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x0d, 0xf5, 0xa9, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x42, 0xd4, 0xff, 0xff, 0xd4, 0x41, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00,
0xbd, 0xcc, 0xbd, 0x0d, 0x11, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x12, 0x0d, 0xbd, 0xcc, 0xbd,
0xbd, 0xcc, 0xbd, 0x0d, 0x11, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0d, 0xbd, 0xcc, 0xbd,
0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x40, 0xd3, 0xff, 0xfe, 0xd2, 0x3f, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x04, 0xa9, 0xf5, 0x0d, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0d, 0xf5, 0xa9, 0x04, 0x00, 0x00,
0x00, 0x00, 0x8c, 0xff, 0xa8, 0x01, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x01, 0xa8, 0xff, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x5c, 0x8e, 0x04, 0x00, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x04, 0x8e, 0x5c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t low_brightness_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x27, 0x72, 0x01, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x01, 0x72, 0x28, 0x00, 0x00,
0x00, 0x00, 0x71, 0xf5, 0x0f, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x0d, 0xf5, 0x73, 0x00, 0x00,
0x00, 0x00, 0x01, 0x0b, 0x00, 0x42, 0xd4, 0xff, 0xff, 0xd4, 0x41, 0x00, 0x0a, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x42, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00,
0x43, 0xbd, 0x0d, 0x11, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x12, 0x0d, 0xbc, 0x44,
0x43, 0xbd, 0x0d, 0x11, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x11, 0x0d, 0xbc, 0x44,
0x00, 0x00, 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x41, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x0b, 0x00, 0x40, 0xd3, 0xfe, 0xff, 0xd2, 0x3f, 0x00, 0x0a, 0x01, 0x00, 0x00,
0x00, 0x00, 0x71, 0xf5, 0x0f, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0d, 0xf5, 0x73, 0x00, 0x00,
0x00, 0x00, 0x27, 0x72, 0x01, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x01, 0x72, 0x28, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST uint8_t lightbulb_map[] = {
0x00, 0x00, 0x00, 0x00, 0x04, 0x1c, 0x1c, 0x04, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x16, 0x95, 0xee, 0xff, 0xff, 0xee, 0x94, 0x15, 0x00, 0x00,
0x00, 0x27, 0xe3, 0xff, 0xcc, 0x8d, 0x8d, 0xcd, 0xff, 0xe1, 0x26, 0x00,
0x07, 0xd9, 0xfa, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xfa, 0xd7, 0x06,
0x65, 0xff, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xff, 0x63,
0xb1, 0xf8, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf8, 0xaf,
0xcc, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xcd,
0xb1, 0xf5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xf1, 0xbd,
0x73, 0xff, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xff, 0x74,
0x0b, 0xd5, 0xfb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0xfb, 0xd9, 0x0b,
0x00, 0x24, 0xef, 0xdc, 0x01, 0x00, 0x00, 0x01, 0xdd, 0xee, 0x24, 0x00,
0x00, 0x00, 0x83, 0xff, 0x30, 0x00, 0x00, 0x30, 0xff, 0x81, 0x00, 0x00,
0x00, 0x00, 0x12, 0x6c, 0x06, 0x00, 0x00, 0x06, 0x6c, 0x12, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x25, 0xc7, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0x25, 0x00, 0x00,
0x00, 0x00, 0x25, 0xc7, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0x25, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1c, 0x76, 0x77, 0x77, 0x76, 0x1c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x69, 0xff, 0xff, 0xff, 0xff, 0x69, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x21, 0x22, 0x22, 0x21, 0x01, 0x00, 0x00, 0x00,
};
int main() int main()
{ {
lv_init(); auto hal = std::make_shared<HardwareSimulator>();
hal->init();
auto ui = OmoteUI::getInstance(hal);
if (!single_display_mode_initialization()) if (!single_display_mode_initialization())
{ {
return -1; return -1;
} }
ui->layout_UI();
// --- LVGL UI Configuration ---
// Set the background color
lv_obj_set_style_bg_color(lv_scr_act(), lv_color_black(), LV_PART_MAIN);
// Setup a scrollable tabview for devices and settings
lv_obj_t* tabview;
tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 0); // Hide tab labels by setting their height to 0
lv_obj_set_style_bg_color(tabview, lv_color_black(), LV_PART_MAIN);
lv_obj_set_size(tabview, screenWidth, 270); // 270 = screenHeight(320) - panel(30) - statusbar(20)
lv_obj_align(tabview, LV_ALIGN_TOP_MID, 0, 20);
// Add 4 tabs (names are irrelevant since the labels are hidden)
lv_obj_t* tab1 = lv_tabview_add_tab(tabview, "Settings");
lv_obj_t* tab2 = lv_tabview_add_tab(tabview, "Technisat");
lv_obj_t* tab3 = lv_tabview_add_tab(tabview, "Apple TV");
lv_obj_t* tab4 = lv_tabview_add_tab(tabview, "Smart Home");
// Configure number button grid
static lv_coord_t col_dsc[] = { LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST }; // equal x distribution
static lv_coord_t row_dsc[] = { 52, 52, 52, 52, LV_GRID_TEMPLATE_LAST }; // manual y distribution to compress the grid a bit
// Create a container with grid for tab2
lv_obj_set_style_pad_all(tab2, 0, LV_PART_MAIN);
lv_obj_t* cont = lv_obj_create(tab2);
lv_obj_set_style_shadow_width(cont, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(cont, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_border_width(cont, 0, LV_PART_MAIN);
lv_obj_set_style_grid_column_dsc_array(cont, col_dsc, 0);
lv_obj_set_style_grid_row_dsc_array(cont, row_dsc, 0);
lv_obj_set_size(cont, 240, 270);
lv_obj_set_layout(cont, LV_LAYOUT_GRID);
lv_obj_align(cont, LV_ALIGN_TOP_MID, 0, 0);
lv_obj_set_style_radius(cont, 0, LV_PART_MAIN);
lv_obj_t* buttonLabel;
lv_obj_t* obj;
// Iterate through grid buttons and configure them
for (int i = 0; i < 12; i++) {
uint8_t col = i % 3;
uint8_t row = i / 3;
// Create the button object
if ((row == 3) && ((col == 0) || (col == 2))) continue; // Do not create a complete fourth row, only a 0 button
obj = lv_btn_create(cont);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1, LV_GRID_ALIGN_STRETCH, row, 1);
lv_obj_set_style_bg_color(obj, color_primary, LV_PART_MAIN);
lv_obj_set_style_radius(obj, 14, LV_PART_MAIN);
lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE); // Clicking a button causes a event in its container
// Create Labels for each button
buttonLabel = lv_label_create(obj);
if (i < 9) {
lv_label_set_text_fmt(buttonLabel, std::to_string(i + 1).c_str(), col, row);
lv_obj_set_user_data(obj, (void*)i); // Add user data so we can identify which button caused the container event
}
else {
lv_label_set_text_fmt(buttonLabel, "0", col, row);
lv_obj_set_user_data(obj, (void*)9);
}
lv_obj_set_style_text_font(buttonLabel, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_center(buttonLabel);
}
// Create a shared event for all button inside container
lv_obj_add_event_cb(cont, virtualKeypad_event_cb, LV_EVENT_CLICKED, NULL);
// Only for the LVGL PC Simulator !!!
lv_img_dsc_t appleTvIcon;
appleTvIcon.header.cf = LV_IMG_CF_TRUE_COLOR;
appleTvIcon.header.always_zero = 0;
appleTvIcon.header.reserved = 0;
appleTvIcon.header.w = 91;
appleTvIcon.header.h = 42;
appleTvIcon.data_size = 3822 * LV_COLOR_SIZE / 8;
appleTvIcon.data = appleTvIcon_map;
lv_img_dsc_t appleDisplayIcon;
appleDisplayIcon.header.cf = LV_IMG_CF_ALPHA_8BIT;
appleDisplayIcon.header.always_zero = 0;
appleDisplayIcon.header.reserved = 0;
appleDisplayIcon.header.w = 25;
appleDisplayIcon.header.h = 20;
appleDisplayIcon.data_size = 500;
appleDisplayIcon.data = appleDisplayIcon_map;
lv_img_dsc_t appleBackIcon;
appleBackIcon.header.cf = LV_IMG_CF_ALPHA_8BIT;
appleBackIcon.header.always_zero = 0;
appleBackIcon.header.reserved = 0;
appleBackIcon.header.w = 13;
appleBackIcon.header.h = 25;
appleBackIcon.data_size = 325;
appleBackIcon.data = appleBackIcon_map;
// Add content to the Apple TV tab (3)
// Add a nice apple tv logo
lv_obj_t* appleImg = lv_img_create(tab3);
lv_img_set_src(appleImg, &appleTvIcon);
lv_obj_align(appleImg, LV_ALIGN_CENTER, 0, -60);
// create two buttons and add their icons accordingly
lv_obj_t* button = lv_btn_create(tab3);
lv_obj_align(button, LV_ALIGN_BOTTOM_LEFT, 10, 0);
lv_obj_set_size(button, 60, 60);
lv_obj_set_style_radius(button, 30, LV_PART_MAIN);
lv_obj_set_style_bg_color(button, color_primary, LV_PART_MAIN);
lv_obj_add_event_cb(button, appleKey_event_cb, LV_EVENT_CLICKED, (void*)1);
appleImg = lv_img_create(button);
lv_img_set_src(appleImg, &appleBackIcon);
lv_obj_set_style_img_recolor(appleImg, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(appleImg, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(appleImg, LV_ALIGN_CENTER, -3, 0);
button = lv_btn_create(tab3);
lv_obj_align(button, LV_ALIGN_BOTTOM_RIGHT, -10, 0);
lv_obj_set_size(button, 60, 60);
lv_obj_set_style_radius(button, 30, LV_PART_MAIN);
lv_obj_set_style_bg_color(button, color_primary, LV_PART_MAIN);
lv_obj_add_event_cb(button, appleKey_event_cb, LV_EVENT_CLICKED, (void*)2);
appleImg = lv_img_create(button);
lv_img_set_src(appleImg, &appleDisplayIcon);
lv_obj_set_style_img_recolor(appleImg, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(appleImg, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(appleImg, LV_ALIGN_CENTER, 0, 0);
// Add content to the settings tab
// With a flex layout, setting groups/boxes will position themselves automatically
lv_obj_set_layout(tab1, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(tab1, LV_SCROLLBAR_MODE_ACTIVE);
// Only for the LVGL PC Simulator !!!
lv_img_dsc_t high_brightness;
high_brightness.header.cf = LV_IMG_CF_ALPHA_8BIT,
high_brightness.header.always_zero = 0,
high_brightness.header.reserved = 0,
high_brightness.header.w = 18,
high_brightness.header.h = 18,
high_brightness.data_size = 352,
high_brightness.data = high_brightness_map;
lv_img_dsc_t low_brightness;
low_brightness.header.cf = LV_IMG_CF_ALPHA_8BIT,
low_brightness.header.always_zero = 0,
low_brightness.header.reserved = 0,
low_brightness.header.w = 16,
low_brightness.header.h = 16,
low_brightness.data_size = 256,
low_brightness.data = low_brightness_map;
// Add a label, then a box for the display settings
lv_obj_t* menuLabel = lv_label_create(tab1);
lv_label_set_text(menuLabel, "Display");
lv_obj_t* menuBox = lv_obj_create(tab1);
lv_obj_set_size(menuBox, lv_pct(100), 109);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
lv_obj_t* brightnessIcon = lv_img_create(menuBox);
lv_img_set_src(brightnessIcon, &low_brightness);
lv_obj_set_style_img_recolor(brightnessIcon, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(brightnessIcon, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(brightnessIcon, LV_ALIGN_TOP_LEFT, 0, 0);
lv_obj_t* slider = lv_slider_create(menuBox);
lv_slider_set_range(slider, 60, 255);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_lighten(color_primary, 50), LV_PART_MAIN);
lv_slider_set_value(slider, backlight_brightness, LV_ANIM_OFF);
lv_obj_set_size(slider, lv_pct(66), 10);
lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 3);
brightnessIcon = lv_img_create(menuBox);
lv_img_set_src(brightnessIcon, &high_brightness);
lv_obj_set_style_img_recolor(brightnessIcon, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(brightnessIcon, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(brightnessIcon, LV_ALIGN_TOP_RIGHT, 0, -1);
lv_obj_add_event_cb(slider, bl_slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Lift to Wake");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 0, 32);
lv_obj_t* wakeToggle = lv_switch_create(menuBox);
lv_obj_set_size(wakeToggle, 40, 22);
lv_obj_align(wakeToggle, LV_ALIGN_TOP_RIGHT, 0, 29);
lv_obj_set_style_bg_color(wakeToggle, lv_color_lighten(color_primary, 50), LV_PART_MAIN);
lv_obj_add_event_cb(wakeToggle, WakeEnableSetting_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
if (wakeupByIMUEnabled) lv_obj_add_state(wakeToggle, LV_STATE_CHECKED); // set default state
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Timeout");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 0, 64);
lv_obj_t* drop = lv_dropdown_create(menuBox);
lv_dropdown_set_options(drop, "10s\n"
"30s\n"
"1m\n"
"3m");
lv_obj_align(drop, LV_ALIGN_TOP_RIGHT, 0, 61);
lv_obj_set_size(drop, 70, 22);
lv_obj_set_style_pad_top(drop, 1, LV_PART_MAIN);
lv_obj_set_style_bg_color(drop, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(drop, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(lv_dropdown_get_list(drop), color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(lv_dropdown_get_list(drop), 1, LV_PART_MAIN);
lv_obj_set_style_border_color(lv_dropdown_get_list(drop), lv_color_darken(color_primary, 40), LV_PART_MAIN);
// Add another label, then a settings box for WiFi
menuLabel = lv_label_create(tab1);
lv_label_set_text(menuLabel, "Wi-Fi");
menuBox = lv_obj_create(tab1);
lv_obj_set_size(menuBox, lv_pct(100), 80);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Network");
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, LV_SYMBOL_RIGHT);
lv_obj_align(menuLabel, LV_ALIGN_TOP_RIGHT, 0, 0);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Password");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 0, 32);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, LV_SYMBOL_RIGHT);
lv_obj_align(menuLabel, LV_ALIGN_TOP_RIGHT, 0, 32);
// Another setting for the battery
menuLabel = lv_label_create(tab1);
lv_label_set_text(menuLabel, "Battery");
menuBox = lv_obj_create(tab1);
lv_obj_set_size(menuBox, lv_pct(100), 125);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
// Add content to the smart home tab (4)
// Only for the LVGL PC Simulator !!!
lv_img_dsc_t lightbulb;
lightbulb.header.cf = LV_IMG_CF_ALPHA_8BIT,
lightbulb.header.always_zero = 0,
lightbulb.header.reserved = 0,
lightbulb.header.w = 12,
lightbulb.header.h = 20,
lightbulb.data_size = 240,
lightbulb.data = lightbulb_map;
lv_obj_set_layout(tab4, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(tab4, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(tab4, LV_SCROLLBAR_MODE_ACTIVE);
// Add a label, then a box for the light controls
menuLabel = lv_label_create(tab4);
lv_label_set_text(menuLabel, "Living Room");
menuBox = lv_obj_create(tab4);
lv_obj_set_size(menuBox, lv_pct(100), 79);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
lv_obj_t* bulbIcon = lv_img_create(menuBox);
lv_img_set_src(bulbIcon, &lightbulb);
lv_obj_set_style_img_recolor(bulbIcon, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(bulbIcon, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(bulbIcon, LV_ALIGN_TOP_LEFT, 0, 0);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Floor Lamp");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 22, 3);
lv_obj_t* lightToggleA = lv_switch_create(menuBox);
lv_obj_set_size(lightToggleA, 40, 22);
lv_obj_align(lightToggleA, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_set_style_bg_color(lightToggleA, lv_color_lighten(color_primary, 50), LV_PART_MAIN);
lv_obj_set_style_bg_color(lightToggleA, color_primary, LV_PART_INDICATOR);
lv_obj_add_event_cb(lightToggleA, smartHomeToggle_event_cb, LV_EVENT_VALUE_CHANGED, (void*)1);
slider = lv_slider_create(menuBox);
lv_slider_set_range(slider, 60, 255);
lv_obj_set_style_bg_color(slider, lv_color_lighten(lv_color_black(), 30), LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_color(slider, lv_color_lighten(lv_palette_main(LV_PALETTE_AMBER), 180), LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_dir(slider, LV_GRAD_DIR_HOR, LV_PART_INDICATOR);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider, 255, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_lighten(color_primary, 50), LV_PART_MAIN);
lv_slider_set_value(slider, 255, LV_ANIM_OFF);
lv_obj_set_size(slider, lv_pct(90), 10);
lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 37);
lv_obj_add_event_cb(slider, smartHomeSlider_event_cb, LV_EVENT_VALUE_CHANGED, (void*)1);
// Add another menu box for a second appliance
menuBox = lv_obj_create(tab4);
lv_obj_set_size(menuBox, lv_pct(100), 79);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
bulbIcon = lv_img_create(menuBox);
lv_img_set_src(bulbIcon, &lightbulb);
lv_obj_set_style_img_recolor(bulbIcon, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(bulbIcon, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(bulbIcon, LV_ALIGN_TOP_LEFT, 0, 0);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Ceiling Light");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 22, 3);
lv_obj_t* lightToggleB = lv_switch_create(menuBox);
lv_obj_set_size(lightToggleB, 40, 22);
lv_obj_align(lightToggleB, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_set_style_bg_color(lightToggleB, lv_color_lighten(color_primary, 50), LV_PART_MAIN);
lv_obj_set_style_bg_color(lightToggleB, color_primary, LV_PART_INDICATOR);
lv_obj_add_event_cb(lightToggleB, smartHomeToggle_event_cb, LV_EVENT_VALUE_CHANGED, (void*)2);
slider = lv_slider_create(menuBox);
lv_slider_set_range(slider, 60, 255);
lv_obj_set_style_bg_color(slider, lv_color_lighten(lv_color_black(), 30), LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_color(slider, lv_color_lighten(lv_palette_main(LV_PALETTE_AMBER), 180), LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_dir(slider, LV_GRAD_DIR_HOR, LV_PART_INDICATOR);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider, 255, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_lighten(color_primary, 50), LV_PART_MAIN);
lv_slider_set_value(slider, 255, LV_ANIM_OFF);
lv_obj_set_size(slider, lv_pct(90), 10);
lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 37);
lv_obj_add_event_cb(slider, smartHomeSlider_event_cb, LV_EVENT_VALUE_CHANGED, (void*)2);
// Add another room (empty for now)
menuLabel = lv_label_create(tab4);
lv_label_set_text(menuLabel, "Kitchen");
menuBox = lv_obj_create(tab4);
lv_obj_set_size(menuBox, lv_pct(100), 79);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
// Set current page according to the current Device
lv_tabview_set_act(tabview, currentDevice, LV_ANIM_OFF);
// Create a page indicator
panel = lv_obj_create(lv_scr_act());
lv_obj_clear_flag(panel, LV_OBJ_FLAG_CLICKABLE); // this indicator will not be clickable
lv_obj_set_size(panel, screenWidth, 30);
lv_obj_set_flex_flow(panel, LV_FLEX_FLOW_ROW);
lv_obj_align(panel, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_scrollbar_mode(panel, LV_SCROLLBAR_MODE_OFF);
// This small hidden button enables the page indicator to scroll further
lv_obj_t* btn = lv_btn_create(panel);
lv_obj_set_size(btn, 50, lv_pct(100));
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_opa(btn, LV_OPA_TRANSP, LV_PART_MAIN);
// Create actual (non-clickable) buttons for every tab
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
lv_obj_t* label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Settings");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Technisat");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Apple TV");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Smart Home");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
// This small hidden button enables the page indicator to scroll further
btn = lv_btn_create(panel);
lv_obj_set_size(btn, 50, lv_pct(100));
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_opa(btn, LV_OPA_TRANSP, LV_PART_MAIN);
// Make the indicator scroll together with the tabs by creating a scroll event
lv_obj_add_event_cb(lv_tabview_get_content(tabview), store_scroll_value_event_cb, LV_EVENT_SCROLL, NULL);
lv_obj_add_event_cb(tabview, tabview_device_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
// Initialize scroll position for the indicator
lv_event_send(lv_tabview_get_content(tabview), LV_EVENT_SCROLL, NULL);
// Style the panel background
static lv_style_t style_btn;
lv_style_init(&style_btn);
lv_style_set_pad_all(&style_btn, 3);
lv_style_set_border_width(&style_btn, 0);
lv_style_set_bg_opa(&style_btn, LV_OPA_TRANSP);
lv_obj_add_style(panel, &style_btn, 0);
// Only for the LVGL PC Simulator !!!
lv_img_dsc_t gradientLeft;
gradientLeft.header.cf = LV_IMG_CF_ALPHA_8BIT;
gradientLeft.header.always_zero = 0;
gradientLeft.header.reserved = 0;
gradientLeft.header.w = 30;
gradientLeft.header.h = 1;
gradientLeft.data_size = 30;
gradientLeft.data = gradientLeft_map;
lv_img_dsc_t gradientRight;
gradientRight.header.cf = LV_IMG_CF_ALPHA_8BIT;
gradientRight.header.always_zero = 0;
gradientRight.header.reserved = 0;
gradientRight.header.w = 30;
gradientRight.header.h = 1;
gradientRight.data_size = 30;
gradientRight.data = gradientRight_map;
// Make the indicator fade out at the sides using gradient bitmaps
lv_obj_t* img1 = lv_img_create(lv_scr_act());
lv_img_set_src(img1, &gradientLeft);
lv_obj_align(img1, LV_ALIGN_BOTTOM_LEFT, 0, 0);
lv_obj_set_size(img1, 30, 30); // stretch the 1-pixel high image to 30px
lv_obj_t* img2 = lv_img_create(lv_scr_act());
lv_img_set_src(img2, &gradientRight);
lv_obj_align(img2, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_set_size(img2, 30, 30);
// Create a status bar
lv_obj_t* statusbar = lv_btn_create(lv_scr_act());
lv_obj_set_size(statusbar, 240, 20);
lv_obj_set_style_shadow_width(statusbar, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(statusbar, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_radius(statusbar, 0, LV_PART_MAIN);
lv_obj_align(statusbar, LV_ALIGN_TOP_MID, 0, 0);
lv_obj_t* WifiLabel = lv_label_create(statusbar);
lv_label_set_text(WifiLabel, LV_SYMBOL_WIFI);
lv_obj_align(WifiLabel, LV_ALIGN_LEFT_MID, -8, 0);
lv_obj_set_style_text_font(WifiLabel, &lv_font_montserrat_12, LV_PART_MAIN);
lv_obj_t* objBattPercentage = lv_label_create(statusbar);
lv_label_set_text(objBattPercentage, "");
lv_obj_align(objBattPercentage, LV_ALIGN_RIGHT_MID, -16, 0);
lv_obj_set_style_text_font(objBattPercentage, &lv_font_montserrat_12, LV_PART_MAIN);
lv_obj_t* objBattIcon = lv_label_create(statusbar);
lv_label_set_text(objBattIcon, LV_SYMBOL_BATTERY_EMPTY);
lv_obj_align(objBattIcon, LV_ALIGN_RIGHT_MID, 8, 0);
lv_obj_set_style_text_font(objBattIcon, &lv_font_montserrat_16, LV_PART_MAIN);
while (!lv_win32_quit_signal) while (!lv_win32_quit_signal)
{ {
@ -876,7 +176,6 @@ int main()
// OutputDebugStringW(); // OutputDebugStringW();
// lv_label_set_text_fmt(scrollPos, "%d %d", lv_obj_get_scroll_x(lv_tabview_get_content(tabview)), lv_obj_get_scroll_x(panel)); // lv_label_set_text_fmt(scrollPos, "%d %d", lv_obj_get_scroll_x(lv_tabview_get_content(tabview)), lv_obj_get_scroll_x(panel));
Sleep(1); Sleep(1);
} }

View File

@ -9,6 +9,7 @@
<MileProjectType>ConsoleApplication</MileProjectType> <MileProjectType>ConsoleApplication</MileProjectType>
<MileProjectManifestFile>LVGL.Simulator.manifest</MileProjectManifestFile> <MileProjectManifestFile>LVGL.Simulator.manifest</MileProjectManifestFile>
<MileProjectEnableVCLTLSupport>true</MileProjectEnableVCLTLSupport> <MileProjectEnableVCLTLSupport>true</MileProjectEnableVCLTLSupport>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)'=='Debug'"> <PropertyGroup Label="Configuration" Condition="'$(Configuration)'=='Debug'">
<SupportLTL>false</SupportLTL> <SupportLTL>false</SupportLTL>
@ -18,6 +19,9 @@
<PropertyGroup> <PropertyGroup>
<IncludePath>$(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)..\LvglPlatform\lvgl\;$(MSBuildThisFileDirectory)..\LvglPlatform\;$(IncludePath)</IncludePath> <IncludePath>$(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)..\LvglPlatform\lvgl\;$(MSBuildThisFileDirectory)..\LvglPlatform\;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<SourcePath>$(VC_SourcePath);</SourcePath>
</PropertyGroup>
<ItemDefinitionGroup> <ItemDefinitionGroup>
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
@ -32,10 +36,19 @@
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">stdcpp17</LanguageStandard> <LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">stdcpp17</LanguageStandard>
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">stdcpp17</LanguageStandard> <LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link>
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<Import Project="LVGL.Portable.vcxitems" /> <Import Project="LVGL.Portable.vcxitems" />
<Import Project="LVGL.Drivers.vcxitems" /> <Import Project="LVGL.Drivers.vcxitems" />
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\Platformio\include\OmoteUI\HardwareInterface.h" />
<ClInclude Include="..\..\Platformio\include\OmoteUI\Images.hpp" />
<ClInclude Include="..\..\Platformio\include\OmoteUI\OmoteUI.hpp" />
<ClInclude Include="HardwareSimulator.hpp" />
<ClInclude Include="omoteconfig.h" />
<ClInclude Include="lv_conf.h" /> <ClInclude Include="lv_conf.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -49,7 +62,11 @@
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="LVGL.Simulator.cpp" /> <ClCompile Include="..\..\Platformio\src\OmoteUI.cpp" />
<ClCompile Include="HardwareSimulator.cpp" />
<ClCompile Include="LVGL.Simulator.cpp">
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">stdcpp17</LanguageStandard>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="LVGL.Simulator.rc" /> <ResourceCompile Include="LVGL.Simulator.rc" />

View File

@ -5,6 +5,17 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="lv_conf.h" /> <ClInclude Include="lv_conf.h" />
<ClInclude Include="lv_drv_conf.h" /> <ClInclude Include="lv_drv_conf.h" />
<ClInclude Include="HardwareSimulator.hpp" />
<ClInclude Include="..\..\Platformio\include\OmoteUI\OmoteUI.hpp">
<Filter>OmoteUI</Filter>
</ClInclude>
<ClInclude Include="omoteconfig.h" />
<ClInclude Include="..\..\Platformio\include\OmoteUI\Images.hpp">
<Filter>OmoteUI</Filter>
</ClInclude>
<ClInclude Include="..\..\Platformio\include\OmoteUI\HardwareInterface.h">
<Filter>OmoteUI</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Manifest Include="LVGL.Simulator.manifest" /> <Manifest Include="LVGL.Simulator.manifest" />
@ -15,6 +26,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="LVGL.Simulator.cpp" /> <ClCompile Include="LVGL.Simulator.cpp" />
<ClCompile Include="HardwareSimulator.cpp" />
<ClCompile Include="..\..\Platformio\src\OmoteUI.cpp">
<Filter>OmoteUI</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="LVGL.Simulator.rc" /> <ResourceCompile Include="LVGL.Simulator.rc" />
@ -25,4 +40,9 @@
<ItemGroup> <ItemGroup>
<None Include="freetype.props" /> <None Include="freetype.props" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Filter Include="OmoteUI">
<UniqueIdentifier>{0b1f99aa-73cb-482d-9d62-20e17f93b890}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,6 @@
#pragma once
#define IS_SIMULATOR true
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 360

View File

@ -379,7 +379,7 @@
(stroke (width 0) (type solid)) (fill solid) (layer "F.SilkS") (tstamp 51db3da6-9e43-47ce-9571-e63cf05ae317)) (stroke (width 0) (type solid)) (fill solid) (layer "F.SilkS") (tstamp 51db3da6-9e43-47ce-9571-e63cf05ae317))
) )
(footprint "mkern:LED_5mm_Side_Mount" locked (layer "F.Cu") (footprint "omoteLib:LED_5mm_Side_Mount" locked (layer "F.Cu")
(tstamp 028982f1-ec49-4f15-a3a1-367832d00d71) (tstamp 028982f1-ec49-4f15-a3a1-367832d00d71)
(at 59.676677 102 90) (at 59.676677 102 90)
(descr "5mm LED for horizontal soldering to the board edge") (descr "5mm LED for horizontal soldering to the board edge")
@ -466,7 +466,7 @@
(net 48 "GND") (pinfunction "K") (pintype "passive") (tstamp 71289672-541a-40f3-bb92-b36055f6b1d6)) (net 48 "GND") (pinfunction "K") (pintype "passive") (tstamp 71289672-541a-40f3-bb92-b36055f6b1d6))
(pad "2" smd rect locked (at -1.275 3.5 90) (size 1.5 5) (layers "F.Cu" "F.Paste" "F.Mask") (pad "2" smd rect locked (at -1.275 3.5 90) (size 1.5 5) (layers "F.Cu" "F.Paste" "F.Mask")
(net 14 "Net-(D2-A)") (pinfunction "A") (pintype "passive") (tstamp ffb8b095-3661-40af-83bd-a02a8d8ca89c)) (net 14 "Net-(D2-A)") (pinfunction "A") (pintype "passive") (tstamp ffb8b095-3661-40af-83bd-a02a8d8ca89c))
(model "${KICAD_USER_3DMODEL_DIR}/Side Mount LED v1.step" (model "${KIPRJMOD}/project_libraries/3D-models/Side Mount LED v1.step"
(offset (xyz 0 0 0.25)) (offset (xyz 0 0 0.25))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz 90 0 0)) (rotate (xyz 90 0 0))
@ -648,7 +648,7 @@
) )
) )
(footprint "mkern:JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_Vertical" (layer "F.Cu") (footprint "omoteLib:JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_Vertical" (layer "F.Cu")
(tstamp 06c0ec99-fe4f-4c5e-9492-8f7abb1bea3e) (tstamp 06c0ec99-fe4f-4c5e-9492-8f7abb1bea3e)
(at 224.9 113.5 90) (at 224.9 113.5 90)
(descr "JST PH series connector, B2B-PH-SM4-TB (http://www.jst-mfg.com/product/pdf/eng/ePH.pdf), generated with kicad-footprint-generator") (descr "JST PH series connector, B2B-PH-SM4-TB (http://www.jst-mfg.com/product/pdf/eng/ePH.pdf), generated with kicad-footprint-generator")
@ -729,7 +729,7 @@
(net 48 "GND") (pinfunction "Pin_2") (pintype "passive") (tstamp a8674511-9189-4417-9af0-7e68e5f383e2)) (net 48 "GND") (pinfunction "Pin_2") (pintype "passive") (tstamp a8674511-9189-4417-9af0-7e68e5f383e2))
(pad "MP" smd roundrect (at -3.4 -1.75 90) (size 1.6 3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15625) (tstamp 7ec99062-2840-4ac6-8a0d-545eb56296d1)) (pad "MP" smd roundrect (at -3.4 -1.75 90) (size 1.6 3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15625) (tstamp 7ec99062-2840-4ac6-8a0d-545eb56296d1))
(pad "MP" smd roundrect (at 3.4 -1.75 90) (size 1.6 3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15625) (tstamp 2c9323e8-8263-4b88-b05b-7ff99f5bc2b5)) (pad "MP" smd roundrect (at 3.4 -1.75 90) (size 1.6 3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15625) (tstamp 2c9323e8-8263-4b88-b05b-7ff99f5bc2b5))
(model "${KICAD_USER_3DMODEL_DIR}/B2B-PH-SM4-TB.STEP" (model "${KIPRJMOD}/project_libraries/3D-models/B2B-PH-SM4-TB.STEP"
(offset (xyz -4 3.25 0)) (offset (xyz -4 3.25 0))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz -90 0 0)) (rotate (xyz -90 0 0))
@ -1029,7 +1029,7 @@
(property "ki_keywords" "cap capacitor") (property "ki_keywords" "cap capacitor")
(path "/5d818a81-71ff-4f40-8854-04efda688b48") (path "/5d818a81-71ff-4f40-8854-04efda688b48")
(attr smd) (attr smd)
(fp_text reference "C13" (at -3.25 -1.68) (layer "F.SilkS") (fp_text reference "C13" (at -3.238895 0.068182) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15))) (effects (font (size 1 1) (thickness 0.15)))
(tstamp 15439bba-04d4-4528-ad0e-855324eb39a5) (tstamp 15439bba-04d4-4528-ad0e-855324eb39a5)
) )
@ -1370,7 +1370,7 @@
) )
) )
(footprint "mkern:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm_ThermalVias_MR" (layer "F.Cu") (footprint "omoteLib:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm_ThermalVias_MR" (layer "F.Cu")
(tstamp 21878e1b-21e2-436e-9384-827df816db75) (tstamp 21878e1b-21e2-436e-9384-827df816db75)
(at 76.85 91.55) (at 76.85 91.55)
(descr "QFN, 48 Pin (https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC2041_datasheet.pdf#page=62), generated with kicad-footprint-generator ipc_noLead_generator.py") (descr "QFN, 48 Pin (https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC2041_datasheet.pdf#page=62), generated with kicad-footprint-generator ipc_noLead_generator.py")
@ -1615,7 +1615,7 @@
) )
) )
(footprint "mkern:XDCR_LIS3DHTR" (layer "F.Cu") (footprint "omoteLib:XDCR_LIS3DHTR" (layer "F.Cu")
(tstamp 230440db-a366-4510-924d-f45962ca2d45) (tstamp 230440db-a366-4510-924d-f45962ca2d45)
(at 89.75 84.786992 90) (at 89.75 84.786992 90)
(property "MANUFACTURER" "STMicroelectronics") (property "MANUFACTURER" "STMicroelectronics")
@ -1694,7 +1694,7 @@
(net 97 "unconnected-(U5-ADC2-Pad15)") (pinfunction "ADC2") (pintype "input+no_connect") (solder_paste_margin_ratio -0.05) (tstamp 0d3a3e5a-4358-4958-b320-6834c31fe10c)) (net 97 "unconnected-(U5-ADC2-Pad15)") (pinfunction "ADC2") (pintype "input+no_connect") (solder_paste_margin_ratio -0.05) (tstamp 0d3a3e5a-4358-4958-b320-6834c31fe10c))
(pad "16" smd rect (at -0.5 -1.3 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (pad "16" smd rect (at -0.5 -1.3 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(net 98 "unconnected-(U5-ADC1-Pad16)") (pinfunction "ADC1") (pintype "input+no_connect") (solder_paste_margin_ratio -0.05) (tstamp 9aa4f2f5-5d32-456f-89d1-63571efbe5d2)) (net 98 "unconnected-(U5-ADC1-Pad16)") (pinfunction "ADC1") (pintype "input+no_connect") (solder_paste_margin_ratio -0.05) (tstamp 9aa4f2f5-5d32-456f-89d1-63571efbe5d2))
(model "${KICAD_USER_3DMODEL_DIR}/LIS3DHTR.step" (model "${KIPRJMOD}/project_libraries/3D-models/LIS3DHTR.step"
(offset (xyz 0 0 0)) (offset (xyz 0 0 0))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz -90 0 0)) (rotate (xyz -90 0 0))
@ -4052,7 +4052,7 @@
(stroke (width 0) (type solid)) (fill solid) (layer "F.Mask") (tstamp 299dc0c1-5c29-4cd1-b7d9-0cce8367cfa3)) (stroke (width 0) (type solid)) (fill solid) (layer "F.Mask") (tstamp 299dc0c1-5c29-4cd1-b7d9-0cce8367cfa3))
) )
(footprint "mkern:TFT_2.83IN_240X320_50PIN" locked (layer "F.Cu") (footprint "omoteLib:TFT_2.83IN_240X320_50PIN" locked (layer "F.Cu")
(tstamp 5a621486-0b9c-4ec0-862b-29bd1b417bb9) (tstamp 5a621486-0b9c-4ec0-862b-29bd1b417bb9)
(at 91.622852 102 90) (at 91.622852 102 90)
(property "Sheetfile" "Remote.kicad_sch") (property "Sheetfile" "Remote.kicad_sch")
@ -4766,12 +4766,12 @@
(net 48 "GND") (pinfunction "MP") (pintype "passive") (solder_mask_margin 0.1016) (tstamp 4eb426d9-e540-47c5-9b76-3e1d32abc52e)) (net 48 "GND") (pinfunction "MP") (pintype "passive") (solder_mask_margin 0.1016) (tstamp 4eb426d9-e540-47c5-9b76-3e1d32abc52e))
(pad "MP" smd roundrect locked (at 14.35 13.09 270) (size 2.4 2.4) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.125) (pad "MP" smd roundrect locked (at 14.35 13.09 270) (size 2.4 2.4) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.125)
(net 48 "GND") (pinfunction "MP") (pintype "passive") (solder_mask_margin 0.1016) (tstamp 2e81d339-fff0-4f74-96c2-d969d63a15e6)) (net 48 "GND") (pinfunction "MP") (pintype "passive") (solder_mask_margin 0.1016) (tstamp 2e81d339-fff0-4f74-96c2-d969d63a15e6))
(model "${KICAD_USER_3DMODEL_DIR}/541325062_colored.step" (model "${KIPRJMOD}/project_libraries/3D-models/541325062_colored.step"
(offset (xyz 0 -15.5 0)) (offset (xyz 0 -15.5 0))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz 0 0 0)) (rotate (xyz 0 0 0))
) )
(model "${KICAD_USER_3DMODEL_DIR}/280QV10 v5.step" (model "${KIPRJMOD}/project_libraries/3D-models/280QV10 v5.step"
(offset (xyz 0 -22.25 -6)) (offset (xyz 0 -22.25 -6))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz 180 0 180)) (rotate (xyz 180 0 180))
@ -4932,7 +4932,7 @@
) )
) )
(footprint "mkern:Heimdall vertical" (layer "F.Cu") (footprint "omoteLib:Heimdall vertical" (layer "F.Cu")
(tstamp 5d2b74c8-ea79-4f25-99fd-c78691bddaa1) (tstamp 5d2b74c8-ea79-4f25-99fd-c78691bddaa1)
(at 55.4 116.3 90) (at 55.4 116.3 90)
(descr "VISHAY Heimdall for TSSP77038") (descr "VISHAY Heimdall for TSSP77038")
@ -4989,7 +4989,7 @@
(net 87 "IR_VCC") (pinfunction "Vs") (pintype "power_in") (tstamp 122ac044-9956-47ad-90b3-cd90dd9d6e84)) (net 87 "IR_VCC") (pinfunction "Vs") (pintype "power_in") (tstamp 122ac044-9956-47ad-90b3-cd90dd9d6e84))
(pad "4" smd rect (at 1.9 0.7 180) (size 2 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (pad "4" smd rect (at 1.9 0.7 180) (size 2 0.8) (layers "F.Cu" "F.Paste" "F.Mask")
(net 48 "GND") (pinfunction "GND") (pintype "power_in") (tstamp a399ed69-ca57-4198-ac99-c2971749e3d2)) (net 48 "GND") (pinfunction "GND") (pintype "power_in") (tstamp a399ed69-ca57-4198-ac99-c2971749e3d2))
(model "${KICAD_USER_3DMODEL_DIR}/82672Heimdall.stp" (model "${KIPRJMOD}/project_libraries/3D-models/82672Heimdall.stp"
(offset (xyz 0 -1.2 1.6)) (offset (xyz 0 -1.2 1.6))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz -90 0 -180)) (rotate (xyz -90 0 -180))
@ -6445,7 +6445,7 @@
(property "ki_keywords" "cap capacitor") (property "ki_keywords" "cap capacitor")
(path "/a888a00f-5496-4d09-af9f-455dba2d8767") (path "/a888a00f-5496-4d09-af9f-455dba2d8767")
(attr smd) (attr smd)
(fp_text reference "C14" (at 3.5 -1.85) (layer "F.SilkS") (fp_text reference "C14" (at 3.488895 -0.14998) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15))) (effects (font (size 1 1) (thickness 0.15)))
(tstamp 5ecdc16d-4df0-4830-8429-f936a2864918) (tstamp 5ecdc16d-4df0-4830-8429-f936a2864918)
) )
@ -8289,7 +8289,7 @@
) )
) )
(footprint "mkern:RFANT5220110A2T" (layer "F.Cu") (footprint "omoteLib:RFANT5220110A2T" (layer "F.Cu")
(tstamp cdd38a2c-3189-4b09-aa8d-b7b99e8e71b9) (tstamp cdd38a2c-3189-4b09-aa8d-b7b99e8e71b9)
(at 55.500146 85.711992) (at 55.500146 85.711992)
(descr "Walsin RFANT5220110A2T SMD antenna 2400-2500Mhz, 2dBi, http://www.passivecomponent.com/wp-content/uploads/2013/12/ASC_RFANT5220110A2T_V03.pdf") (descr "Walsin RFANT5220110A2T SMD antenna 2400-2500Mhz, 2dBi, http://www.passivecomponent.com/wp-content/uploads/2013/12/ASC_RFANT5220110A2T_V03.pdf")
@ -8339,7 +8339,7 @@
(pad "" smd roundrect (at -2.7 0) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.208333) (tstamp cc86c1ac-e652-4e6f-8b3b-2ad7dcf806b0)) (pad "" smd roundrect (at -2.7 0) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.208333) (tstamp cc86c1ac-e652-4e6f-8b3b-2ad7dcf806b0))
(pad "1" smd roundrect (at 2.7 0 180) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.208333) (pad "1" smd roundrect (at 2.7 0 180) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.208333)
(net 3 "Net-(AE1-A)") (pinfunction "A") (pintype "input") (tstamp 5f31508e-8dcd-4d96-b5f5-cf3f4a95c613)) (net 3 "Net-(AE1-A)") (pinfunction "A") (pintype "input") (tstamp 5f31508e-8dcd-4d96-b5f5-cf3f4a95c613))
(model "${KICAD_USER_3DMODEL_DIR}/Walsin RFANT5220110A2T v1.step" (model "${KIPRJMOD}/project_libraries/3D-models/Walsin RFANT5220110A2T v1.step"
(offset (xyz 0 0 0)) (offset (xyz 0 0 0))
(scale (xyz 1 1 1)) (scale (xyz 1 1 1))
(rotate (xyz -90 0 -90)) (rotate (xyz -90 0 -90))
@ -8955,7 +8955,7 @@
) )
) )
(footprint "mkern:USB_C_Receptacle_HRO_TYPE-C-31-M-12" (layer "F.Cu") (footprint "omoteLib:USB_C_Receptacle_HRO_TYPE-C-31-M-12" (layer "F.Cu")
(tstamp ed154c17-7f27-4787-a05a-0859bc96f71a) (tstamp ed154c17-7f27-4787-a05a-0859bc96f71a)
(at 241 102 90) (at 241 102 90)
(descr "USB Type-C receptacle for USB 2.0 and PD, http://www.krhro.com/uploads/soft/180320/1-1P320120243.pdf") (descr "USB Type-C receptacle for USB 2.0 and PD, http://www.krhro.com/uploads/soft/180320/1-1P320120243.pdf")

View File

@ -486,10 +486,10 @@
}, },
"libraries": { "libraries": {
"pinned_footprint_libs": [ "pinned_footprint_libs": [
"mkern" "omoteLib"
], ],
"pinned_symbol_libs": [ "pinned_symbol_libs": [
"mkern" "omoteLib"
] ]
}, },
"meta": { "meta": {

View File

@ -2801,7 +2801,7 @@
(property "Value" "TSSP77038" (at -1.27 8.89 0) (property "Value" "TSSP77038" (at -1.27 8.89 0)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Footprint" "mkern:Heimdall vertical" (at -1.27 -11.43 0) (property "Footprint" "omoteLib:Heimdall vertical" (at -1.27 -11.43 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "https://www.vishay.com/docs/82470/tssp770.pdf" (at 16.51 7.62 0) (property "Datasheet" "https://www.vishay.com/docs/82470/tssp770.pdf" (at 16.51 7.62 0)
@ -3023,14 +3023,14 @@
) )
) )
) )
(symbol "mkern:Conn_01x50" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) (symbol "omoteLib:Conn_01x50" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 63.5 0) (property "Reference" "J" (at 0 63.5 0)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Value" "Conn_01x50" (at 0 -66.04 0) (property "Value" "Conn_01x50" (at 0 -66.04 0)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Footprint" "mkern:TFT_2.83IN_240X320_50PIN" (at 1.27 -68.58 0) (property "Footprint" "omoteLib:TFT_2.83IN_240X320_50PIN" (at 1.27 -68.58 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "~" (at 0 12.7 0) (property "Datasheet" "~" (at 0 12.7 0)
@ -3456,7 +3456,7 @@
) )
) )
) )
(symbol "mkern:LIS3DHTR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) (symbol "omoteLib:LIS3DHTR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U5" (at 0 19.05 0) (property "Reference" "U5" (at 0 19.05 0)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
@ -3552,7 +3552,7 @@
) )
) )
) )
(symbol "mkern:USBLC6-2P6" (in_bom yes) (on_board yes) (symbol "omoteLib:USBLC6-2P6" (in_bom yes) (on_board yes)
(property "Reference" "U4" (at -7.62 8.89 0) (property "Reference" "U4" (at -7.62 8.89 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
@ -8755,7 +8755,7 @@
(property "Value" "TSSP77038" (at 256.54 193.04 0) (property "Value" "TSSP77038" (at 256.54 193.04 0)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Footprint" "mkern:Heimdall vertical" (at 256.54 213.36 0) (property "Footprint" "omoteLib:Heimdall vertical" (at 256.54 213.36 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "https://www.vishay.com/docs/82470/tssp770.pdf" (at 274.32 194.31 0) (property "Datasheet" "https://www.vishay.com/docs/82470/tssp770.pdf" (at 274.32 194.31 0)
@ -8880,7 +8880,7 @@
) )
) )
(symbol (lib_id "mkern:LIS3DHTR") (at 360.68 49.53 0) (mirror y) (unit 1) (symbol (lib_id "omoteLib:LIS3DHTR") (at 360.68 49.53 0) (mirror y) (unit 1)
(in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
(uuid 55d86592-c3da-4fa7-ba6d-9e58f1452184) (uuid 55d86592-c3da-4fa7-ba6d-9e58f1452184)
(property "Reference" "U5" (at 360.68 30.48 0) (property "Reference" "U5" (at 360.68 30.48 0)
@ -9677,7 +9677,7 @@
(property "Value" "USB_C_Receptacle_USB2.0" (at 35.56 30.48 0) (property "Value" "USB_C_Receptacle_USB2.0" (at 35.56 30.48 0)
(effects (font (size 1.27 1.27))) (effects (font (size 1.27 1.27)))
) )
(property "Footprint" "mkern:USB_C_Receptacle_HRO_TYPE-C-31-M-12" (at 39.37 50.8 0) (property "Footprint" "omoteLib:USB_C_Receptacle_HRO_TYPE-C-31-M-12" (at 39.37 50.8 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "https://www.usb.org/sites/default/files/documents/usb_type-c.zip" (at 39.37 50.8 0) (property "Datasheet" "https://www.usb.org/sites/default/files/documents/usb_type-c.zip" (at 39.37 50.8 0)
@ -9978,7 +9978,7 @@
(property "Value" "JST_PH_B2B-PH" (at 118.11 172.7199 0) (property "Value" "JST_PH_B2B-PH" (at 118.11 172.7199 0)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "mkern:JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_Vertical" (at 116.84 170.18 0) (property "Footprint" "omoteLib:JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_Vertical" (at 116.84 170.18 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "~" (at 116.84 170.18 0) (property "Datasheet" "~" (at 116.84 170.18 0)
@ -10207,7 +10207,7 @@
) )
) )
(symbol (lib_id "mkern:USBLC6-2P6") (at 78.74 46.99 0) (unit 1) (symbol (lib_id "omoteLib:USBLC6-2P6") (at 78.74 46.99 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no) (in_bom yes) (on_board yes) (dnp no)
(uuid 885c377e-7c82-4de5-841b-480084fa7f04) (uuid 885c377e-7c82-4de5-841b-480084fa7f04)
(property "Reference" "U4" (at 71.12 38.1 0) (property "Reference" "U4" (at 71.12 38.1 0)
@ -10581,7 +10581,7 @@
(property "Value" "SFH4346" (at 207.01 219.5829 90) (property "Value" "SFH4346" (at 207.01 219.5829 90)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "mkern:LED_5mm_Side_Mount" (at 200.025 217.17 0) (property "Footprint" "omoteLib:LED_5mm_Side_Mount" (at 200.025 217.17 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "http://cdn-reichelt.de/documents/datenblatt/A500/SFH4346.pdf" (at 204.47 218.44 0) (property "Datasheet" "http://cdn-reichelt.de/documents/datenblatt/A500/SFH4346.pdf" (at 204.47 218.44 0)
@ -10627,7 +10627,7 @@
) )
) )
(symbol (lib_id "mkern:Conn_01x50") (at 384.81 172.72 0) (unit 1) (symbol (lib_id "omoteLib:Conn_01x50") (at 384.81 172.72 0) (unit 1)
(in_bom yes) (on_board yes) (dnp no) (in_bom yes) (on_board yes) (dnp no)
(uuid 91bb894d-766b-45a5-9f77-face96a8d77b) (uuid 91bb894d-766b-45a5-9f77-face96a8d77b)
(property "Reference" "J2" (at 378.46 105.41 0) (property "Reference" "J2" (at 378.46 105.41 0)
@ -10636,7 +10636,7 @@
(property "Value" "Conn_01x50" (at 378.46 107.95 0) (property "Value" "Conn_01x50" (at 378.46 107.95 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "mkern:TFT_2.83IN_240X320_50PIN" (at 386.08 241.3 0) (property "Footprint" "omoteLib:TFT_2.83IN_240X320_50PIN" (at 386.08 241.3 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "~" (at 384.81 160.02 0) (property "Datasheet" "~" (at 384.81 160.02 0)
@ -10765,7 +10765,7 @@
(property "Value" "ESP32-PICO-D4" (at 240.7794 119.38 0) (property "Value" "ESP32-PICO-D4" (at 240.7794 119.38 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "mkern:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm_ThermalVias_MR" (at 238.76 119.38 0) (property "Footprint" "omoteLib:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm_ThermalVias_MR" (at 238.76 119.38 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf" (at 245.11 101.6 0) (property "Datasheet" "https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf" (at 245.11 101.6 0)
@ -10965,7 +10965,7 @@
(property "Value" "Antenna" (at 275.59 24.13 0) (property "Value" "Antenna" (at 275.59 24.13 0)
(effects (font (size 1.27 1.27)) (justify left)) (effects (font (size 1.27 1.27)) (justify left))
) )
(property "Footprint" "mkern:RFANT5220110A2T" (at 285.75 24.13 0) (property "Footprint" "omoteLib:RFANT5220110A2T" (at 285.75 24.13 0)
(effects (font (size 1.27 1.27)) hide) (effects (font (size 1.27 1.27)) hide)
) )
(property "Datasheet" "~" (at 285.75 24.13 0) (property "Datasheet" "~" (at 285.75 24.13 0)

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,519 @@
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
* from STEP Tools, Inc. (www.steptools.com)
*/
FILE_DESCRIPTION(
/* description */ (''),
/* implementation_level */ '2;1');
FILE_NAME(
/* name */ 'Side Mount LED v1.step',
/* time_stamp */ '2023-01-06T17:22:44+01:00',
/* author */ (''),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v19.2',
/* originating_system */ 'Autodesk Translation Framework v11.17.0.187',
/* authorisation */ '');
FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }'));
ENDSEC;
DATA;
#10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#25,#26,
#27,#28,#29,#30),#430);
#11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#437,#12);
#12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#13),#429);
#13=MANIFOLD_SOLID_BREP('K\X\F6rper1',#257);
#14=SPHERICAL_SURFACE('',#286,2.5);
#15=FACE_BOUND('',#58,.T.);
#16=FACE_BOUND('',#62,.T.);
#17=FACE_BOUND('',#63,.T.);
#18=CIRCLE('',#282,3.);
#19=CIRCLE('',#283,3.);
#20=CIRCLE('',#285,2.5);
#21=CIRCLE('',#287,2.5);
#22=CIRCLE('',#288,2.5);
#23=CYLINDRICAL_SURFACE('',#281,3.);
#24=CYLINDRICAL_SURFACE('',#289,2.5);
#25=STYLED_ITEM('',(#447),#252);
#26=STYLED_ITEM('',(#447),#253);
#27=STYLED_ITEM('',(#447),#254);
#28=STYLED_ITEM('',(#447),#255);
#29=STYLED_ITEM('',(#447),#256);
#30=STYLED_ITEM('',(#446),#13);
#31=FACE_OUTER_BOUND('',#46,.T.);
#32=FACE_OUTER_BOUND('',#47,.T.);
#33=FACE_OUTER_BOUND('',#48,.T.);
#34=FACE_OUTER_BOUND('',#49,.T.);
#35=FACE_OUTER_BOUND('',#50,.T.);
#36=FACE_OUTER_BOUND('',#51,.T.);
#37=FACE_OUTER_BOUND('',#52,.T.);
#38=FACE_OUTER_BOUND('',#53,.T.);
#39=FACE_OUTER_BOUND('',#54,.T.);
#40=FACE_OUTER_BOUND('',#55,.T.);
#41=FACE_OUTER_BOUND('',#56,.T.);
#42=FACE_OUTER_BOUND('',#57,.T.);
#43=FACE_OUTER_BOUND('',#59,.T.);
#44=FACE_OUTER_BOUND('',#60,.T.);
#45=FACE_OUTER_BOUND('',#61,.T.);
#46=EDGE_LOOP('',(#168,#169,#170,#171));
#47=EDGE_LOOP('',(#172,#173,#174,#175));
#48=EDGE_LOOP('',(#176,#177,#178,#179));
#49=EDGE_LOOP('',(#180,#181,#182,#183));
#50=EDGE_LOOP('',(#184,#185,#186,#187));
#51=EDGE_LOOP('',(#188,#189,#190,#191));
#52=EDGE_LOOP('',(#192,#193,#194,#195));
#53=EDGE_LOOP('',(#196,#197,#198,#199));
#54=EDGE_LOOP('',(#200,#201,#202,#203));
#55=EDGE_LOOP('',(#204,#205,#206,#207));
#56=EDGE_LOOP('',(#208,#209,#210,#211));
#57=EDGE_LOOP('',(#212));
#58=EDGE_LOOP('',(#213));
#59=EDGE_LOOP('',(#214,#215,#216));
#60=EDGE_LOOP('',(#217,#218,#219,#220));
#61=EDGE_LOOP('',(#221));
#62=EDGE_LOOP('',(#222,#223,#224,#225));
#63=EDGE_LOOP('',(#226,#227,#228,#229));
#64=LINE('',#363,#90);
#65=LINE('',#365,#91);
#66=LINE('',#367,#92);
#67=LINE('',#368,#93);
#68=LINE('',#371,#94);
#69=LINE('',#373,#95);
#70=LINE('',#374,#96);
#71=LINE('',#377,#97);
#72=LINE('',#379,#98);
#73=LINE('',#380,#99);
#74=LINE('',#382,#100);
#75=LINE('',#383,#101);
#76=LINE('',#388,#102);
#77=LINE('',#390,#103);
#78=LINE('',#392,#104);
#79=LINE('',#393,#105);
#80=LINE('',#396,#106);
#81=LINE('',#398,#107);
#82=LINE('',#399,#108);
#83=LINE('',#402,#109);
#84=LINE('',#404,#110);
#85=LINE('',#405,#111);
#86=LINE('',#407,#112);
#87=LINE('',#408,#113);
#88=LINE('',#414,#114);
#89=LINE('',#425,#115);
#90=VECTOR('',#295,10.);
#91=VECTOR('',#296,10.);
#92=VECTOR('',#297,10.);
#93=VECTOR('',#298,10.);
#94=VECTOR('',#301,10.);
#95=VECTOR('',#302,10.);
#96=VECTOR('',#303,10.);
#97=VECTOR('',#306,10.);
#98=VECTOR('',#307,10.);
#99=VECTOR('',#308,10.);
#100=VECTOR('',#311,10.);
#101=VECTOR('',#312,10.);
#102=VECTOR('',#317,10.);
#103=VECTOR('',#318,10.);
#104=VECTOR('',#319,10.);
#105=VECTOR('',#320,10.);
#106=VECTOR('',#323,10.);
#107=VECTOR('',#324,10.);
#108=VECTOR('',#325,10.);
#109=VECTOR('',#328,10.);
#110=VECTOR('',#329,10.);
#111=VECTOR('',#330,10.);
#112=VECTOR('',#333,10.);
#113=VECTOR('',#334,10.);
#114=VECTOR('',#341,2.5);
#115=VECTOR('',#356,2.5);
#116=VERTEX_POINT('',#361);
#117=VERTEX_POINT('',#362);
#118=VERTEX_POINT('',#364);
#119=VERTEX_POINT('',#366);
#120=VERTEX_POINT('',#370);
#121=VERTEX_POINT('',#372);
#122=VERTEX_POINT('',#376);
#123=VERTEX_POINT('',#378);
#124=VERTEX_POINT('',#386);
#125=VERTEX_POINT('',#387);
#126=VERTEX_POINT('',#389);
#127=VERTEX_POINT('',#391);
#128=VERTEX_POINT('',#395);
#129=VERTEX_POINT('',#397);
#130=VERTEX_POINT('',#401);
#131=VERTEX_POINT('',#403);
#132=VERTEX_POINT('',#411);
#133=VERTEX_POINT('',#413);
#134=VERTEX_POINT('',#417);
#135=VERTEX_POINT('',#420);
#136=VERTEX_POINT('',#422);
#137=EDGE_CURVE('',#116,#117,#64,.T.);
#138=EDGE_CURVE('',#116,#118,#65,.T.);
#139=EDGE_CURVE('',#119,#118,#66,.T.);
#140=EDGE_CURVE('',#117,#119,#67,.T.);
#141=EDGE_CURVE('',#117,#120,#68,.T.);
#142=EDGE_CURVE('',#121,#119,#69,.T.);
#143=EDGE_CURVE('',#120,#121,#70,.T.);
#144=EDGE_CURVE('',#120,#122,#71,.T.);
#145=EDGE_CURVE('',#123,#121,#72,.T.);
#146=EDGE_CURVE('',#122,#123,#73,.T.);
#147=EDGE_CURVE('',#122,#116,#74,.T.);
#148=EDGE_CURVE('',#118,#123,#75,.T.);
#149=EDGE_CURVE('',#124,#125,#76,.T.);
#150=EDGE_CURVE('',#124,#126,#77,.T.);
#151=EDGE_CURVE('',#127,#126,#78,.T.);
#152=EDGE_CURVE('',#125,#127,#79,.T.);
#153=EDGE_CURVE('',#125,#128,#80,.T.);
#154=EDGE_CURVE('',#129,#127,#81,.T.);
#155=EDGE_CURVE('',#128,#129,#82,.T.);
#156=EDGE_CURVE('',#128,#130,#83,.T.);
#157=EDGE_CURVE('',#131,#129,#84,.T.);
#158=EDGE_CURVE('',#130,#131,#85,.T.);
#159=EDGE_CURVE('',#130,#124,#86,.T.);
#160=EDGE_CURVE('',#126,#131,#87,.T.);
#161=EDGE_CURVE('',#132,#132,#18,.F.);
#162=EDGE_CURVE('',#132,#133,#88,.T.);
#163=EDGE_CURVE('',#133,#133,#19,.F.);
#164=EDGE_CURVE('',#134,#134,#20,.T.);
#165=EDGE_CURVE('',#135,#135,#21,.T.);
#166=EDGE_CURVE('',#136,#135,#22,.T.);
#167=EDGE_CURVE('',#135,#134,#89,.T.);
#168=ORIENTED_EDGE('',*,*,#137,.F.);
#169=ORIENTED_EDGE('',*,*,#138,.T.);
#170=ORIENTED_EDGE('',*,*,#139,.F.);
#171=ORIENTED_EDGE('',*,*,#140,.F.);
#172=ORIENTED_EDGE('',*,*,#141,.F.);
#173=ORIENTED_EDGE('',*,*,#140,.T.);
#174=ORIENTED_EDGE('',*,*,#142,.F.);
#175=ORIENTED_EDGE('',*,*,#143,.F.);
#176=ORIENTED_EDGE('',*,*,#144,.F.);
#177=ORIENTED_EDGE('',*,*,#143,.T.);
#178=ORIENTED_EDGE('',*,*,#145,.F.);
#179=ORIENTED_EDGE('',*,*,#146,.F.);
#180=ORIENTED_EDGE('',*,*,#147,.F.);
#181=ORIENTED_EDGE('',*,*,#146,.T.);
#182=ORIENTED_EDGE('',*,*,#148,.F.);
#183=ORIENTED_EDGE('',*,*,#138,.F.);
#184=ORIENTED_EDGE('',*,*,#148,.T.);
#185=ORIENTED_EDGE('',*,*,#145,.T.);
#186=ORIENTED_EDGE('',*,*,#142,.T.);
#187=ORIENTED_EDGE('',*,*,#139,.T.);
#188=ORIENTED_EDGE('',*,*,#149,.F.);
#189=ORIENTED_EDGE('',*,*,#150,.T.);
#190=ORIENTED_EDGE('',*,*,#151,.F.);
#191=ORIENTED_EDGE('',*,*,#152,.F.);
#192=ORIENTED_EDGE('',*,*,#153,.F.);
#193=ORIENTED_EDGE('',*,*,#152,.T.);
#194=ORIENTED_EDGE('',*,*,#154,.F.);
#195=ORIENTED_EDGE('',*,*,#155,.F.);
#196=ORIENTED_EDGE('',*,*,#156,.F.);
#197=ORIENTED_EDGE('',*,*,#155,.T.);
#198=ORIENTED_EDGE('',*,*,#157,.F.);
#199=ORIENTED_EDGE('',*,*,#158,.F.);
#200=ORIENTED_EDGE('',*,*,#159,.F.);
#201=ORIENTED_EDGE('',*,*,#158,.T.);
#202=ORIENTED_EDGE('',*,*,#160,.F.);
#203=ORIENTED_EDGE('',*,*,#150,.F.);
#204=ORIENTED_EDGE('',*,*,#160,.T.);
#205=ORIENTED_EDGE('',*,*,#157,.T.);
#206=ORIENTED_EDGE('',*,*,#154,.T.);
#207=ORIENTED_EDGE('',*,*,#151,.T.);
#208=ORIENTED_EDGE('',*,*,#161,.F.);
#209=ORIENTED_EDGE('',*,*,#162,.T.);
#210=ORIENTED_EDGE('',*,*,#163,.T.);
#211=ORIENTED_EDGE('',*,*,#162,.F.);
#212=ORIENTED_EDGE('',*,*,#161,.T.);
#213=ORIENTED_EDGE('',*,*,#164,.F.);
#214=ORIENTED_EDGE('',*,*,#165,.T.);
#215=ORIENTED_EDGE('',*,*,#166,.F.);
#216=ORIENTED_EDGE('',*,*,#166,.T.);
#217=ORIENTED_EDGE('',*,*,#165,.F.);
#218=ORIENTED_EDGE('',*,*,#167,.T.);
#219=ORIENTED_EDGE('',*,*,#164,.T.);
#220=ORIENTED_EDGE('',*,*,#167,.F.);
#221=ORIENTED_EDGE('',*,*,#163,.F.);
#222=ORIENTED_EDGE('',*,*,#137,.T.);
#223=ORIENTED_EDGE('',*,*,#141,.T.);
#224=ORIENTED_EDGE('',*,*,#144,.T.);
#225=ORIENTED_EDGE('',*,*,#147,.T.);
#226=ORIENTED_EDGE('',*,*,#149,.T.);
#227=ORIENTED_EDGE('',*,*,#153,.T.);
#228=ORIENTED_EDGE('',*,*,#156,.T.);
#229=ORIENTED_EDGE('',*,*,#159,.T.);
#230=PLANE('',#271);
#231=PLANE('',#272);
#232=PLANE('',#273);
#233=PLANE('',#274);
#234=PLANE('',#275);
#235=PLANE('',#276);
#236=PLANE('',#277);
#237=PLANE('',#278);
#238=PLANE('',#279);
#239=PLANE('',#280);
#240=PLANE('',#284);
#241=PLANE('',#290);
#242=ADVANCED_FACE('',(#31),#230,.T.);
#243=ADVANCED_FACE('',(#32),#231,.T.);
#244=ADVANCED_FACE('',(#33),#232,.T.);
#245=ADVANCED_FACE('',(#34),#233,.T.);
#246=ADVANCED_FACE('',(#35),#234,.T.);
#247=ADVANCED_FACE('',(#36),#235,.T.);
#248=ADVANCED_FACE('',(#37),#236,.T.);
#249=ADVANCED_FACE('',(#38),#237,.T.);
#250=ADVANCED_FACE('',(#39),#238,.T.);
#251=ADVANCED_FACE('',(#40),#239,.T.);
#252=ADVANCED_FACE('',(#41),#23,.T.);
#253=ADVANCED_FACE('',(#42,#15),#240,.T.);
#254=ADVANCED_FACE('',(#43),#14,.T.);
#255=ADVANCED_FACE('',(#44),#24,.T.);
#256=ADVANCED_FACE('',(#45,#16,#17),#241,.F.);
#257=CLOSED_SHELL('',(#242,#243,#244,#245,#246,#247,#248,#249,#250,#251,
#252,#253,#254,#255,#256));
#258=DERIVED_UNIT_ELEMENT(#260,1.);
#259=DERIVED_UNIT_ELEMENT(#432,-3.);
#260=(
MASS_UNIT()
NAMED_UNIT(*)
SI_UNIT(.KILO.,.GRAM.)
);
#261=DERIVED_UNIT((#258,#259));
#262=MEASURE_REPRESENTATION_ITEM('density measure',
POSITIVE_RATIO_MEASURE(7850.),#261);
#263=PROPERTY_DEFINITION_REPRESENTATION(#268,#265);
#264=PROPERTY_DEFINITION_REPRESENTATION(#269,#266);
#265=REPRESENTATION('material name',(#267),#429);
#266=REPRESENTATION('density',(#262),#429);
#267=DESCRIPTIVE_REPRESENTATION_ITEM('Stahl','Stahl');
#268=PROPERTY_DEFINITION('material property','material name',#439);
#269=PROPERTY_DEFINITION('material property','density of part',#439);
#270=AXIS2_PLACEMENT_3D('placement',#359,#291,#292);
#271=AXIS2_PLACEMENT_3D('',#360,#293,#294);
#272=AXIS2_PLACEMENT_3D('',#369,#299,#300);
#273=AXIS2_PLACEMENT_3D('',#375,#304,#305);
#274=AXIS2_PLACEMENT_3D('',#381,#309,#310);
#275=AXIS2_PLACEMENT_3D('',#384,#313,#314);
#276=AXIS2_PLACEMENT_3D('',#385,#315,#316);
#277=AXIS2_PLACEMENT_3D('',#394,#321,#322);
#278=AXIS2_PLACEMENT_3D('',#400,#326,#327);
#279=AXIS2_PLACEMENT_3D('',#406,#331,#332);
#280=AXIS2_PLACEMENT_3D('',#409,#335,#336);
#281=AXIS2_PLACEMENT_3D('',#410,#337,#338);
#282=AXIS2_PLACEMENT_3D('',#412,#339,#340);
#283=AXIS2_PLACEMENT_3D('',#415,#342,#343);
#284=AXIS2_PLACEMENT_3D('',#416,#344,#345);
#285=AXIS2_PLACEMENT_3D('',#418,#346,#347);
#286=AXIS2_PLACEMENT_3D('',#419,#348,#349);
#287=AXIS2_PLACEMENT_3D('',#421,#350,#351);
#288=AXIS2_PLACEMENT_3D('',#423,#352,#353);
#289=AXIS2_PLACEMENT_3D('',#424,#354,#355);
#290=AXIS2_PLACEMENT_3D('',#426,#357,#358);
#291=DIRECTION('axis',(0.,0.,1.));
#292=DIRECTION('refdir',(1.,0.,0.));
#293=DIRECTION('center_axis',(0.,1.,0.));
#294=DIRECTION('ref_axis',(1.,0.,0.));
#295=DIRECTION('',(-1.,0.,0.));
#296=DIRECTION('',(0.,0.,-1.));
#297=DIRECTION('',(1.,0.,0.));
#298=DIRECTION('',(0.,0.,-1.));
#299=DIRECTION('center_axis',(-1.,0.,0.));
#300=DIRECTION('ref_axis',(0.,1.,0.));
#301=DIRECTION('',(0.,-1.,0.));
#302=DIRECTION('',(0.,1.,0.));
#303=DIRECTION('',(0.,0.,-1.));
#304=DIRECTION('center_axis',(2.77555756156289E-16,-1.,0.));
#305=DIRECTION('ref_axis',(-1.,-2.77555756156289E-16,0.));
#306=DIRECTION('',(1.,2.77555756156289E-16,0.));
#307=DIRECTION('',(-1.,-2.77555756156289E-16,0.));
#308=DIRECTION('',(0.,0.,-1.));
#309=DIRECTION('center_axis',(1.,-5.55111512312578E-16,0.));
#310=DIRECTION('ref_axis',(-5.55111512312578E-16,-1.,0.));
#311=DIRECTION('',(5.55111512312578E-16,1.,0.));
#312=DIRECTION('',(-5.55111512312578E-16,-1.,0.));
#313=DIRECTION('center_axis',(0.,0.,-1.));
#314=DIRECTION('ref_axis',(-1.,0.,0.));
#315=DIRECTION('center_axis',(-6.93889390390723E-17,1.,0.));
#316=DIRECTION('ref_axis',(1.,6.93889390390723E-17,0.));
#317=DIRECTION('',(-1.,-6.93889390390723E-17,0.));
#318=DIRECTION('',(0.,0.,-1.));
#319=DIRECTION('',(1.,6.93889390390723E-17,0.));
#320=DIRECTION('',(0.,0.,-1.));
#321=DIRECTION('center_axis',(-1.,0.,0.));
#322=DIRECTION('ref_axis',(0.,1.,0.));
#323=DIRECTION('',(0.,-1.,0.));
#324=DIRECTION('',(0.,1.,0.));
#325=DIRECTION('',(0.,0.,-1.));
#326=DIRECTION('center_axis',(0.,-1.,0.));
#327=DIRECTION('ref_axis',(-1.,0.,0.));
#328=DIRECTION('',(1.,0.,0.));
#329=DIRECTION('',(-1.,0.,0.));
#330=DIRECTION('',(0.,0.,-1.));
#331=DIRECTION('center_axis',(1.,0.,0.));
#332=DIRECTION('ref_axis',(0.,-1.,0.));
#333=DIRECTION('',(0.,1.,0.));
#334=DIRECTION('',(0.,-1.,0.));
#335=DIRECTION('center_axis',(0.,0.,-1.));
#336=DIRECTION('ref_axis',(-1.,0.,0.));
#337=DIRECTION('center_axis',(0.,0.,1.));
#338=DIRECTION('ref_axis',(1.,0.,0.));
#339=DIRECTION('center_axis',(0.,0.,-1.));
#340=DIRECTION('ref_axis',(1.,0.,0.));
#341=DIRECTION('',(0.,0.,-1.));
#342=DIRECTION('center_axis',(0.,0.,-1.));
#343=DIRECTION('ref_axis',(1.,0.,0.));
#344=DIRECTION('center_axis',(0.,0.,1.));
#345=DIRECTION('ref_axis',(1.,0.,0.));
#346=DIRECTION('center_axis',(0.,0.,1.));
#347=DIRECTION('ref_axis',(1.,0.,0.));
#348=DIRECTION('center_axis',(6.12323399573677E-17,0.,1.));
#349=DIRECTION('ref_axis',(1.,0.,0.));
#350=DIRECTION('center_axis',(0.,0.,1.));
#351=DIRECTION('ref_axis',(1.,0.,0.));
#352=DIRECTION('center_axis',(1.22464679914735E-16,-1.,0.));
#353=DIRECTION('ref_axis',(-1.,-1.22464679914735E-16,0.));
#354=DIRECTION('center_axis',(0.,0.,1.));
#355=DIRECTION('ref_axis',(1.,0.,0.));
#356=DIRECTION('',(0.,0.,-1.));
#357=DIRECTION('center_axis',(0.,0.,1.));
#358=DIRECTION('ref_axis',(1.,0.,0.));
#359=CARTESIAN_POINT('',(0.,0.,0.));
#360=CARTESIAN_POINT('Origin',(1.02,0.25,0.));
#361=CARTESIAN_POINT('',(1.52,0.25,0.));
#362=CARTESIAN_POINT('',(1.02,0.25,0.));
#363=CARTESIAN_POINT('',(0.51,0.25,0.));
#364=CARTESIAN_POINT('',(1.52,0.25,-5.));
#365=CARTESIAN_POINT('',(1.52,0.25,0.));
#366=CARTESIAN_POINT('',(1.02,0.25,-5.));
#367=CARTESIAN_POINT('',(1.02,0.25,-5.));
#368=CARTESIAN_POINT('',(1.02,0.25,0.));
#369=CARTESIAN_POINT('Origin',(1.02,-0.25,0.));
#370=CARTESIAN_POINT('',(1.02,-0.25,0.));
#371=CARTESIAN_POINT('',(1.02,-0.125,0.));
#372=CARTESIAN_POINT('',(1.02,-0.25,-5.));
#373=CARTESIAN_POINT('',(1.02,-0.25,-5.));
#374=CARTESIAN_POINT('',(1.02,-0.25,0.));
#375=CARTESIAN_POINT('Origin',(1.52,-0.25,0.));
#376=CARTESIAN_POINT('',(1.52,-0.25,0.));
#377=CARTESIAN_POINT('',(0.76,-0.25,0.));
#378=CARTESIAN_POINT('',(1.52,-0.25,-5.));
#379=CARTESIAN_POINT('',(1.52,-0.25,-5.));
#380=CARTESIAN_POINT('',(1.52,-0.25,0.));
#381=CARTESIAN_POINT('Origin',(1.52,0.25,0.));
#382=CARTESIAN_POINT('',(1.52,0.125,0.));
#383=CARTESIAN_POINT('',(1.52,0.25,-5.));
#384=CARTESIAN_POINT('Origin',(1.27,2.08166817117217E-16,-5.));
#385=CARTESIAN_POINT('Origin',(-1.52,0.25,0.));
#386=CARTESIAN_POINT('',(-1.02,0.25,0.));
#387=CARTESIAN_POINT('',(-1.52,0.25,0.));
#388=CARTESIAN_POINT('',(-0.76,0.25,0.));
#389=CARTESIAN_POINT('',(-1.02,0.25,-5.));
#390=CARTESIAN_POINT('',(-1.02,0.25,0.));
#391=CARTESIAN_POINT('',(-1.52,0.25,-5.));
#392=CARTESIAN_POINT('',(-1.52,0.25,-5.));
#393=CARTESIAN_POINT('',(-1.52,0.25,0.));
#394=CARTESIAN_POINT('Origin',(-1.52,-0.25,0.));
#395=CARTESIAN_POINT('',(-1.52,-0.25,0.));
#396=CARTESIAN_POINT('',(-1.52,-0.125,0.));
#397=CARTESIAN_POINT('',(-1.52,-0.25,-5.));
#398=CARTESIAN_POINT('',(-1.52,-0.25,-5.));
#399=CARTESIAN_POINT('',(-1.52,-0.25,0.));
#400=CARTESIAN_POINT('Origin',(-1.02,-0.25,0.));
#401=CARTESIAN_POINT('',(-1.02,-0.25,0.));
#402=CARTESIAN_POINT('',(-0.51,-0.25,0.));
#403=CARTESIAN_POINT('',(-1.02,-0.25,-5.));
#404=CARTESIAN_POINT('',(-1.02,-0.25,-5.));
#405=CARTESIAN_POINT('',(-1.02,-0.25,0.));
#406=CARTESIAN_POINT('Origin',(-1.02,0.25,0.));
#407=CARTESIAN_POINT('',(-1.02,0.125,0.));
#408=CARTESIAN_POINT('',(-1.02,0.25,-5.));
#409=CARTESIAN_POINT('Origin',(-1.27,-2.42861286636753E-16,-5.));
#410=CARTESIAN_POINT('Origin',(0.,0.,0.));
#411=CARTESIAN_POINT('',(-3.,3.67394039744206E-16,1.));
#412=CARTESIAN_POINT('Origin',(0.,0.,1.));
#413=CARTESIAN_POINT('',(-3.,3.67394039744206E-16,0.));
#414=CARTESIAN_POINT('',(-3.,-3.67394039744206E-16,0.));
#415=CARTESIAN_POINT('Origin',(0.,0.,0.));
#416=CARTESIAN_POINT('Origin',(0.,0.,1.));
#417=CARTESIAN_POINT('',(-2.5,-3.06161699786838E-16,1.));
#418=CARTESIAN_POINT('Origin',(0.,0.,1.));
#419=CARTESIAN_POINT('Origin',(0.,0.,6.5));
#420=CARTESIAN_POINT('',(-2.5,-3.06161699786838E-16,6.5));
#421=CARTESIAN_POINT('Origin',(0.,0.,6.5));
#422=CARTESIAN_POINT('',(-1.53080849893419E-16,-1.87469972832732E-32,9.));
#423=CARTESIAN_POINT('Origin',(0.,0.,6.5));
#424=CARTESIAN_POINT('Origin',(0.,0.,0.));
#425=CARTESIAN_POINT('',(-2.5,-3.06161699786838E-16,0.));
#426=CARTESIAN_POINT('Origin',(0.,0.,0.));
#427=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#431,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#428=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#431,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#429=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#427))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#431,#433,#434))
REPRESENTATION_CONTEXT('','3D')
);
#430=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#428))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#431,#433,#434))
REPRESENTATION_CONTEXT('','3D')
);
#431=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#432=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT($,.METRE.)
);
#433=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#434=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#435=SHAPE_DEFINITION_REPRESENTATION(#436,#437);
#436=PRODUCT_DEFINITION_SHAPE('',$,#439);
#437=SHAPE_REPRESENTATION('',(#270),#429);
#438=PRODUCT_DEFINITION_CONTEXT('part definition',#443,'design');
#439=PRODUCT_DEFINITION('Side Mount LED','Side Mount LED v1',#440,#438);
#440=PRODUCT_DEFINITION_FORMATION('',$,#445);
#441=PRODUCT_RELATED_PRODUCT_CATEGORY('Side Mount LED v1',
'Side Mount LED v1',(#445));
#442=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2009,#443);
#443=APPLICATION_CONTEXT(
'Core Data for Automotive Mechanical Design Process');
#444=PRODUCT_CONTEXT('part definition',#443,'mechanical');
#445=PRODUCT('Side Mount LED','Side Mount LED v1',$,(#444));
#446=PRESENTATION_STYLE_ASSIGNMENT((#448));
#447=PRESENTATION_STYLE_ASSIGNMENT((#449));
#448=SURFACE_STYLE_USAGE(.BOTH.,#450);
#449=SURFACE_STYLE_USAGE(.BOTH.,#451);
#450=SURFACE_SIDE_STYLE('',(#452));
#451=SURFACE_SIDE_STYLE('',(#453));
#452=SURFACE_STYLE_FILL_AREA(#454);
#453=SURFACE_STYLE_FILL_AREA(#455);
#454=FILL_AREA_STYLE('Stahl - satiniert',(#456));
#455=FILL_AREA_STYLE('Acryl (klar)',(#457));
#456=FILL_AREA_STYLE_COLOUR('Stahl - satiniert',#458);
#457=FILL_AREA_STYLE_COLOUR('Acryl (klar)',#459);
#458=COLOUR_RGB('Stahl - satiniert',0.627450980392157,0.627450980392157,
0.627450980392157);
#459=COLOUR_RGB('Acryl (klar)',0.964705882352941,0.964705882352941,0.952941176470588);
ENDSEC;
END-ISO-10303-21;

View File

@ -0,0 +1,512 @@
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
* from STEP Tools, Inc. (www.steptools.com)
*/
FILE_DESCRIPTION(
/* description */ (''),
/* implementation_level */ '2;1');
FILE_NAME(
/* name */ 'Walsin RFANT5220110A2T v1.step',
/* time_stamp */ '2023-01-20T22:36:29+01:00',
/* author */ (''),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v19.2',
/* originating_system */ 'Autodesk Translation Framework v11.17.0.187',
/* authorisation */ '');
FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }'));
ENDSEC;
DATA;
#10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#232,#233,
#234,#235,#236,#237),#413);
#11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#420,#12);
#12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#13),#412);
#13=MANIFOLD_SOLID_BREP('K\X\F6rper1',#253);
#14=FACE_OUTER_BOUND('',#29,.T.);
#15=FACE_OUTER_BOUND('',#30,.T.);
#16=FACE_OUTER_BOUND('',#31,.T.);
#17=FACE_OUTER_BOUND('',#32,.T.);
#18=FACE_OUTER_BOUND('',#33,.T.);
#19=FACE_OUTER_BOUND('',#34,.T.);
#20=FACE_OUTER_BOUND('',#35,.T.);
#21=FACE_OUTER_BOUND('',#36,.T.);
#22=FACE_OUTER_BOUND('',#37,.T.);
#23=FACE_OUTER_BOUND('',#38,.T.);
#24=FACE_OUTER_BOUND('',#39,.T.);
#25=FACE_OUTER_BOUND('',#40,.T.);
#26=FACE_OUTER_BOUND('',#41,.T.);
#27=FACE_OUTER_BOUND('',#42,.T.);
#28=FACE_OUTER_BOUND('',#43,.T.);
#29=EDGE_LOOP('',(#155,#156,#157,#158));
#30=EDGE_LOOP('',(#159,#160,#161,#162));
#31=EDGE_LOOP('',(#163,#164,#165,#166));
#32=EDGE_LOOP('',(#167,#168,#169,#170));
#33=EDGE_LOOP('',(#171,#172,#173,#174,#175));
#34=EDGE_LOOP('',(#176,#177,#178,#179));
#35=EDGE_LOOP('',(#180,#181,#182,#183));
#36=EDGE_LOOP('',(#184,#185,#186,#187));
#37=EDGE_LOOP('',(#188,#189,#190,#191));
#38=EDGE_LOOP('',(#192,#193,#194,#195));
#39=EDGE_LOOP('',(#196,#197,#198,#199));
#40=EDGE_LOOP('',(#200,#201,#202,#203,#204));
#41=EDGE_LOOP('',(#205,#206,#207,#208));
#42=EDGE_LOOP('',(#209,#210,#211,#212));
#43=EDGE_LOOP('',(#213,#214,#215,#216));
#44=LINE('',#349,#75);
#45=LINE('',#351,#76);
#46=LINE('',#353,#77);
#47=LINE('',#354,#78);
#48=LINE('',#357,#79);
#49=LINE('',#359,#80);
#50=LINE('',#360,#81);
#51=LINE('',#363,#82);
#52=LINE('',#365,#83);
#53=LINE('',#366,#84);
#54=LINE('',#369,#85);
#55=LINE('',#371,#86);
#56=LINE('',#372,#87);
#57=LINE('',#375,#88);
#58=LINE('',#376,#89);
#59=LINE('',#379,#90);
#60=LINE('',#381,#91);
#61=LINE('',#382,#92);
#62=LINE('',#385,#93);
#63=LINE('',#387,#94);
#64=LINE('',#389,#95);
#65=LINE('',#390,#96);
#66=LINE('',#392,#97);
#67=LINE('',#393,#98);
#68=LINE('',#395,#99);
#69=LINE('',#397,#100);
#70=LINE('',#398,#101);
#71=LINE('',#401,#102);
#72=LINE('',#402,#103);
#73=LINE('',#405,#104);
#74=LINE('',#407,#105);
#75=VECTOR('',#286,10.);
#76=VECTOR('',#287,10.);
#77=VECTOR('',#288,10.);
#78=VECTOR('',#289,10.);
#79=VECTOR('',#292,10.);
#80=VECTOR('',#293,10.);
#81=VECTOR('',#294,10.);
#82=VECTOR('',#297,10.);
#83=VECTOR('',#298,10.);
#84=VECTOR('',#299,10.);
#85=VECTOR('',#302,10.);
#86=VECTOR('',#303,10.);
#87=VECTOR('',#304,10.);
#88=VECTOR('',#307,10.);
#89=VECTOR('',#308,10.);
#90=VECTOR('',#311,10.);
#91=VECTOR('',#312,10.);
#92=VECTOR('',#313,10.);
#93=VECTOR('',#316,10.);
#94=VECTOR('',#317,10.);
#95=VECTOR('',#318,10.);
#96=VECTOR('',#319,10.);
#97=VECTOR('',#322,10.);
#98=VECTOR('',#323,10.);
#99=VECTOR('',#326,10.);
#100=VECTOR('',#327,10.);
#101=VECTOR('',#328,10.);
#102=VECTOR('',#331,10.);
#103=VECTOR('',#332,10.);
#104=VECTOR('',#337,10.);
#105=VECTOR('',#340,10.);
#106=VERTEX_POINT('',#347);
#107=VERTEX_POINT('',#348);
#108=VERTEX_POINT('',#350);
#109=VERTEX_POINT('',#352);
#110=VERTEX_POINT('',#356);
#111=VERTEX_POINT('',#358);
#112=VERTEX_POINT('',#362);
#113=VERTEX_POINT('',#364);
#114=VERTEX_POINT('',#368);
#115=VERTEX_POINT('',#370);
#116=VERTEX_POINT('',#374);
#117=VERTEX_POINT('',#378);
#118=VERTEX_POINT('',#380);
#119=VERTEX_POINT('',#384);
#120=VERTEX_POINT('',#386);
#121=VERTEX_POINT('',#388);
#122=VERTEX_POINT('',#396);
#123=VERTEX_POINT('',#400);
#124=EDGE_CURVE('',#106,#107,#44,.T.);
#125=EDGE_CURVE('',#106,#108,#45,.T.);
#126=EDGE_CURVE('',#108,#109,#46,.T.);
#127=EDGE_CURVE('',#109,#107,#47,.T.);
#128=EDGE_CURVE('',#108,#110,#48,.T.);
#129=EDGE_CURVE('',#110,#111,#49,.T.);
#130=EDGE_CURVE('',#111,#109,#50,.T.);
#131=EDGE_CURVE('',#107,#112,#51,.T.);
#132=EDGE_CURVE('',#112,#113,#52,.T.);
#133=EDGE_CURVE('',#113,#106,#53,.T.);
#134=EDGE_CURVE('',#109,#114,#54,.T.);
#135=EDGE_CURVE('',#115,#111,#55,.T.);
#136=EDGE_CURVE('',#114,#115,#56,.T.);
#137=EDGE_CURVE('',#116,#112,#57,.T.);
#138=EDGE_CURVE('',#116,#114,#58,.T.);
#139=EDGE_CURVE('',#114,#117,#59,.T.);
#140=EDGE_CURVE('',#115,#118,#60,.T.);
#141=EDGE_CURVE('',#118,#117,#61,.T.);
#142=EDGE_CURVE('',#119,#116,#62,.T.);
#143=EDGE_CURVE('',#119,#120,#63,.T.);
#144=EDGE_CURVE('',#120,#121,#64,.T.);
#145=EDGE_CURVE('',#121,#116,#65,.T.);
#146=EDGE_CURVE('',#117,#108,#66,.T.);
#147=EDGE_CURVE('',#118,#110,#67,.T.);
#148=EDGE_CURVE('',#113,#119,#68,.T.);
#149=EDGE_CURVE('',#122,#113,#69,.T.);
#150=EDGE_CURVE('',#120,#122,#70,.T.);
#151=EDGE_CURVE('',#121,#123,#71,.T.);
#152=EDGE_CURVE('',#112,#123,#72,.T.);
#153=EDGE_CURVE('',#117,#119,#73,.T.);
#154=EDGE_CURVE('',#123,#122,#74,.T.);
#155=ORIENTED_EDGE('',*,*,#124,.F.);
#156=ORIENTED_EDGE('',*,*,#125,.T.);
#157=ORIENTED_EDGE('',*,*,#126,.T.);
#158=ORIENTED_EDGE('',*,*,#127,.T.);
#159=ORIENTED_EDGE('',*,*,#126,.F.);
#160=ORIENTED_EDGE('',*,*,#128,.T.);
#161=ORIENTED_EDGE('',*,*,#129,.T.);
#162=ORIENTED_EDGE('',*,*,#130,.T.);
#163=ORIENTED_EDGE('',*,*,#124,.T.);
#164=ORIENTED_EDGE('',*,*,#131,.T.);
#165=ORIENTED_EDGE('',*,*,#132,.T.);
#166=ORIENTED_EDGE('',*,*,#133,.T.);
#167=ORIENTED_EDGE('',*,*,#134,.F.);
#168=ORIENTED_EDGE('',*,*,#130,.F.);
#169=ORIENTED_EDGE('',*,*,#135,.F.);
#170=ORIENTED_EDGE('',*,*,#136,.F.);
#171=ORIENTED_EDGE('',*,*,#137,.T.);
#172=ORIENTED_EDGE('',*,*,#131,.F.);
#173=ORIENTED_EDGE('',*,*,#127,.F.);
#174=ORIENTED_EDGE('',*,*,#134,.T.);
#175=ORIENTED_EDGE('',*,*,#138,.F.);
#176=ORIENTED_EDGE('',*,*,#139,.F.);
#177=ORIENTED_EDGE('',*,*,#136,.T.);
#178=ORIENTED_EDGE('',*,*,#140,.T.);
#179=ORIENTED_EDGE('',*,*,#141,.T.);
#180=ORIENTED_EDGE('',*,*,#142,.F.);
#181=ORIENTED_EDGE('',*,*,#143,.T.);
#182=ORIENTED_EDGE('',*,*,#144,.T.);
#183=ORIENTED_EDGE('',*,*,#145,.T.);
#184=ORIENTED_EDGE('',*,*,#146,.F.);
#185=ORIENTED_EDGE('',*,*,#141,.F.);
#186=ORIENTED_EDGE('',*,*,#147,.T.);
#187=ORIENTED_EDGE('',*,*,#128,.F.);
#188=ORIENTED_EDGE('',*,*,#148,.F.);
#189=ORIENTED_EDGE('',*,*,#149,.F.);
#190=ORIENTED_EDGE('',*,*,#150,.F.);
#191=ORIENTED_EDGE('',*,*,#143,.F.);
#192=ORIENTED_EDGE('',*,*,#137,.F.);
#193=ORIENTED_EDGE('',*,*,#145,.F.);
#194=ORIENTED_EDGE('',*,*,#151,.T.);
#195=ORIENTED_EDGE('',*,*,#152,.F.);
#196=ORIENTED_EDGE('',*,*,#140,.F.);
#197=ORIENTED_EDGE('',*,*,#135,.T.);
#198=ORIENTED_EDGE('',*,*,#129,.F.);
#199=ORIENTED_EDGE('',*,*,#147,.F.);
#200=ORIENTED_EDGE('',*,*,#148,.T.);
#201=ORIENTED_EDGE('',*,*,#153,.F.);
#202=ORIENTED_EDGE('',*,*,#146,.T.);
#203=ORIENTED_EDGE('',*,*,#125,.F.);
#204=ORIENTED_EDGE('',*,*,#133,.F.);
#205=ORIENTED_EDGE('',*,*,#144,.F.);
#206=ORIENTED_EDGE('',*,*,#150,.T.);
#207=ORIENTED_EDGE('',*,*,#154,.F.);
#208=ORIENTED_EDGE('',*,*,#151,.F.);
#209=ORIENTED_EDGE('',*,*,#132,.F.);
#210=ORIENTED_EDGE('',*,*,#152,.T.);
#211=ORIENTED_EDGE('',*,*,#154,.T.);
#212=ORIENTED_EDGE('',*,*,#149,.T.);
#213=ORIENTED_EDGE('',*,*,#142,.T.);
#214=ORIENTED_EDGE('',*,*,#138,.T.);
#215=ORIENTED_EDGE('',*,*,#139,.T.);
#216=ORIENTED_EDGE('',*,*,#153,.T.);
#217=PLANE('',#267);
#218=PLANE('',#268);
#219=PLANE('',#269);
#220=PLANE('',#270);
#221=PLANE('',#271);
#222=PLANE('',#272);
#223=PLANE('',#273);
#224=PLANE('',#274);
#225=PLANE('',#275);
#226=PLANE('',#276);
#227=PLANE('',#277);
#228=PLANE('',#278);
#229=PLANE('',#279);
#230=PLANE('',#280);
#231=PLANE('',#281);
#232=STYLED_ITEM('',(#430),#238);
#233=STYLED_ITEM('',(#431),#240);
#234=STYLED_ITEM('',(#431),#242);
#235=STYLED_ITEM('',(#431),#249);
#236=STYLED_ITEM('',(#431),#252);
#237=STYLED_ITEM('',(#429),#13);
#238=ADVANCED_FACE('',(#14),#217,.T.);
#239=ADVANCED_FACE('',(#15),#218,.T.);
#240=ADVANCED_FACE('',(#16),#219,.T.);
#241=ADVANCED_FACE('',(#17),#220,.T.);
#242=ADVANCED_FACE('',(#18),#221,.T.);
#243=ADVANCED_FACE('',(#19),#222,.F.);
#244=ADVANCED_FACE('',(#20),#223,.F.);
#245=ADVANCED_FACE('',(#21),#224,.T.);
#246=ADVANCED_FACE('',(#22),#225,.T.);
#247=ADVANCED_FACE('',(#23),#226,.T.);
#248=ADVANCED_FACE('',(#24),#227,.T.);
#249=ADVANCED_FACE('',(#25),#228,.T.);
#250=ADVANCED_FACE('',(#26),#229,.T.);
#251=ADVANCED_FACE('',(#27),#230,.T.);
#252=ADVANCED_FACE('',(#28),#231,.F.);
#253=CLOSED_SHELL('',(#238,#239,#240,#241,#242,#243,#244,#245,#246,#247,
#248,#249,#250,#251,#252));
#254=DERIVED_UNIT_ELEMENT(#256,1.);
#255=DERIVED_UNIT_ELEMENT(#415,-3.);
#256=(
MASS_UNIT()
NAMED_UNIT(*)
SI_UNIT(.KILO.,.GRAM.)
);
#257=DERIVED_UNIT((#254,#255));
#258=MEASURE_REPRESENTATION_ITEM('density measure',
POSITIVE_RATIO_MEASURE(7850.),#257);
#259=PROPERTY_DEFINITION_REPRESENTATION(#264,#261);
#260=PROPERTY_DEFINITION_REPRESENTATION(#265,#262);
#261=REPRESENTATION('material name',(#263),#412);
#262=REPRESENTATION('density',(#258),#412);
#263=DESCRIPTIVE_REPRESENTATION_ITEM('Stahl','Stahl');
#264=PROPERTY_DEFINITION('material property','material name',#422);
#265=PROPERTY_DEFINITION('material property','density of part',#422);
#266=AXIS2_PLACEMENT_3D('placement',#345,#282,#283);
#267=AXIS2_PLACEMENT_3D('',#346,#284,#285);
#268=AXIS2_PLACEMENT_3D('',#355,#290,#291);
#269=AXIS2_PLACEMENT_3D('',#361,#295,#296);
#270=AXIS2_PLACEMENT_3D('',#367,#300,#301);
#271=AXIS2_PLACEMENT_3D('',#373,#305,#306);
#272=AXIS2_PLACEMENT_3D('',#377,#309,#310);
#273=AXIS2_PLACEMENT_3D('',#383,#314,#315);
#274=AXIS2_PLACEMENT_3D('',#391,#320,#321);
#275=AXIS2_PLACEMENT_3D('',#394,#324,#325);
#276=AXIS2_PLACEMENT_3D('',#399,#329,#330);
#277=AXIS2_PLACEMENT_3D('',#403,#333,#334);
#278=AXIS2_PLACEMENT_3D('',#404,#335,#336);
#279=AXIS2_PLACEMENT_3D('',#406,#338,#339);
#280=AXIS2_PLACEMENT_3D('',#408,#341,#342);
#281=AXIS2_PLACEMENT_3D('',#409,#343,#344);
#282=DIRECTION('axis',(0.,0.,1.));
#283=DIRECTION('refdir',(1.,0.,0.));
#284=DIRECTION('center_axis',(0.,1.,0.));
#285=DIRECTION('ref_axis',(0.,0.,1.));
#286=DIRECTION('',(1.,0.,1.38777878078145E-16));
#287=DIRECTION('',(0.,0.,1.));
#288=DIRECTION('',(1.,0.,4.16333643540216E-16));
#289=DIRECTION('',(0.,0.,-1.));
#290=DIRECTION('center_axis',(0.,1.,0.));
#291=DIRECTION('ref_axis',(0.,0.,1.));
#292=DIRECTION('',(0.,0.,1.));
#293=DIRECTION('',(1.,0.,0.));
#294=DIRECTION('',(0.,0.,-1.));
#295=DIRECTION('center_axis',(0.,1.,0.));
#296=DIRECTION('ref_axis',(0.,0.,1.));
#297=DIRECTION('',(0.,0.,-1.));
#298=DIRECTION('',(-1.,0.,0.));
#299=DIRECTION('',(0.,0.,1.));
#300=DIRECTION('center_axis',(1.,0.,0.));
#301=DIRECTION('ref_axis',(0.,0.,-1.));
#302=DIRECTION('',(0.,-1.,0.));
#303=DIRECTION('',(0.,1.,0.));
#304=DIRECTION('',(0.,0.,1.));
#305=DIRECTION('center_axis',(1.,0.,0.));
#306=DIRECTION('ref_axis',(0.,0.,-1.));
#307=DIRECTION('',(0.,1.,0.));
#308=DIRECTION('',(0.,0.,1.));
#309=DIRECTION('center_axis',(0.,1.,0.));
#310=DIRECTION('ref_axis',(1.,0.,0.));
#311=DIRECTION('',(-1.,0.,-4.16333643540216E-16));
#312=DIRECTION('',(-1.,0.,0.));
#313=DIRECTION('',(0.,0.,-1.));
#314=DIRECTION('center_axis',(0.,1.,0.));
#315=DIRECTION('ref_axis',(1.,0.,0.));
#316=DIRECTION('',(1.,0.,0.));
#317=DIRECTION('',(0.,0.,-1.));
#318=DIRECTION('',(1.,0.,2.77555756156289E-16));
#319=DIRECTION('',(0.,0.,1.));
#320=DIRECTION('center_axis',(-1.,0.,0.));
#321=DIRECTION('ref_axis',(0.,0.,1.));
#322=DIRECTION('',(0.,1.,0.));
#323=DIRECTION('',(0.,1.,0.));
#324=DIRECTION('center_axis',(-1.,0.,0.));
#325=DIRECTION('ref_axis',(0.,0.,1.));
#326=DIRECTION('',(0.,-1.,0.));
#327=DIRECTION('',(0.,0.,1.));
#328=DIRECTION('',(0.,1.,0.));
#329=DIRECTION('center_axis',(1.,0.,0.));
#330=DIRECTION('ref_axis',(0.,0.,-1.));
#331=DIRECTION('',(0.,1.,0.));
#332=DIRECTION('',(0.,0.,-1.));
#333=DIRECTION('center_axis',(0.,0.,1.));
#334=DIRECTION('ref_axis',(1.,0.,0.));
#335=DIRECTION('center_axis',(-1.,0.,0.));
#336=DIRECTION('ref_axis',(0.,0.,1.));
#337=DIRECTION('',(0.,0.,-1.));
#338=DIRECTION('center_axis',(2.77555756156289E-16,0.,-1.));
#339=DIRECTION('ref_axis',(-1.,0.,-2.77555756156289E-16));
#340=DIRECTION('',(-1.,0.,-2.77555756156289E-16));
#341=DIRECTION('center_axis',(0.,1.,0.));
#342=DIRECTION('ref_axis',(0.,0.,1.));
#343=DIRECTION('center_axis',(0.,1.,0.));
#344=DIRECTION('ref_axis',(1.,0.,0.));
#345=CARTESIAN_POINT('',(0.,0.,0.));
#346=CARTESIAN_POINT('Origin',(1.38777878078145E-16,1.15,5.55111512312578E-16));
#347=CARTESIAN_POINT('',(-1.,1.15,0.800000000000001));
#348=CARTESIAN_POINT('',(1.,1.15,0.800000000000001));
#349=CARTESIAN_POINT('',(2.77555756156289E-17,1.15,0.800000000000001));
#350=CARTESIAN_POINT('',(-1.,1.15,2.2));
#351=CARTESIAN_POINT('',(-1.,1.15,2.6));
#352=CARTESIAN_POINT('',(1.,1.15,2.2));
#353=CARTESIAN_POINT('',(0.5,1.15,2.2));
#354=CARTESIAN_POINT('',(1.,1.15,-2.6));
#355=CARTESIAN_POINT('Origin',(1.38777878078145E-16,1.15,5.55111512312578E-16));
#356=CARTESIAN_POINT('',(-1.,1.15,2.6));
#357=CARTESIAN_POINT('',(-1.,1.15,2.6));
#358=CARTESIAN_POINT('',(1.,1.15,2.6));
#359=CARTESIAN_POINT('',(1.,1.15,2.6));
#360=CARTESIAN_POINT('',(1.,1.15,-2.6));
#361=CARTESIAN_POINT('Origin',(1.38777878078145E-16,1.15,5.55111512312578E-16));
#362=CARTESIAN_POINT('',(1.,1.15,-2.2));
#363=CARTESIAN_POINT('',(1.,1.15,-2.6));
#364=CARTESIAN_POINT('',(-1.,1.15,-2.2));
#365=CARTESIAN_POINT('',(-0.5,1.15,-2.2));
#366=CARTESIAN_POINT('',(-1.,1.15,2.6));
#367=CARTESIAN_POINT('Origin',(1.,0.,2.6));
#368=CARTESIAN_POINT('',(1.,0.,2.2));
#369=CARTESIAN_POINT('',(1.,0.,2.2));
#370=CARTESIAN_POINT('',(1.,0.,2.6));
#371=CARTESIAN_POINT('',(1.,0.,2.6));
#372=CARTESIAN_POINT('',(1.,0.,-2.6));
#373=CARTESIAN_POINT('Origin',(1.,0.,2.6));
#374=CARTESIAN_POINT('',(1.,0.,-2.2));
#375=CARTESIAN_POINT('',(1.,0.,-2.2));
#376=CARTESIAN_POINT('',(1.,0.,-2.6));
#377=CARTESIAN_POINT('Origin',(1.38777878078145E-16,0.,5.55111512312578E-16));
#378=CARTESIAN_POINT('',(-1.,0.,2.2));
#379=CARTESIAN_POINT('',(0.5,0.,2.2));
#380=CARTESIAN_POINT('',(-1.,0.,2.6));
#381=CARTESIAN_POINT('',(1.,0.,2.6));
#382=CARTESIAN_POINT('',(-1.,0.,2.6));
#383=CARTESIAN_POINT('Origin',(1.38777878078145E-16,0.,5.55111512312578E-16));
#384=CARTESIAN_POINT('',(-1.,0.,-2.2));
#385=CARTESIAN_POINT('',(-0.5,0.,-2.2));
#386=CARTESIAN_POINT('',(-1.,0.,-2.6));
#387=CARTESIAN_POINT('',(-1.,0.,2.6));
#388=CARTESIAN_POINT('',(1.,0.,-2.6));
#389=CARTESIAN_POINT('',(-1.,0.,-2.6));
#390=CARTESIAN_POINT('',(1.,0.,-2.6));
#391=CARTESIAN_POINT('Origin',(-1.,0.,-2.6));
#392=CARTESIAN_POINT('',(-1.,0.,2.2));
#393=CARTESIAN_POINT('',(-1.,0.,2.6));
#394=CARTESIAN_POINT('Origin',(-1.,0.,-2.6));
#395=CARTESIAN_POINT('',(-1.,0.,-2.2));
#396=CARTESIAN_POINT('',(-1.,1.15,-2.6));
#397=CARTESIAN_POINT('',(-1.,1.15,2.6));
#398=CARTESIAN_POINT('',(-1.,0.,-2.6));
#399=CARTESIAN_POINT('Origin',(1.,0.,2.6));
#400=CARTESIAN_POINT('',(1.,1.15,-2.6));
#401=CARTESIAN_POINT('',(1.,0.,-2.6));
#402=CARTESIAN_POINT('',(1.,1.15,-2.6));
#403=CARTESIAN_POINT('Origin',(-1.,0.,2.6));
#404=CARTESIAN_POINT('Origin',(-1.,0.,-2.6));
#405=CARTESIAN_POINT('',(-1.,0.,2.6));
#406=CARTESIAN_POINT('Origin',(1.,0.,-2.6));
#407=CARTESIAN_POINT('',(-1.,1.15,-2.6));
#408=CARTESIAN_POINT('Origin',(1.38777878078145E-16,1.15,5.55111512312578E-16));
#409=CARTESIAN_POINT('Origin',(1.38777878078145E-16,0.,5.55111512312578E-16));
#410=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#414,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#411=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#414,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#412=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#410))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#414,#416,#417))
REPRESENTATION_CONTEXT('','3D')
);
#413=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#411))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#414,#416,#417))
REPRESENTATION_CONTEXT('','3D')
);
#414=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#415=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT($,.METRE.)
);
#416=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#417=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#418=SHAPE_DEFINITION_REPRESENTATION(#419,#420);
#419=PRODUCT_DEFINITION_SHAPE('',$,#422);
#420=SHAPE_REPRESENTATION('',(#266),#412);
#421=PRODUCT_DEFINITION_CONTEXT('part definition',#426,'design');
#422=PRODUCT_DEFINITION('Walsin RFANT5220110A2T',
'Walsin RFANT5220110A2T v0',#423,#421);
#423=PRODUCT_DEFINITION_FORMATION('',$,#428);
#424=PRODUCT_RELATED_PRODUCT_CATEGORY('Walsin RFANT5220110A2T v0',
'Walsin RFANT5220110A2T v0',(#428));
#425=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2009,#426);
#426=APPLICATION_CONTEXT(
'Core Data for Automotive Mechanical Design Process');
#427=PRODUCT_CONTEXT('part definition',#426,'mechanical');
#428=PRODUCT('Walsin RFANT5220110A2T','Walsin RFANT5220110A2T v0',$,(#427));
#429=PRESENTATION_STYLE_ASSIGNMENT((#432));
#430=PRESENTATION_STYLE_ASSIGNMENT((#433));
#431=PRESENTATION_STYLE_ASSIGNMENT((#434));
#432=SURFACE_STYLE_USAGE(.BOTH.,#435);
#433=SURFACE_STYLE_USAGE(.BOTH.,#436);
#434=SURFACE_STYLE_USAGE(.BOTH.,#437);
#435=SURFACE_SIDE_STYLE('',(#438));
#436=SURFACE_SIDE_STYLE('',(#439));
#437=SURFACE_SIDE_STYLE('',(#440));
#438=SURFACE_STYLE_FILL_AREA(#441);
#439=SURFACE_STYLE_FILL_AREA(#442);
#440=SURFACE_STYLE_FILL_AREA(#443);
#441=FILL_AREA_STYLE('Stahl - satiniert',(#444));
#442=FILL_AREA_STYLE('Farbe - Emaille gl\X\E4nzend (Grau)',(#445));
#443=FILL_AREA_STYLE('Farbe - Emaille gl\X\E4nzend (Blau)',(#446));
#444=FILL_AREA_STYLE_COLOUR('Stahl - satiniert',#447);
#445=FILL_AREA_STYLE_COLOUR('Farbe - Emaille gl\X\E4nzend (Grau)',#448);
#446=FILL_AREA_STYLE_COLOUR('Farbe - Emaille gl\X\E4nzend (Blau)',#449);
#447=COLOUR_RGB('Stahl - satiniert',0.627450980392157,0.627450980392157,
0.627450980392157);
#448=COLOUR_RGB('Farbe - Emaille gl\X\E4nzend (Grau)',0.701960784313725,
0.701960784313725,0.701960784313725);
#449=COLOUR_RGB('Farbe - Emaille gl\X\E4nzend (Blau)',0.294117647058824,
0.498039215686275,0.831372549019608);
ENDSEC;
END-ISO-10303-21;

View File

@ -0,0 +1,43 @@
(footprint "Heimdall vertical" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 5BB39B96)
(descr "VISHAY Heimdall for TSSP77038")
(tags "vishay heimdall IR infrared receiver")
(property "Sheetfile" "Remote.kicad_sch")
(property "Sheetname" "")
(attr smd)
(fp_text reference "U6" (at -4.488008 0.299854 -90) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 99661005-769b-4d0f-aa75-26eeaa5b0c4e)
)
(fp_text value "TSSP77038" (at 0 2.8) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 2c315470-8c5e-49ee-bee1-3d6a109f7de1)
)
(fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 8b99f715-f8e6-46d4-96e6-7f0569201d47)
)
(fp_line (start 3.4 1.505) (end 3.4 -1.505) (layer "F.SilkS") (width 0.12) (tstamp 255fdb75-f1b7-4bf5-b13f-73da1e61b4cd))
(fp_line (start 3.4 -1.505) (end -3.4 -1.51) (layer "F.SilkS") (width 0.12) (tstamp 3be63fd6-f4ed-4239-a0db-f9ba492eaffc))
(fp_line (start -2.8 1.505) (end -3.4 1.5) (layer "F.SilkS") (width 0.12) (tstamp b22fd62b-97d7-4d22-9380-f9b09acbb3a1))
(fp_line (start 3.4 1.505) (end 2.8 1.5) (layer "F.SilkS") (width 0.12) (tstamp bc52bd0a-e631-4f4a-a5cb-57e3c2c33f20))
(fp_line (start -3.4 1.5) (end -3.4 -1.51) (layer "F.SilkS") (width 0.12) (tstamp eb427f97-534a-4b55-a1fc-cd7512384142))
(fp_line (start -3.6 -1.7) (end -3.6 1.7) (layer "F.CrtYd") (width 0.05) (tstamp 516611f6-57a3-4042-8808-474f9ef80ca9))
(fp_line (start 3.6 -1.7) (end 3.6 1.7) (layer "F.CrtYd") (width 0.05) (tstamp 7aa8c835-b4be-4912-9d31-bd1dc74c5233))
(fp_line (start -3.6 1.7) (end 3.6 1.7) (layer "F.CrtYd") (width 0.05) (tstamp d74462a7-514c-435c-bdd6-f9e949d16f79))
(fp_line (start -3.6 -1.7) (end 3.6 -1.7) (layer "F.CrtYd") (width 0.05) (tstamp f3a21418-5e5d-44aa-b12e-bc9972d6c561))
(fp_line (start -3.4 -1.5) (end -3.4 1.5) (layer "F.Fab") (width 0.1) (tstamp 06de88ae-cc75-47b9-9e4c-b56359c9966e))
(fp_line (start -3.4 1.5) (end 3.4 1.5) (layer "F.Fab") (width 0.1) (tstamp 4cf852b5-80fb-49ef-9c99-d2b74e1c9b51))
(fp_line (start 3.4 -1.5) (end 3.4 1.5) (layer "F.Fab") (width 0.1) (tstamp 55c5bd39-2c09-4221-a860-d0eb1faafefa))
(fp_line (start -3.4 -1.5) (end 3.4 -1.5) (layer "F.Fab") (width 0.1) (tstamp e59679a9-fe2a-477d-b576-837769fdd70c))
(pad "1" smd rect (at -1.905 0.7 90) (size 2 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 055c9379-ba0e-424b-a771-defa39eb74b3))
(pad "2" smd rect (at -0.635 0.7 90) (size 2 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 028da597-1e73-4bbf-99ce-209e6fa31929))
(pad "3" smd rect (at 0.635 0.7 90) (size 2 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b30c79a4-89cf-486e-b203-e29889d600cf))
(pad "4" smd rect (at 1.9 0.7 90) (size 2 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 61518e6f-b8a3-43ff-896a-d7086a3d80ca))
(model "${KICAD_USER_3DMODEL_DIR}/82672Heimdall.stp"
(offset (xyz 0 -1.2 1.6))
(scale (xyz 1 1 1))
(rotate (xyz -90 0 -180))
)
)

View File

@ -0,0 +1,56 @@
(footprint "JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_Vertical" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 5B78AD87)
(descr "JST PH series connector, B2B-PH-SM4-TB (http://www.jst-mfg.com/product/pdf/eng/ePH.pdf), generated with kicad-footprint-generator")
(tags "connector JST PH side entry")
(property "Sheetfile" "Remote.kicad_sch")
(property "Sheetname" "")
(attr smd)
(fp_text reference "J3" (at 0 -5.45) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp b7e1e3c6-b800-4b44-8a4d-eeb1862d3514)
)
(fp_text value "Conn_01x02_Male" (at 0 4.45) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 06e5a78d-8e0f-4809-b533-b4a49b5a629c)
)
(fp_text user "${REFERENCE}" (at 0 -1) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp c4a243ed-6686-4db5-a9fe-19b50e44ab94)
)
(fp_line (start 4.085 -4.36) (end 4.085 -3.51) (layer "F.SilkS") (width 0.12) (tstamp 0227ffb8-82b4-43af-810e-c0c8f988fd80))
(fp_line (start -4.085 -3.51) (end -4.085 -4.36) (layer "F.SilkS") (width 0.12) (tstamp 4b4cd7fa-6d7c-41be-a714-842b1f5e66fd))
(fp_line (start -4.085 0.86) (end -1.76 0.86) (layer "F.SilkS") (width 0.12) (tstamp 4ce2d6a7-aa36-430e-8135-9448ad856824))
(fp_line (start -1.76 0.86) (end -1.76 3.25) (layer "F.SilkS") (width 0.12) (tstamp 5fb70798-2929-4c25-8656-aae725080435))
(fp_line (start -4.085 -4.36) (end 4.085 -4.36) (layer "F.SilkS") (width 0.12) (tstamp 933de47d-58f5-4aee-a30e-c80f7a4128cd))
(fp_line (start 4.085 0.86) (end 1.76 0.86) (layer "F.SilkS") (width 0.12) (tstamp b6f556b6-4b48-4aa8-a28d-ada9a53c80b2))
(fp_line (start -4.085 0.01) (end -4.085 0.86) (layer "F.SilkS") (width 0.12) (tstamp c2ee8f22-2d81-4a3b-bf49-edf03d42c378))
(fp_line (start 4.085 0.01) (end 4.085 0.86) (layer "F.SilkS") (width 0.12) (tstamp ff8802c7-b96a-47e7-9d38-4fb580940895))
(fp_line (start 4.7 -4.75) (end -4.7 -4.75) (layer "F.CrtYd") (width 0.05) (tstamp 2252533e-5a92-4603-815d-b45bd34a8798))
(fp_line (start 4.7 3.75) (end 4.7 -4.75) (layer "F.CrtYd") (width 0.05) (tstamp 5a2032d7-7326-4ae6-9368-e0e91033a364))
(fp_line (start -4.7 -4.75) (end -4.7 3.75) (layer "F.CrtYd") (width 0.05) (tstamp 9799a600-6f38-4fe9-88df-f078b9f894e8))
(fp_line (start -4.7 3.75) (end 4.7 3.75) (layer "F.CrtYd") (width 0.05) (tstamp b35a8c78-e485-4726-a863-8c26b966f857))
(fp_line (start 0.75 -2.75) (end 0.75 -2.25) (layer "F.Fab") (width 0.1) (tstamp 0c2319c0-5863-4f5b-8079-60eb54f2fa3c))
(fp_line (start -1.5 0.75) (end -1 0.042893) (layer "F.Fab") (width 0.1) (tstamp 12883faa-fa7b-4d13-8d81-baa9bb81f4a6))
(fp_line (start -1.25 -2.75) (end -1.25 -2.25) (layer "F.Fab") (width 0.1) (tstamp 15885318-73db-4ebc-8390-ad3e61fb0db6))
(fp_line (start -0.75 -2.25) (end -0.75 -2.75) (layer "F.Fab") (width 0.1) (tstamp 1bcad65c-793d-4f6a-8c9b-e1e0c9855257))
(fp_line (start -1 0.042893) (end -0.5 0.75) (layer "F.Fab") (width 0.1) (tstamp 3a65be0a-a5e1-45b4-bff7-b154567eef50))
(fp_line (start -3.975 -4.25) (end 3.975 -4.25) (layer "F.Fab") (width 0.1) (tstamp 3eb0ab25-cff0-4416-880a-0df9d337fc5c))
(fp_line (start -3.975 0.75) (end 3.975 0.75) (layer "F.Fab") (width 0.1) (tstamp 5efbd4f9-69b1-4a4f-883c-6287aa5deded))
(fp_line (start 3.975 0.75) (end 3.975 -4.25) (layer "F.Fab") (width 0.1) (tstamp 6651168d-2e28-4025-b01a-8bb6ff4d597f))
(fp_line (start -0.75 -2.75) (end -1.25 -2.75) (layer "F.Fab") (width 0.1) (tstamp 6abd37df-8a84-409c-b120-dd47832342dc))
(fp_line (start 1.25 -2.25) (end 1.25 -2.75) (layer "F.Fab") (width 0.1) (tstamp 81a8e172-7628-4fd5-b288-37b3858f81b2))
(fp_line (start -1.25 -2.25) (end -0.75 -2.25) (layer "F.Fab") (width 0.1) (tstamp 923c5b62-0b7d-4239-a081-608d2a0840db))
(fp_line (start 0.75 -2.25) (end 1.25 -2.25) (layer "F.Fab") (width 0.1) (tstamp a8f5cc86-65ff-4505-83d7-0904519dda4b))
(fp_line (start -3.975 0.75) (end -3.975 -4.25) (layer "F.Fab") (width 0.1) (tstamp d5f4d32e-3914-4bd8-bb74-8146e3e94ed9))
(fp_line (start 1.25 -2.75) (end 0.75 -2.75) (layer "F.Fab") (width 0.1) (tstamp f3a7eeb1-cfc3-4404-b92d-bd9192067442))
(pad "1" smd roundrect (at -1 0.5) (size 1 5.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 790110d1-463a-4fd2-85c0-66cce8e76920))
(pad "2" smd roundrect (at 1 0.5) (size 1 5.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp e5598bb2-3eb4-4616-92fc-e48ed6e40c44))
(pad "MP" smd roundrect (at -3.4 -1.75) (size 1.6 3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15625) (tstamp 2a6398e5-5a44-4a0f-8191-3e0039a605dc))
(pad "MP" smd roundrect (at 3.4 -1.75) (size 1.6 3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15625) (tstamp ead54c9b-214f-4544-a73e-79df4b5b630f))
(model "${KICAD_USER_3DMODEL_DIR}/B2B-PH-SM4-TB.STEP"
(offset (xyz -4 3.25 0))
(scale (xyz 1 1 1))
(rotate (xyz -90 0 0))
)
)

View File

@ -0,0 +1,60 @@
(footprint "LED_5mm_Side_Mount" (version 20211014) (generator pcbnew)
locked (layer "F.Cu")
(tedit 5E7E470B)
(descr "5mm LED for horizontal soldering to the board edge")
(tags "LED 5mm")
(property "Sheetfile" "Remote.kicad_sch")
(property "Sheetname" "")
(attr smd)
(fp_text reference "D2" (at -0.2 7.123323) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp f2beb290-8b22-480b-af2b-55c5fbe051dc)
)
(fp_text value "SFH4346" (at 0.7 -10.7) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp f55f02f0-58b7-44ff-b5f3-e6b6d172c151)
)
(fp_text user "Board Edge" (at 7.8 -1 unlocked) (layer "Cmts.User")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp d2ee5262-1434-4194-a73a-bdb5df43b4b4)
)
(fp_text user "${REFERENCE}" (at 3.1 3.5 -90) (layer "F.Fab")
(effects (font (size 0.8 0.8) (thickness 0.08)))
(tstamp ee4ad7f2-9145-48c6-87a9-fc1e8bc75547)
)
(fp_line (start -5.6 0) (end 12.4 0) (layer "Cmts.User") (width 0.12) (tstamp e82497c3-98a3-4a90-a30f-7d3057c175bc))
(fp_line (start -2.3 6.2) (end -2.3 0.5) (layer "F.CrtYd") (width 0.05) (tstamp 0c6efed2-0913-4dd2-8f27-821e7c61b32d))
(fp_line (start 2.3 6.2) (end 2.3 0.5) (layer "F.CrtYd") (width 0.05) (tstamp 478a1fd2-50e2-4979-b71f-3afd09c956e4))
(fp_line (start 2.3 0.5) (end 3.2 0.5) (layer "F.CrtYd") (width 0.05) (tstamp 51951242-0b7c-4b2f-a43f-29b2d9e9a95d))
(fp_line (start -2.3 6.2) (end 2.3 6.2) (layer "F.CrtYd") (width 0.05) (tstamp 5d183f5d-628f-42c3-96e3-c3bfb81cf2d4))
(fp_line (start -2.3 0.5) (end -3.2 0.5) (layer "F.CrtYd") (width 0.05) (tstamp 9c2fa047-0796-48df-997d-e2cacca255a8))
(fp_line (start -3.2 0.5) (end -3.2 -9.2) (layer "F.CrtYd") (width 0.05) (tstamp d5991019-e50e-4dfe-858c-67b1661a7648))
(fp_line (start 3.2 -9.2) (end -3.2 -9.2) (layer "F.CrtYd") (width 0.05) (tstamp e5e4607d-5468-4bab-be85-2e45235dfeaa))
(fp_line (start 3.2 0.5) (end 3.2 -9.2) (layer "F.CrtYd") (width 0.05) (tstamp f8602816-359b-47a8-8837-adbe0aa0f419))
(fp_line (start 2.5 -6.5) (end 2.5 -1) (layer "F.Fab") (width 0.1) (tstamp 008e4b84-7e75-43ca-8455-c2e468caad44))
(fp_line (start 0.5 -2.4) (end -0.5 -1.9) (layer "F.Fab") (width 0.1) (tstamp 0147b5ba-3109-402f-90c2-08e2a6bb8ff4))
(fp_line (start 2.8 -1) (end 2.8 0) (layer "F.Fab") (width 0.1) (tstamp 0a9fa915-2fb0-43a3-996f-d5e7cb365732))
(fp_line (start -3 -1) (end -3 0) (layer "F.Fab") (width 0.1) (tstamp 29757356-df90-4a15-9db4-c61c4724e212))
(fp_line (start -3 0) (end 2.8 0) (layer "F.Fab") (width 0.1) (tstamp 375840bf-2e99-4513-8445-0ba86ec953f7))
(fp_line (start 1.025 5) (end 1.525 5) (layer "F.Fab") (width 0.1) (tstamp 49131a50-f9b7-4785-b7f9-af41fec01dab))
(fp_line (start -1.015 0) (end -1.015 5) (layer "F.Fab") (width 0.1) (tstamp 64425b0a-c81f-45c5-876e-1768f77d40ba))
(fp_line (start -0.5 -1.9) (end -0.5 -2.9) (layer "F.Fab") (width 0.1) (tstamp 66c5093e-3f34-4724-9ba9-362d67dd31ff))
(fp_line (start -1.515 0) (end -1.515 5) (layer "F.Fab") (width 0.1) (tstamp 671adeb0-f6f3-4e29-ba18-080885a82e87))
(fp_line (start -0.5 -2.9) (end 0.5 -2.4) (layer "F.Fab") (width 0.1) (tstamp 6d952ea7-1857-41ae-97a4-56a181488971))
(fp_line (start -2.5 -6.5) (end -2.5 -1) (layer "F.Fab") (width 0.1) (tstamp 721953f1-9456-473f-ad35-9737f9729de0))
(fp_line (start 1.525 0) (end 1.525 5) (layer "F.Fab") (width 0.1) (tstamp 99e6b188-595d-402f-9955-ec8b8d559748))
(fp_line (start 1.25 -2.4) (end 0.5 -2.4) (layer "F.Fab") (width 0.1) (tstamp 9b326273-8fda-45bd-a748-25bd83652d12))
(fp_line (start -1.25 -2.4) (end -0.5 -2.4) (layer "F.Fab") (width 0.1) (tstamp b21f8551-4804-4a49-81a9-cc0de7d9198c))
(fp_line (start -3 -1) (end 2.8 -1) (layer "F.Fab") (width 0.1) (tstamp c2f21bd1-5f3c-4996-b3ab-c438498c274d))
(fp_line (start 0.5 -1.9) (end 0.5 -2.9) (layer "F.Fab") (width 0.1) (tstamp c58c120c-84c4-4b9e-9ed0-92b87ea0ef11))
(fp_line (start -1.515 5) (end -1.015 5) (layer "F.Fab") (width 0.1) (tstamp df197acd-43a2-42d0-aad3-7efa74170614))
(fp_line (start 1.025 0) (end 1.025 5) (layer "F.Fab") (width 0.1) (tstamp f31074bf-3a98-4ea8-bbf8-ad11c6be2aaa))
(fp_arc (start -2.5 -6.5) (mid 0 -9) (end 2.5 -6.5) (layer "F.Fab") (width 0.1) (tstamp 63108f7e-31b8-4030-85bb-d8c876610a82))
(pad "1" smd rect locked (at 1.275 3.5) (size 1.5 5) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 30c1fbd0-c96d-467f-9430-894b2db6865d))
(pad "2" smd rect locked (at -1.275 3.5) (size 1.5 5) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 30566d46-1cb5-435a-b1cc-753bef71bfb0))
(model "${KICAD_USER_3DMODEL_DIR}/Side Mount LED v1.step"
(offset (xyz 0 0 0.25))
(scale (xyz 1 1 1))
(rotate (xyz 90 0 0))
)
)

View File

@ -0,0 +1,225 @@
(footprint "QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm_ThermalVias_MR" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 5DC5F6A5)
(descr "QFN, 48 Pin (https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC2041_datasheet.pdf#page=62), generated with kicad-footprint-generator ipc_noLead_generator.py")
(tags "QFN NoLead")
(property "Sheetfile" "Remote.kicad_sch")
(property "Sheetname" "")
(zone_connect 2)
(attr smd)
(fp_text reference "U7" (at 2.35 -4.95) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 7705e9a7-8d84-410d-b2f3-d793d91b5f00)
)
(fp_text value "ESP32-PICO-D4" (at 0 4.8) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp bfbba12a-daed-4675-982a-77c43bac19b1)
)
(fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 47961ae4-c43b-4702-bdc7-45bd69e64f36)
)
(fp_line (start 3.135 -3.61) (end 3.61 -3.61) (layer "F.SilkS") (width 0.12) (tstamp 82260df7-7cb0-4a05-bc92-24745968f6f3))
(fp_line (start 3.135 3.61) (end 3.61 3.61) (layer "F.SilkS") (width 0.12) (tstamp adfd5f8f-2d29-46d8-8047-03b2aaa9dc6e))
(fp_line (start -3.61 3.61) (end -3.61 3.135) (layer "F.SilkS") (width 0.12) (tstamp b055493d-bf63-4196-98ab-412eab7fa898))
(fp_line (start -3.135 3.61) (end -3.61 3.61) (layer "F.SilkS") (width 0.12) (tstamp c11947d4-e00d-4c9c-b2ed-b8a15919a2bf))
(fp_line (start 3.61 3.61) (end 3.61 3.135) (layer "F.SilkS") (width 0.12) (tstamp f2b5f76c-63bf-4ac7-9fee-ca73aa63cdfd))
(fp_line (start 3.61 -3.61) (end 3.61 -3.135) (layer "F.SilkS") (width 0.12) (tstamp fd40282b-8a6d-412a-a5db-a246efccae17))
(fp_circle (center -3.6 -3.6) (end -3.45 -3.6) (layer "F.SilkS") (width 0.3) (fill none) (tstamp f6ce92d2-8f8a-4b34-be3d-a036cc80b0bf))
(fp_line (start 4.1 4.1) (end 4.1 -4.1) (layer "F.CrtYd") (width 0.05) (tstamp 20c4528d-c018-4151-93b4-332a24de84d6))
(fp_line (start -4.1 4.1) (end 4.1 4.1) (layer "F.CrtYd") (width 0.05) (tstamp 273f3a32-fc79-4d8b-ade3-2e64a1847a1a))
(fp_line (start -4.1 -4.1) (end -4.1 4.1) (layer "F.CrtYd") (width 0.05) (tstamp 3021b803-8940-402a-a778-d13af1e71053))
(fp_line (start 4.1 -4.1) (end -4.1 -4.1) (layer "F.CrtYd") (width 0.05) (tstamp ab59f9af-5f57-40d6-b894-bbb87c406520))
(fp_line (start -3.5 3.5) (end -3.5 -2.5) (layer "F.Fab") (width 0.1) (tstamp 4e4f049b-fc43-42b3-8b80-d04ca9f29b1e))
(fp_line (start 3.5 3.5) (end -3.5 3.5) (layer "F.Fab") (width 0.1) (tstamp 59a8f64b-8fa0-449d-ba41-95b41fdbddd7))
(fp_line (start 3.5 -3.5) (end 3.5 3.5) (layer "F.Fab") (width 0.1) (tstamp 9951cc79-31d0-49eb-b143-5a3b2b8e28cf))
(fp_line (start -3.5 -2.5) (end -2.5 -3.5) (layer "F.Fab") (width 0.1) (tstamp b997296a-33bd-49a5-b806-17018dfe5f0a))
(fp_line (start -2.5 -3.5) (end 3.5 -3.5) (layer "F.Fab") (width 0.1) (tstamp ede8250d-4f07-4a9e-ba45-882b5295db66))
(pad "" smd roundrect (at 1.8 0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 0045943e-6df3-40ca-9104-3e32ef1c2361))
(pad "" smd roundrect (at -0.6 -0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 12920999-1739-4177-bd30-7526c2a7c154))
(pad "" smd roundrect (at -1.8 0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 16a0886d-1c6d-443d-87b7-0ca2476ace0b))
(pad "" smd roundrect (at 0.6 0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 1d0c3d71-94ac-4b17-b2b8-aa5c7cdf4be0))
(pad "" smd roundrect (at 0.6 -1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 2ab4815d-1487-4c66-a3f2-b99a62a51a0c))
(pad "" smd roundrect (at -1.8 -1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 40c666dc-c058-4f23-89c9-623d332d7fec))
(pad "" smd roundrect (at 1.8 -0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 4b71632f-627e-4565-b89c-0a1a5f3303de))
(pad "" smd roundrect (at -0.6 0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 5249604f-be81-4ccd-ae00-67c73a7140c7))
(pad "" smd roundrect (at 1.8 -1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 6520ea53-1d97-441a-a4cc-165e29e56f17))
(pad "" smd roundrect (at 0.6 -0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 7f7defbb-f8ca-4fd4-9a43-138509d73085))
(pad "" smd roundrect (at 1.8 1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 8edec0bf-f2bf-45dd-bd87-83807f690a36))
(pad "" smd roundrect (at -1.8 -0.6) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 9ae5f0a0-fb8d-499b-80fe-cac6a10aca58))
(pad "" smd roundrect (at 0.6 1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp 9fd613eb-74ca-4f00-8cc9-4d57f3238a65))
(pad "" smd roundrect (at -0.6 1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp a6fdef24-a35e-45d8-a27c-f61032313fc2))
(pad "" smd roundrect (at -0.6 -1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp b77d62c4-d30c-4260-a609-2c7b29d578dd))
(pad "" smd roundrect (at -1.8 1.8) (size 1.026341 1.026341) (layers "F.Paste") (roundrect_rratio 0.2435837602)
(zone_connect 2) (tstamp f15ec748-ab3e-4223-8daa-eaf7a3ad412d))
(pad "1" smd roundrect (at -3.28 -2.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 43169ead-e3c0-48c3-a860-0de9bc10341e))
(pad "2" smd roundrect (at -3.28 -2.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp b599b1ac-9d7d-4d52-8f1a-4087459782fa))
(pad "3" smd roundrect (at -3.28 -1.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp d738e266-6392-45b8-9b25-c25c5e16601c))
(pad "4" smd roundrect (at -3.28 -1.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 1a375be6-2e7f-4324-bdf5-a43ab437db8e))
(pad "5" smd roundrect (at -3.28 -0.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 36dab2cd-cf91-4016-a054-c510a912b39b))
(pad "6" smd roundrect (at -3.28 -0.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 534c3c91-04fc-4e09-a61f-c57948ace1cf))
(pad "7" smd roundrect (at -3.28 0.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 0a32d12e-8b03-43fb-91a1-581adfc4aa57))
(pad "8" smd roundrect (at -3.28 0.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 9b50b460-2f13-4fc3-adc5-a634ae0b801a))
(pad "9" smd roundrect (at -3.28 1.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 41b51996-f7b3-46d6-93ff-b1e43ac3bed6))
(pad "10" smd roundrect (at -3.28 1.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 1f8f89f1-7da7-43cc-9d4d-16ef64d245a6))
(pad "11" smd roundrect (at -3.28 2.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 6853c369-dfab-411d-9705-ff1f204c3029))
(pad "12" smd roundrect (at -3.28 2.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp cf47d1c7-f23d-4242-b05b-375e35556b2d))
(pad "13" smd roundrect (at -2.75 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 1bae595f-595e-4575-8ab1-a60f675617d7))
(pad "14" smd roundrect (at -2.25 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 17ee9082-dc06-4b77-83f9-48e6a8108154))
(pad "15" smd roundrect (at -1.75 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp c9674c38-5c9b-4376-a39e-823857119235))
(pad "16" smd roundrect (at -1.25 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 8f55cf7d-a353-4bc7-a442-463d4176d317))
(pad "17" smd roundrect (at -0.75 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 55291fe4-d593-4e80-9423-adcaec667ad4))
(pad "18" smd roundrect (at -0.25 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp a0b359bd-15d9-46ae-a6cd-5e13ecaab75f))
(pad "19" smd roundrect (at 0.25 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 88319470-3104-4470-b9fc-bf5aa9247624))
(pad "20" smd roundrect (at 0.75 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 9b849915-740e-482a-95d5-087d9f7bba9d))
(pad "21" smd roundrect (at 1.25 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 0630074a-3662-4f64-b4a8-3f79a8b6433c))
(pad "22" smd roundrect (at 1.75 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 5982fcae-2a3c-4fa6-86fc-4928642d130d))
(pad "23" smd roundrect (at 2.25 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 62444e9e-e8bb-4592-a0b7-1a8a3d45a7d0))
(pad "24" smd roundrect (at 2.75 3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 08bc676c-3623-4434-b2e1-722cc349205a))
(pad "25" smd roundrect (at 3.28 2.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 08f94f28-3e54-4baa-b623-307c23eb2cee))
(pad "26" smd roundrect (at 3.28 2.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 28c12f52-c41f-4090-a4ee-5197bb52442b))
(pad "27" smd roundrect (at 3.28 1.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp d9bdf50f-0ada-40f6-848e-6e604303ba49))
(pad "28" smd roundrect (at 3.28 1.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 9b19a0a3-0c4b-43e0-974c-2ea6f7585b65))
(pad "29" smd roundrect (at 3.28 0.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 29eb24df-25ea-4e19-a102-cbc938297edd))
(pad "30" smd roundrect (at 3.28 0.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 1923b88e-2573-4f06-bbe0-17c33dcc99e5))
(pad "31" smd roundrect (at 3.28 -0.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 18f910d5-9602-4f5c-b3eb-5cb354b6b26e))
(pad "32" smd roundrect (at 3.28 -0.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 8a735efc-f8ce-46c9-a802-5bf894cae6c5))
(pad "33" smd roundrect (at 3.28 -1.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 7fbb9aa9-3faa-4a59-9eee-77f7f27dc643))
(pad "34" smd roundrect (at 3.28 -1.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 7029b909-7155-45a6-afe0-edb4d8e853c5))
(pad "35" smd roundrect (at 3.28 -2.25) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp f5498447-3b5c-4788-a427-e00b006f86c3))
(pad "36" smd roundrect (at 3.28 -2.75) (size 0.5 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 25217a3e-da1d-44e5-bd8d-1b91d1c757de))
(pad "37" smd roundrect (at 2.75 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 8a779b02-070b-4a04-b13c-91f13c535ef6))
(pad "38" smd roundrect (at 2.25 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 5344680f-03d1-4cde-a774-d4313edf842a))
(pad "39" smd roundrect (at 1.75 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 20880354-0997-4a10-bb7a-e9c51e1cf2bb))
(pad "40" smd roundrect (at 1.25 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp cc85cb1b-014f-40b7-a167-38e00819e7d1))
(pad "41" smd roundrect (at 0.75 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 6fd0397c-3082-40c3-ac95-4e5e3920f842))
(pad "42" smd roundrect (at 0.25 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp c09a90d9-8382-44b4-a5d8-e0328a8fefe0))
(pad "43" smd roundrect (at -0.25 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 05582249-0958-41ac-b6c5-ba9aedd73e8b))
(pad "44" smd roundrect (at -0.75 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 682599c1-1fc4-4d2f-b481-05eae628df9d))
(pad "45" smd roundrect (at -1.25 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp e65fc06d-b11d-480a-8c45-89374b60242d))
(pad "46" smd roundrect (at -1.75 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 6c9019a7-9971-4994-9603-b324ddfe473d))
(pad "47" smd roundrect (at -2.25 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp d3778f2d-cdf8-4efc-bba6-59156e3e95d6))
(pad "48" smd roundrect (at -2.75 -3.28) (size 0.3 0.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1)
(zone_connect 2) (tstamp 8929094a-93b6-4f58-9014-aeac5138770c))
(pad "49" thru_hole circle (at -1.2 -1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 051e6a54-8b5f-4265-ac56-3d6377b7ae04))
(pad "49" thru_hole circle (at 1.2 1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 0b607888-5922-47fd-a47e-eca703a66daf))
(pad "49" thru_hole circle (at 1.2 2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 1ec80c71-4fe2-4252-82fa-e619288c9877))
(pad "49" thru_hole circle (at -1.2 0) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 202a8353-df0d-4531-91d0-108aff3c0a03))
(pad "49" thru_hole circle (at 2.4 2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 2232b45e-f070-457d-a8d9-4a472a7f03a7))
(pad "49" thru_hole circle (at 1.2 -2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 288719ec-f74c-43db-8f67-370e454ae9d1))
(pad "49" thru_hole circle (at 2.4 -2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 2f4af0f5-60ee-4658-a6f6-a57240013afb))
(pad "49" thru_hole circle (at -2.4 0) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 4809c405-e5ae-41a4-80b0-e037558edb1f))
(pad "49" thru_hole circle (at -1.2 2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 596804b1-365f-4417-8172-048aa1582c66))
(pad "49" thru_hole circle (at 0 -1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 67dedd75-1029-4a6e-9dab-32184da018ce))
(pad "49" thru_hole circle (at 0 0) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 69fe4f3c-b317-474e-b45a-f7ddf0d8ef36))
(pad "49" thru_hole circle (at 0 2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 6b24ae74-c345-494f-91df-5c58a885337b))
(pad "49" thru_hole circle (at 0 1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 7157b059-b234-496a-934d-3c9f2a03238d))
(pad "49" thru_hole circle (at 2.4 1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 7a9cb4f1-60bb-45ea-ba68-a9c0fb7a9bc9))
(pad "49" thru_hole circle (at -2.4 -2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 849b7cbf-4c82-4c26-9592-c5ef2533b3a5))
(pad "49" thru_hole circle (at 1.2 -1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 8a02b4b3-1b58-40f0-86a5-625289d05d8d))
(pad "49" thru_hole circle (at -2.4 1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp 8e1b528e-c31b-4ab6-aac6-3a9bab7ce9ee))
(pad "49" thru_hole circle (at 2.4 0) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp a1ed522d-538c-4f12-9667-ae046de55c2b))
(pad "49" thru_hole circle (at -2.4 2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp a5c015ed-d7a2-4d0c-b946-8d5a2d23b303))
(pad "49" thru_hole circle (at 1.2 0) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp ab3f2f85-748b-4efb-bbfa-c2c5600046ba))
(pad "49" thru_hole circle (at 0 -2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp abeb7f94-d70e-4476-a09f-2122ade2d151))
(pad "49" thru_hole circle (at 2.4 -1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp afdf5e42-a0f9-46df-b6cd-bff7f5608140))
(pad "49" thru_hole circle (at -1.2 -2.4) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp c9944f72-3222-4c01-ac64-0ee036802ce6))
(pad "49" smd rect (at 0 0) (size 5.3 5.3) (layers "F.Cu" "F.Mask")
(zone_connect 2) (tstamp ca3359f2-cf00-443e-b2ba-f22a094ec451))
(pad "49" smd rect (at 0 0) (size 5.3 5.3) (layers "B.Cu")
(zone_connect 2) (tstamp d006a54e-4e12-47c0-a16a-23930d48db30))
(pad "49" thru_hole circle (at -2.4 -1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp f7af55fc-8270-4072-ac7d-4585563010b0))
(pad "49" thru_hole circle (at -1.2 1.2) (size 0.5 0.5) (drill 0.25) (layers *.Cu)
(zone_connect 2) (tstamp f7fc7b74-5737-4bf4-8d03-c6eb7cbf7fe0))
(model "${KICAD6_3DMODEL_DIR}/Package_DFN_QFN.3dshapes/QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm.wrl"
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)

View File

@ -0,0 +1,38 @@
(footprint "RFANT5220110A2T" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 5E281F47)
(descr "Walsin RFANT5220110A2T SMD antenna 2400-2500Mhz, 2dBi, http://www.passivecomponent.com/wp-content/uploads/2013/12/ASC_RFANT5220110A2T_V03.pdf")
(tags "antenna")
(attr smd)
(fp_text reference "REF**" (at 0.1 -1.9) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 6a7f5046-59f9-4d67-8a9c-0b891389c217)
)
(fp_text value "RFANT5220110A2T" (at 0 1.85) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 46483cc2-97d8-4037-b962-e5c455dff7e1)
)
(fp_text user "${REFERENCE}" (at 0 -1.9) (layer "F.Fab")
(effects (font (size 0.8 0.8) (thickness 0.12)))
(tstamp c532fb02-33df-435b-9d73-6f7d2d64cc62)
)
(fp_line (start 1.05 -1) (end 1.05 1) (layer "F.SilkS") (width 0.12) (tstamp 30de4c82-56dc-47b2-9e75-c973468a8714))
(fp_line (start 1.85 -1) (end 1.85 1) (layer "F.SilkS") (width 0.12) (tstamp 526fe57a-94cd-4f3d-a6e5-756fc2b9245f))
(fp_line (start 1.05 1) (end 1.85 1) (layer "F.SilkS") (width 0.12) (tstamp 7b4fc597-125a-4092-a1d8-4f697244e2c3))
(fp_line (start 1.85 -1) (end 1.05 -1) (layer "F.SilkS") (width 0.12) (tstamp b55b2025-be9e-4fb6-9f3a-5a59f6f3eff1))
(fp_line (start -2.8 -1.2) (end 2.8 -1.2) (layer "F.CrtYd") (width 0.05) (tstamp 3018b8f4-b60c-4768-9eb7-24fe84842cbe))
(fp_line (start 2.8 1.2) (end -2.8 1.2) (layer "F.CrtYd") (width 0.05) (tstamp 39e9941f-cef8-4456-bf1f-5913af203e04))
(fp_line (start -2.8 1.2) (end -2.8 -1.2) (layer "F.CrtYd") (width 0.05) (tstamp 5f1c8048-88a4-4142-b8b6-ac3c306463a7))
(fp_line (start 2.8 -1.2) (end 2.8 1.2) (layer "F.CrtYd") (width 0.05) (tstamp 861c5dde-d059-4f34-ad84-0eaf5595296e))
(fp_line (start 2.6 -1) (end -2.6 -1) (layer "F.Fab") (width 0.1) (tstamp 22f66731-09f9-4c60-b7fd-b87a9f4b12a3))
(fp_line (start -2.6 -1) (end -2.6 1) (layer "F.Fab") (width 0.1) (tstamp 4691bae0-0803-40f9-a46c-eb3967b52180))
(fp_line (start -2.6 1) (end 2.6 1) (layer "F.Fab") (width 0.1) (tstamp 548636b6-1f09-4fe3-b08a-1b5e14b0780f))
(fp_line (start 2.6 1) (end 2.6 -1) (layer "F.Fab") (width 0.1) (tstamp d230770e-c3c1-40ca-bd2c-270beb42c790))
(pad "" smd roundrect (at -2.7 0) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.208333) (tstamp a2974a02-96e1-452f-854a-8d9fcf06d0d5))
(pad "1" smd roundrect (at 2.7 0 180) (size 1 2) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.208333) (tstamp 17fa7a8e-0f13-45b9-9255-244464d1d108))
(model "${KICAD_USER_3DMODEL_DIR}/Walsin RFANT5220110A2T v1.step"
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz -90 0 -90))
)
)

View File

@ -0,0 +1,502 @@
(footprint "TFT_2.83IN_240X320_50PIN" (version 20211014) (generator pcbnew)
locked (layer "F.Cu")
(tedit 0)
(property "Sheetfile" "Remote.kicad_sch")
(property "Sheetname" "")
(fp_text reference "J2" (at -12 13.177148) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.119969)) (justify left))
(tstamp ff52d2c6-c9bc-400e-86ab-8d6ec1d86fd6)
)
(fp_text value "Conn_01x50" (at -6.979 14.22) (layer "F.Fab")
(effects (font (size 0.979424 0.979424) (thickness 0.036576)) (justify left))
(tstamp a90ad96b-5715-4880-affc-a4f4f48e743b)
)
(fp_text user "1" (at -11.6 16.7) (layer "B.Fab")
(effects (font (size 0.8636 0.8636) (thickness 0.1524)) (justify mirror))
(tstamp 90750a04-6889-4abf-bacd-b17d78552831)
)
(fp_line (start 25.1 -32) (end -25.1 -32) (layer "B.SilkS") (width 0.127) (tstamp 1b82a4ba-10a1-412a-8de0-64e982fedc67))
(fp_line (start 25.1 37.4) (end 25.1 -32) (layer "B.SilkS") (width 0.127) (tstamp 234d0134-6aae-497f-b792-3499237b559c))
(fp_line (start -25.1 -32) (end -25.1 37.4) (layer "B.SilkS") (width 0.127) (tstamp 528e9300-ee3d-4b7e-b57e-737a8e383aa3))
(fp_line (start -25.1 37.4) (end 25.1 37.4) (layer "B.SilkS") (width 0.127) (tstamp cd4a6184-a138-48aa-8dc0-c026866f91e5))
(fp_line (start 12.7 10.29) (end 14.8 10.29) (layer "F.SilkS") (width 0.127) (tstamp 5e9a1eb5-9678-440c-be40-9eb66edec7ad))
(fp_line (start -14.8 10.29) (end -14.8 11.59) (layer "F.SilkS") (width 0.127) (tstamp 77883ff7-2fab-4040-b3ce-f5c5211a9a01))
(fp_line (start -12.6 10.29) (end -14.8 10.29) (layer "F.SilkS") (width 0.127) (tstamp 7a4ad31f-fd61-42c7-a4ea-0241c7f979fa))
(fp_line (start 14.8 10.29) (end 14.8 11.59) (layer "F.SilkS") (width 0.127) (tstamp 8f2a1ef7-aee9-499e-9be5-271e7b65de23))
(fp_line (start -14.8 15.49) (end 14.8 15.49) (layer "F.SilkS") (width 0.127) (tstamp b17ddcc1-2a1c-4e82-b914-dca5bc6038ce))
(fp_line (start 14.8 15.49) (end 14.8 14.59) (layer "F.SilkS") (width 0.127) (tstamp bcd90c36-5b75-4f1c-bb01-80781bd808c1))
(fp_line (start -14.8 14.59) (end -14.8 15.49) (layer "F.SilkS") (width 0.127) (tstamp d93df7e2-3dce-4948-b2ef-eb3032216207))
(fp_poly (pts
(xy -2.1 11.05)
(xy -2.4 11.05)
(xy -2.4 9.75)
(xy -2.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 003de3c3-cbde-478c-b0d7-fc9d7aa0cc4d))
(fp_poly (pts
(xy -9.6 11.05)
(xy -9.9 11.05)
(xy -9.9 9.75)
(xy -9.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 041dcd1e-0f13-400a-9faf-99a30798cf4b))
(fp_poly (pts
(xy -6.1 11.05)
(xy -6.4 11.05)
(xy -6.4 9.75)
(xy -6.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 094c5b8a-4aa2-4722-ab01-b8a952c19b9d))
(fp_poly (pts
(xy 10.9 11.05)
(xy 10.6 11.05)
(xy 10.6 9.75)
(xy 10.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 10d31cf2-ae4a-4bc6-8a1e-f339af631131))
(fp_poly (pts
(xy 6.9 11.05)
(xy 6.6 11.05)
(xy 6.6 9.75)
(xy 6.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 135eb3e7-d272-45fb-ac2d-86726aad775f))
(fp_poly (pts
(xy 1.4 11.05)
(xy 1.1 11.05)
(xy 1.1 9.75)
(xy 1.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 163e7b1f-d0f3-4737-8eef-2c5a9abc22dc))
(fp_poly (pts
(xy 11.4 11.05)
(xy 11.1 11.05)
(xy 11.1 9.75)
(xy 11.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 2457bdfa-dd75-45d8-b9cd-0047142ac541))
(fp_poly (pts
(xy 7.9 11.05)
(xy 7.6 11.05)
(xy 7.6 9.75)
(xy 7.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 29ab46eb-e789-4546-8078-636c01501995))
(fp_poly (pts
(xy -5.1 11.05)
(xy -5.4 11.05)
(xy -5.4 9.75)
(xy -5.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 2f165402-5f65-41c0-9b94-5efa55acc71d))
(fp_poly (pts
(xy 12.4 11.05)
(xy 12.1 11.05)
(xy 12.1 9.75)
(xy 12.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 2ff1c929-6239-4719-87a7-d4c6a8ee10a3))
(fp_poly (pts
(xy 4.4 11.05)
(xy 4.1 11.05)
(xy 4.1 9.75)
(xy 4.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 303f673b-cb18-4929-9c30-4caabade68ae))
(fp_poly (pts
(xy 10.4 11.05)
(xy 10.1 11.05)
(xy 10.1 9.75)
(xy 10.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 30f9fc6f-7538-4d23-9513-9ace13b4a44a))
(fp_poly (pts
(xy 11.9 11.05)
(xy 11.6 11.05)
(xy 11.6 9.75)
(xy 11.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 394f26ef-1414-4923-bba2-90294dc30edd))
(fp_poly (pts
(xy 0.4 11.05)
(xy 0.1 11.05)
(xy 0.1 9.75)
(xy 0.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 3e676343-6c88-43af-994c-85c03ce0f7bb))
(fp_poly (pts
(xy -0.1 11.05)
(xy -0.4 11.05)
(xy -0.4 9.75)
(xy -0.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 3ef9bc41-a614-4d62-86f0-84d6d4466e69))
(fp_poly (pts
(xy -0.6 11.05)
(xy -0.9 11.05)
(xy -0.9 9.75)
(xy -0.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 44d015a6-72f6-45c9-8490-fbd20fc564ca))
(fp_poly (pts
(xy 2.9 11.05)
(xy 2.6 11.05)
(xy 2.6 9.75)
(xy 2.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 4a939e78-3c2c-42e4-aaf5-3563b703c90d))
(fp_poly (pts
(xy -5.6 11.05)
(xy -5.9 11.05)
(xy -5.9 9.75)
(xy -5.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 5052cad4-c7c4-47b4-a399-25e0213bd7f1))
(fp_poly (pts
(xy 4.9 11.05)
(xy 4.6 11.05)
(xy 4.6 9.75)
(xy 4.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 51de0c58-4ac1-4fba-9e3f-8ceae794a00a))
(fp_poly (pts
(xy -12.1 11.05)
(xy -12.4 11.05)
(xy -12.4 9.75)
(xy -12.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 54cac61f-6027-4320-a511-2ddef41ed4ab))
(fp_poly (pts
(xy 3.4 11.05)
(xy 3.1 11.05)
(xy 3.1 9.75)
(xy 3.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 5d817b80-7448-43bb-821c-e93ac76807b1))
(fp_poly (pts
(xy -2.6 11.05)
(xy -2.9 11.05)
(xy -2.9 9.75)
(xy -2.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 61c2d62c-d688-49c4-aa9a-f75b91725f80))
(fp_poly (pts
(xy -8.1 11.05)
(xy -8.4 11.05)
(xy -8.4 9.75)
(xy -8.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 61fca65d-e8c1-4374-a271-ccde4b2f70c8))
(fp_poly (pts
(xy 9.4 11.05)
(xy 9.1 11.05)
(xy 9.1 9.75)
(xy 9.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 638cb56e-2e0d-435a-b6c6-9aa10fdf2c67))
(fp_poly (pts
(xy -3.1 11.05)
(xy -3.4 11.05)
(xy -3.4 9.75)
(xy -3.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 6b8de6ba-1db2-4c1d-aee1-36ec39f263cc))
(fp_poly (pts
(xy -1.6 11.05)
(xy -1.9 11.05)
(xy -1.9 9.75)
(xy -1.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 6bc92364-a410-449f-b172-12ffd5dc405d))
(fp_poly (pts
(xy 7.4 11.05)
(xy 7.1 11.05)
(xy 7.1 9.75)
(xy 7.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 72157056-2124-4037-95bd-6a5d9189cdb1))
(fp_poly (pts
(xy -11.6 11.05)
(xy -11.9 11.05)
(xy -11.9 9.75)
(xy -11.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 764ce819-2034-4178-87c4-d1abe2fa43d6))
(fp_poly (pts
(xy 1.9 11.05)
(xy 1.6 11.05)
(xy 1.6 9.75)
(xy 1.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 782ea488-f1a3-46be-94dc-fa245895286f))
(fp_poly (pts
(xy -10.6 11.05)
(xy -10.9 11.05)
(xy -10.9 9.75)
(xy -10.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 80a90484-bbed-4109-959b-bb8afa05fddb))
(fp_poly (pts
(xy -4.1 11.05)
(xy -4.4 11.05)
(xy -4.4 9.75)
(xy -4.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 833e2232-1642-4ddc-a579-c39ca0d66813))
(fp_poly (pts
(xy -8.6 11.05)
(xy -8.9 11.05)
(xy -8.9 9.75)
(xy -8.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 83570c82-edae-43f0-82c3-435811542e98))
(fp_poly (pts
(xy -4.6 11.05)
(xy -4.9 11.05)
(xy -4.9 9.75)
(xy -4.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 9d3f772e-d90a-42a3-a480-9fe7bf22220e))
(fp_poly (pts
(xy -10.1 11.05)
(xy -10.4 11.05)
(xy -10.4 9.75)
(xy -10.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp 9f64881c-0bf4-4a49-84c2-f7dc20d4ec27))
(fp_poly (pts
(xy 3.9 11.05)
(xy 3.6 11.05)
(xy 3.6 9.75)
(xy 3.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp a8fd5cb4-f1ca-4915-a279-52ecb3486ead))
(fp_poly (pts
(xy -1.1 11.05)
(xy -1.4 11.05)
(xy -1.4 9.75)
(xy -1.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp b1c1ad0f-27b0-4f11-8c40-b199d45a6ec3))
(fp_poly (pts
(xy 6.4 11.05)
(xy 6.1 11.05)
(xy 6.1 9.75)
(xy 6.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp b2adee7d-b1b0-4a79-93dd-b6d59eac6591))
(fp_poly (pts
(xy -9.1 11.05)
(xy -9.4 11.05)
(xy -9.4 9.75)
(xy -9.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp b49567f8-eb01-4e00-a2fa-3c2608b9c17f))
(fp_poly (pts
(xy -11.1 11.05)
(xy -11.4 11.05)
(xy -11.4 9.75)
(xy -11.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp bfd6b178-8974-4313-a0dc-8bf4abae454b))
(fp_poly (pts
(xy 8.4 11.05)
(xy 8.1 11.05)
(xy 8.1 9.75)
(xy 8.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp c76ea3b5-561f-4f8e-babc-d03623b1f762))
(fp_poly (pts
(xy 0.9 11.05)
(xy 0.6 11.05)
(xy 0.6 9.75)
(xy 0.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp d2a15574-d7fe-47d4-b6d6-545c3ffa5074))
(fp_poly (pts
(xy 8.9 11.05)
(xy 8.6 11.05)
(xy 8.6 9.75)
(xy 8.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp dd3e5dc0-f33e-48bb-82df-ee29a7194579))
(fp_poly (pts
(xy -3.6 11.05)
(xy -3.9 11.05)
(xy -3.9 9.75)
(xy -3.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp e298a571-81f6-4798-9db0-714278c3c9c6))
(fp_poly (pts
(xy -7.6 11.05)
(xy -7.9 11.05)
(xy -7.9 9.75)
(xy -7.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp e46c7932-226b-4bda-b69e-ece525f7a21e))
(fp_poly (pts
(xy 9.9 11.05)
(xy 9.6 11.05)
(xy 9.6 9.75)
(xy 9.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp eafb81a0-eb09-4e50-863a-6213e2d5acd8))
(fp_poly (pts
(xy 2.4 11.05)
(xy 2.1 11.05)
(xy 2.1 9.75)
(xy 2.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp ecf7b1cd-26ae-46ed-8ab5-0c13e95d71ec))
(fp_poly (pts
(xy -6.6 11.05)
(xy -6.9 11.05)
(xy -6.9 9.75)
(xy -6.6 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp f4b387df-211d-4fb3-86bf-79ec5e5bbef3))
(fp_poly (pts
(xy 5.4 11.05)
(xy 5.1 11.05)
(xy 5.1 9.75)
(xy 5.4 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp f4deea75-4bc8-41d4-a424-b961e5766e37))
(fp_poly (pts
(xy -7.1 11.05)
(xy -7.4 11.05)
(xy -7.4 9.75)
(xy -7.1 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp fda0c67e-51ca-4a2e-abe5-249f08b2b953))
(fp_poly (pts
(xy 5.9 11.05)
(xy 5.6 11.05)
(xy 5.6 9.75)
(xy 5.9 9.75)
) (layer "F.Mask") (width 0) (fill solid) (tstamp ff0215b1-b61e-4dab-8856-e27ddbde0934))
(fp_line (start 20.802074 37.00519) (end 7.19481 37.002074) (layer "Edge.Cuts") (width 0.2) (tstamp 0476137b-0d4c-41fd-b9f2-2fc6050ab7cd))
(fp_line (start 5.997926 25.19481) (end 5.99481 35.802074) (layer "Edge.Cuts") (width 0.2) (tstamp 1def679d-2c42-42dd-855a-d7b046b57ab5))
(fp_line (start 20.80519 23.997926) (end 7.197926 23.99481) (layer "Edge.Cuts") (width 0.2) (tstamp 65353157-2f93-4ec2-ba38-09c13fb6e5ea))
(fp_line (start -13.80519 22.502074) (end 13.802074 22.50519) (layer "Edge.Cuts") (width 0.2) (tstamp 923ac5f4-f161-400c-a62b-87b7471faed0))
(fp_line (start 22.00519 25.197926) (end 22.002074 35.80519) (layer "Edge.Cuts") (width 0.2) (tstamp 938f00b8-05d2-4e18-8ce8-54921b9550aa))
(fp_line (start -13.802074 16.49481) (end 13.80519 16.497926) (layer "Edge.Cuts") (width 0.2) (tstamp 9829d313-8826-43e4-98c7-cf424680bc87))
(fp_line (start -15.00519 21.302074) (end -15.002074 17.69481) (layer "Edge.Cuts") (width 0.2) (tstamp b0e119a3-0fb6-4133-82c8-acdda508895d))
(fp_line (start 15.002074 21.30519) (end 15.00519 17.697926) (layer "Edge.Cuts") (width 0.2) (tstamp e9418b43-4aa4-402c-9d8d-26d928c55d96))
(fp_arc (start 5.997926 25.19481) (mid 6.349398 24.346282) (end 7.197926 23.99481) (layer "Edge.Cuts") (width 0.2) (tstamp 04e8af2c-512b-45f1-9a38-342929c3e290))
(fp_arc (start -13.80519 22.502074) (mid -14.653718 22.150602) (end -15.00519 21.302074) (layer "Edge.Cuts") (width 0.2) (tstamp 3bdfe91c-33d8-4a80-b6b5-06d258a14b25))
(fp_arc (start 20.80519 23.997926) (mid 21.653718 24.349398) (end 22.00519 25.197926) (layer "Edge.Cuts") (width 0.2) (tstamp 4390cb64-d846-4d74-979f-a4ed7291409f))
(fp_arc (start 22.002074 35.80519) (mid 21.650602 36.653718) (end 20.802074 37.00519) (layer "Edge.Cuts") (width 0.2) (tstamp 539c424f-535d-46ac-bded-fb6fa791c809))
(fp_arc (start -15.002074 17.69481) (mid -14.650602 16.846282) (end -13.802074 16.49481) (layer "Edge.Cuts") (width 0.2) (tstamp 542aeeb8-a875-4352-aced-c5df33ffd28b))
(fp_arc (start 7.19481 37.002074) (mid 6.346282 36.650602) (end 5.99481 35.802074) (layer "Edge.Cuts") (width 0.2) (tstamp 79576ecf-a311-41b8-a8ff-3b4496660d06))
(fp_arc (start 15.002074 21.30519) (mid 14.650602 22.153718) (end 13.802074 22.50519) (layer "Edge.Cuts") (width 0.2) (tstamp 95312508-5df4-4fc8-bab9-69cfa2771d0c))
(fp_arc (start 13.80519 16.497926) (mid 14.653718 16.849398) (end 15.00519 17.697926) (layer "Edge.Cuts") (width 0.2) (tstamp e2b1e7f4-0c10-4f97-ab10-25db4cf38a7e))
(fp_line (start 22.6 -29.8) (end -22.6 -29.8) (layer "B.Fab") (width 0.127) (tstamp 0628601b-3b06-4d57-bfec-bc5fdccc181b))
(fp_line (start -21.6 -29.22) (end -21.6 28.38) (layer "B.Fab") (width 0.127) (tstamp 082639eb-d922-443a-a7fa-0c72f0a8a298))
(fp_line (start -17.9 25.8) (end -18.1 25.8) (layer "B.Fab") (width 0.127) (tstamp 12156ff8-e859-4a27-819e-45039f943e3d))
(fp_line (start -25 -31.9) (end -25 37.3) (layer "B.Fab") (width 0.127) (tstamp 18dbf831-f135-4009-8044-bba310be5a43))
(fp_line (start 22.6 30.2) (end 18.2 25.8) (layer "B.Fab") (width 0.127) (tstamp 2b87f9a1-cf91-48c3-87f9-f0b43ac4535c))
(fp_line (start 12.1 36.9) (end 21.7 36.9) (layer "B.Fab") (width 0.127) (tstamp 3684b517-92df-44e5-b246-b48b8eadb9c0))
(fp_line (start -12.5 12.5) (end -12.5 15.8) (layer "B.Fab") (width 0.127) (tstamp 413f5a1b-baad-4830-ab08-ec0c98ac22c2))
(fp_line (start -21.6 36.9) (end -11.7 36.9) (layer "B.Fab") (width 0.127) (tstamp 5a1a9bd9-cd3c-4553-819c-aebb70cb36fb))
(fp_line (start 21.6 -29.22) (end -21.6 -29.22) (layer "B.Fab") (width 0.127) (tstamp 60681e66-da5b-49b4-bb83-d761bfd7b901))
(fp_line (start -13.4 25.8) (end -17.9 25.8) (layer "B.Fab") (width 0.127) (tstamp 6772d0c9-342e-4a0e-8f9b-c87ae0f528a8))
(fp_line (start 12.5 24.8) (end 12.5 15.8) (layer "B.Fab") (width 0.127) (tstamp 6bd30e49-67ad-4f58-b372-29e6b6142a88))
(fp_line (start 12.2 12.2) (end -12.2 12.2) (layer "B.Fab") (width 0.127) (tstamp 7607d556-af34-4015-8d94-01a0b4b108f1))
(fp_line (start -22.6 -29.8) (end -22.6 29.55) (layer "B.Fab") (width 0.127) (tstamp 99255112-9f3b-48cd-af50-29cb5d80b2e1))
(fp_line (start -18.1 25.8) (end -22.6 30.3) (layer "B.Fab") (width 0.127) (tstamp ad02a636-0f59-45f1-9a8d-f61ece16ee50))
(fp_line (start 25 37.3) (end 25 -31.9) (layer "B.Fab") (width 0.127) (tstamp b3f6aec5-7cd0-4bbf-a32e-f58b3c50e466))
(fp_line (start -22.6 30.3) (end -22.6 35.9) (layer "B.Fab") (width 0.127) (tstamp b544f5b2-1db5-4a42-9bc9-b0d446f0d596))
(fp_line (start 11.8 36.9) (end 12.1 36.9) (layer "B.Fab") (width 0.127) (tstamp b6de97a7-0777-492e-84ab-3a100456f7e4))
(fp_line (start -21.6 28.38) (end 21.6 28.38) (layer "B.Fab") (width 0.127) (tstamp b73418c0-b364-4f48-b2cc-6b73aed24a20))
(fp_line (start 22.6 36) (end 22.6 30.2) (layer "B.Fab") (width 0.127) (tstamp d4b029ca-6e42-4b6a-b9db-c034c9a5d43f))
(fp_line (start 12.5 15.8) (end -12.5 15.8) (layer "B.Fab") (width 0.127) (tstamp d747aafd-3d11-426e-8cf4-ecf044d25cec))
(fp_line (start 21.6 28.38) (end 21.6 -29.22) (layer "B.Fab") (width 0.127) (tstamp d7c6e4fd-6575-4a4d-8068-1f22459268e7))
(fp_line (start 25 -31.9) (end -25 -31.9) (layer "B.Fab") (width 0.127) (tstamp d8386bec-aa94-44c9-93e9-50c5e520bf43))
(fp_line (start -12.5 15.8) (end -12.5 24.9) (layer "B.Fab") (width 0.127) (tstamp e6c0245f-8341-47aa-8f18-83d447c2856b))
(fp_line (start 22.6 29.55) (end 22.6 -29.8) (layer "B.Fab") (width 0.127) (tstamp ea6676a4-2fad-46da-97db-f7e6267b4698))
(fp_line (start -22.6 29.55) (end 22.6 29.55) (layer "B.Fab") (width 0.127) (tstamp ec6d35c9-4961-4a21-a516-28bcdd50335d))
(fp_line (start -25 37.3) (end 25 37.3) (layer "B.Fab") (width 0.127) (tstamp f1a0cd7c-3827-4578-b1a7-bc32676dc19c))
(fp_line (start 12.5 15.8) (end 12.5 12.5) (layer "B.Fab") (width 0.127) (tstamp f961676a-d9a9-4649-b1a4-e4a17c946dcd))
(fp_line (start 18.2 25.8) (end 13.5 25.8) (layer "B.Fab") (width 0.127) (tstamp fb95da0b-aa13-4caa-b087-ce6b3d75f37f))
(fp_arc (start -21.6 36.9) (mid -22.307107 36.607107) (end -22.6 35.9) (layer "B.Fab") (width 0.127) (tstamp 25a1b5e2-99ac-4c26-bc67-6ce11d34a351))
(fp_arc (start -12.5 12.5) (mid -12.412132 12.287868) (end -12.2 12.2) (layer "B.Fab") (width 0.127) (tstamp 2b738a34-3d76-49a4-9a4a-803feb497f93))
(fp_arc (start 22.6 36) (mid 22.336396 36.636396) (end 21.7 36.9) (layer "B.Fab") (width 0.127) (tstamp 2fafcb8e-d596-4c36-992f-515aa150ea11))
(fp_arc (start -12.5 24.9) (mid -12.763604 25.536396) (end -13.4 25.8) (layer "B.Fab") (width 0.127) (tstamp 978c8af1-8be4-4f34-92e0-3d29dd706f1b))
(fp_arc (start 12.2 12.2) (mid 12.412132 12.287868) (end 12.5 12.5) (layer "B.Fab") (width 0.127) (tstamp d372aebb-f00c-42be-bac6-e682e0b5e31f))
(fp_arc (start 13.5 25.8) (mid 12.792893 25.507107) (end 12.5 24.8) (layer "B.Fab") (width 0.127) (tstamp f4cff259-d752-460e-8320-b084cdaaee8f))
(fp_line (start -14.65 15.39) (end -14.65 10.39) (layer "F.Fab") (width 0.127) (tstamp 30d78fef-d2ca-47d0-b188-a7071ef1816d))
(fp_line (start -12.4 11.49) (end -12.3 11.39) (layer "F.Fab") (width 0.127) (tstamp 38b093a0-f52a-4aa3-9200-4b5e1966e42a))
(fp_line (start -12.3 11.29) (end -12.1 11.49) (layer "F.Fab") (width 0.127) (tstamp 4acb72aa-a067-4a83-a0bd-aff224bc6cc6))
(fp_line (start -14.65 15.39) (end 14.65 15.39) (layer "F.Fab") (width 0.127) (tstamp 5d970006-8ca9-4785-9c60-66ffc4dc1b3f))
(fp_line (start -12.5 11.49) (end -12.3 11.29) (layer "F.Fab") (width 0.127) (tstamp 710bb1b1-ccc9-4b23-83e0-3430c3705d83))
(fp_line (start -14.65 10.39) (end 14.65 10.39) (layer "F.Fab") (width 0.127) (tstamp 99cf5947-ec49-4197-bd4d-0cd7998983a4))
(fp_line (start 14.65 10.39) (end 14.65 15.39) (layer "F.Fab") (width 0.127) (tstamp b70b8322-a440-44ed-ac12-17a6287cc412))
(fp_line (start -12.1 11.49) (end -12.4 11.49) (layer "F.Fab") (width 0.127) (tstamp cb3c80b6-e8b9-48a1-a239-83a7594038c7))
(fp_line (start -12.5 11.49) (end -12.4 11.49) (layer "F.Fab") (width 0.127) (tstamp e4dcdaa7-8825-4072-ab38-7a1f258ad21c))
(pad "1" smd rect locked (at -12.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp bb612fc8-0230-435c-9890-7a2aa7cd7c03))
(pad "2" smd rect locked (at -11.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 5b3e68d9-d96e-4524-85b8-1b2d68d9ecd1))
(pad "3" smd rect locked (at -11.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 4ebeceef-9614-4bcb-94d4-9af37e409356))
(pad "4" smd rect locked (at -10.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp c22dfda9-070f-4d17-8813-c3509417fa38))
(pad "5" smd rect locked (at -10.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp f1fce783-083c-4957-87c2-ee1a0608c47c))
(pad "6" smd rect locked (at -9.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp ec4e57ab-a512-4204-9b96-d3fc009b2a27))
(pad "7" smd rect locked (at -9.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 82509d92-9691-4afb-ad35-c5130198d00f))
(pad "8" smd rect locked (at -8.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 6038266a-e279-4d83-a44e-2cbd0e9c8660))
(pad "9" smd rect locked (at -8.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp fb72510e-993d-4799-97f7-d1b53dca84f4))
(pad "10" smd rect locked (at -7.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp ab65ad78-10bf-4666-8360-e040fc4e0a88))
(pad "11" smd rect locked (at -7.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 2d0342e2-5879-4770-8283-d807f7a21734))
(pad "12" smd rect locked (at -6.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp a227e72f-edbc-47aa-8810-bca3392fd292))
(pad "13" smd rect locked (at -6.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp b71fbad5-5c6c-44c0-a0a7-5ac74a01ae69))
(pad "14" smd rect locked (at -5.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 70b73780-bed4-4c8e-b6a2-508217d06277))
(pad "15" smd rect locked (at -5.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 17f20097-7f74-41ca-8325-c768a9b8655c))
(pad "16" smd rect locked (at -4.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 992dac85-96c7-4254-ab80-3f7b3c68e567))
(pad "17" smd rect locked (at -4.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 28c898b6-1c96-4dd4-979c-99799261d43a))
(pad "18" smd rect locked (at -3.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp cb1c8448-40e8-40b9-ab18-01f59bf429dc))
(pad "19" smd rect locked (at -3.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 1d0c89c1-119c-483f-8b51-54a80c32762b))
(pad "20" smd rect locked (at -2.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 7367b5aa-bc3b-4fec-869e-b85ad3920d7e))
(pad "21" smd rect locked (at -2.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 3b421b80-5de6-4059-bc40-265defe4046d))
(pad "22" smd rect locked (at -1.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp fbf1bc49-6349-49f7-90a6-dcc862659f8b))
(pad "23" smd rect locked (at -1.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 92c6c38f-dbd4-477b-ac6f-5390011d20eb))
(pad "24" smd rect locked (at -0.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 52104748-4436-460d-8c39-1180ed574bad))
(pad "25" smd rect locked (at -0.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 3423931e-6b11-4131-ad78-a16bff8f773e))
(pad "26" smd rect locked (at 0.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 66665c53-d66b-4105-859f-b9ca3ef18810))
(pad "27" smd rect locked (at 0.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 50a2cfff-8628-491a-b858-cfe8db6437b7))
(pad "28" smd rect locked (at 1.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 5b579e6b-81cb-4ae9-b0ba-07ddc629f5e3))
(pad "29" smd rect locked (at 1.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 08d8946b-a2d1-45b0-b7a3-6e8b945cec67))
(pad "30" smd rect locked (at 2.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 85871820-9e35-4967-aa03-10bddcb2f5fd))
(pad "31" smd rect locked (at 2.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp af86b8ba-1e94-45b0-880a-43ab28ab2e79))
(pad "32" smd rect locked (at 3.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp cf89f04e-872e-4ee7-8507-584bdebf187f))
(pad "33" smd rect locked (at 3.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 6446f55e-c9a0-4e3a-a284-3e81bde619e3))
(pad "34" smd rect locked (at 4.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp b5d5eb1d-e9ac-49a6-a23b-f7c05a3a1ea7))
(pad "35" smd rect locked (at 4.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 3d87c495-23f0-4ec0-9f0d-4d0cc39404d4))
(pad "36" smd rect locked (at 5.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 8fae0fe0-b15e-4ae0-8500-46ac5a4b533b))
(pad "37" smd rect locked (at 5.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 09b47778-701a-42f5-bb27-cb29871b401b))
(pad "38" smd rect locked (at 6.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 1de2db96-0002-4179-bce6-4390addbe0cb))
(pad "39" smd rect locked (at 6.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 170aa499-ab08-480e-a5b1-221859d19e94))
(pad "40" smd rect locked (at 7.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp e11212a1-6916-40b2-bd38-422645a8ea20))
(pad "41" smd rect locked (at 7.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 7e73f4bc-7a60-4a15-85b8-59d7fdce7866))
(pad "42" smd rect locked (at 8.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 4a3c5123-5668-433b-833a-b41dac187898))
(pad "43" smd rect locked (at 8.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 2b20a8c5-f444-44e8-a268-b3ca52d3f0e3))
(pad "44" smd rect locked (at 9.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 31d12518-8498-4d48-93e7-b22e2c322582))
(pad "45" smd rect locked (at 9.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp fb282b66-454d-4357-bf93-68c60b9d0447))
(pad "46" smd rect locked (at 10.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 0955a735-c68f-4482-8a75-4d517a9fd4ac))
(pad "47" smd rect locked (at 10.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 6e0e5b10-90d4-4e5d-8f3b-aca86c7de071))
(pad "48" smd rect locked (at 11.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 652893ad-ff68-444c-9fb1-d10c8b7b75bf))
(pad "49" smd rect locked (at 11.75 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 95d7859b-4a1e-4e56-a441-7944378038e2))
(pad "50" smd rect locked (at 12.25 10.39 180) (size 0.275 1.2) (layers "F.Cu" "F.Paste")
(solder_mask_margin 0.1016) (tstamp 51f513ca-423d-4ec1-8618-ba944d6ca5e9))
(pad "MP" smd roundrect locked (at 14.35 13.09 180) (size 2.4 2.4) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.125)
(solder_mask_margin 0.1016) (tstamp 582bdb91-1ead-4160-b1bd-6d70f240792c))
(pad "MP" smd roundrect locked (at -14.35 13.09 180) (size 2.4 2.4) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.125)
(solder_mask_margin 0.1016) (tstamp cc80ee50-cdaa-47f5-8410-09359f16451f))
(model "${KICAD_USER_3DMODEL_DIR}/541325062_colored.step"
(offset (xyz 0 -15.5 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
(model "${KICAD_USER_3DMODEL_DIR}/280QV10 v5.step"
(offset (xyz 0 -22.25 -6))
(scale (xyz 1 1 1))
(rotate (xyz 180 0 180))
)
)

View File

@ -0,0 +1,59 @@
(footprint "USB_C_Receptacle_HRO_TYPE-C-31-M-12" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 5D3C0721)
(descr "USB Type-C receptacle for USB 2.0 and PD, http://www.krhro.com/uploads/soft/180320/1-1P320120243.pdf")
(tags "usb usb-c 2.0 pd")
(attr smd)
(fp_text reference "REF**" (at 0 -5.645) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp a144ce76-cc23-44fb-8108-bf18e64a4c3d)
)
(fp_text value "USB_C_Receptacle_HRO_TYPE-C-31-M-12" (at 0 5.1) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 0ca5cf76-e951-4e58-a402-14dc42a864b3)
)
(fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 9189a13a-f353-4ddb-8257-370c54398cd0)
)
(fp_line (start 4.7 -1.9) (end 4.7 0.1) (layer "F.SilkS") (width 0.12) (tstamp 177e7db1-b916-4e65-ace8-532e6e1f85db))
(fp_line (start -4.7 2) (end -4.7 3.9) (layer "F.SilkS") (width 0.12) (tstamp 7abeef8d-db92-4e88-b3d6-7c7e4efa4938))
(fp_line (start -4.7 -1.9) (end -4.7 0.1) (layer "F.SilkS") (width 0.12) (tstamp 9513b845-7495-41b4-99da-c8a12a5f4b76))
(fp_line (start 4.7 2) (end 4.7 3.9) (layer "F.SilkS") (width 0.12) (tstamp bd122681-67e3-4c23-b564-57e345c7c818))
(fp_line (start -4.7 3.9) (end 4.7 3.9) (layer "F.SilkS") (width 0.12) (tstamp f40329f5-4d09-479c-8f81-97fdcd13c5cd))
(fp_line (start -5.32 -5.27) (end 5.32 -5.27) (layer "F.CrtYd") (width 0.05) (tstamp 3215d7dd-650e-4c6a-86e5-bc970c8d9c6c))
(fp_line (start 5.32 -5.27) (end 5.32 4.15) (layer "F.CrtYd") (width 0.05) (tstamp 3b610068-7f90-495b-a772-9a6b7e6a55c9))
(fp_line (start -5.32 4.15) (end 5.32 4.15) (layer "F.CrtYd") (width 0.05) (tstamp c38cb6a1-740b-49d2-b49e-f8ce3382fe48))
(fp_line (start -5.32 -5.27) (end -5.32 4.15) (layer "F.CrtYd") (width 0.05) (tstamp d939342c-cab3-429e-ad71-738d34173267))
(fp_line (start -4.47 -3.65) (end -4.47 3.65) (layer "F.Fab") (width 0.1) (tstamp 47095738-bb75-4e91-802c-f92840c443b3))
(fp_line (start -4.47 -3.65) (end 4.47 -3.65) (layer "F.Fab") (width 0.1) (tstamp 6142486d-ba8a-4b38-a6ca-d52b6a020ef2))
(fp_line (start -4.47 3.65) (end 4.47 3.65) (layer "F.Fab") (width 0.1) (tstamp 84966fee-864e-4cdc-8345-c62bca33694f))
(fp_line (start 4.47 -3.65) (end 4.47 3.65) (layer "F.Fab") (width 0.1) (tstamp f6b3cf35-21be-4e1f-8c99-3404cfc41d3f))
(pad "" np_thru_hole circle (at 2.89 -2.6) (size 0.65 0.65) (drill 0.65) (layers *.Cu *.Mask) (tstamp 4558f1f0-2fa3-46e1-a220-284fa2707bb5))
(pad "" np_thru_hole circle (at -2.89 -2.6) (size 0.65 0.65) (drill 0.65) (layers *.Cu *.Mask) (tstamp e13b4b37-788a-41d5-87ca-c66be43ee32d))
(pad "A1" smd rect (at -3.25 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 245fae56-8b58-4bd8-bbf1-36624dc3fa3e))
(pad "A4" smd rect (at -2.45 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 412cd3c1-0d89-4ca6-be0e-1b17d8471f5a))
(pad "A5" smd rect (at -1.25 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 93953890-acba-456b-bb6d-b1e79179ffa0))
(pad "A6" smd rect (at -0.25 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 6a642da3-3122-4031-a6e9-68498b0f5bb9))
(pad "A7" smd rect (at 0.25 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 01b9b129-063c-4bae-b620-9610006254cb))
(pad "A8" smd rect (at 1.25 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 46ecdf8a-0917-4257-a388-b77e7451dc23))
(pad "A9" smd rect (at 2.45 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a35f3da7-7460-43f1-99b7-9ed521817778))
(pad "A12" smd rect (at 3.25 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 3795b0f1-50f9-473e-9d26-381fc08b3c2d))
(pad "B1" smd rect (at 3.25 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp c9e8a0db-2a60-41d9-b783-6c4e64a8fb5d))
(pad "B4" smd rect (at 2.45 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 51b193ee-c8c2-4ee6-8d8c-14b79a2c1520))
(pad "B5" smd rect (at 1.75 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 45f8f791-f545-4341-9848-fb81a03703a6))
(pad "B6" smd rect (at 0.75 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp efc27675-62a0-44de-8210-29c2190dd309))
(pad "B7" smd rect (at -0.75 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 96622dcb-c1cc-4b7d-8455-8cd0ce1e5c34))
(pad "B8" smd rect (at -1.75 -4.045) (size 0.3 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 09bb6e12-e7e5-4788-b43e-4cc6c50a557a))
(pad "B9" smd rect (at -2.45 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 70539c09-2020-4a42-a156-43d1513170d0))
(pad "B12" smd rect (at -3.25 -4.045) (size 0.6 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp eda87c04-3a59-4e2c-a9bd-f59ed31672aa))
(pad "S1" thru_hole oval (at -4.32 1.05) (size 1 1.6) (drill oval 0.6 1.2) (layers *.Cu *.Mask) (tstamp 5991ca6f-c5c1-4692-8fe9-cf4b7ca50c4b))
(pad "S1" thru_hole oval (at -4.32 -3.13) (size 1 2.1) (drill oval 0.6 1.7) (layers *.Cu *.Mask) (tstamp 69c3dc88-a37e-49ef-ae4d-497d3191ad5b))
(pad "S1" thru_hole oval (at 4.32 -3.13) (size 1 2.1) (drill oval 0.6 1.7) (layers *.Cu *.Mask) (tstamp af5ae63f-ef36-487e-a6b8-831b84890f25))
(pad "S1" thru_hole oval (at 4.32 1.05) (size 1 1.6) (drill oval 0.6 1.2) (layers *.Cu *.Mask) (tstamp e783dde5-f762-4528-9b55-9220820b0b1c))
(model "${KICAD6_3DMODEL_DIR}/Connector_USB.3dshapes/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.wrl"
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)

View File

@ -0,0 +1,70 @@
(footprint "XDCR_LIS3DHTR" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tedit 63C5A93A)
(property "MANUFACTURER" "STMicroelectronics")
(property "MAXIMUM_PACKAGE_HEIGHT" "1mm")
(property "PARTREV" "2")
(property "STANDARD" "Manufacturer Recommendations")
(property "Sheetfile" "Remote.kicad_sch")
(property "Sheetname" "")
(attr smd)
(fp_text reference "U5" (at 2.95 0 180) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 374a0097-2de3-4564-b932-de03f826f800)
)
(fp_text value "LIS3DHTR" (at 2.214931 2.197712) (layer "F.Fab")
(effects (font (size 0.480549 0.480549) (thickness 0.15)))
(tstamp 52e1e569-3bfd-4f45-a6db-9e1968d681e6)
)
(fp_line (start -1.5 1.5) (end -0.99 1.5) (layer "F.SilkS") (width 0.127) (tstamp 2081c3ad-5787-4332-ba82-277e5241665b))
(fp_line (start 0.99 1.5) (end 1.5 1.5) (layer "F.SilkS") (width 0.127) (tstamp 2a1b7413-e170-4045-9dac-153a3b21bf7e))
(fp_line (start -0.99 -1.5) (end -1.5 -1.5) (layer "F.SilkS") (width 0.127) (tstamp 9322c011-81bb-41c7-85f5-40c67b722006))
(fp_line (start 0.99 -1.5) (end 1.5 -1.5) (layer "F.SilkS") (width 0.127) (tstamp a2669417-e994-4b1d-b2f2-3dce289d6e30))
(fp_circle (center -2 -1.275) (end -1.9 -1.275) (layer "F.SilkS") (width 0.2) (fill none) (tstamp d50ae10a-f8a6-439b-9dad-9976c141662c))
(fp_line (start 1.75 -1.75) (end -1.75 -1.75) (layer "F.CrtYd") (width 0.05) (tstamp 1da0581e-0634-4f86-a649-40e28a617db1))
(fp_line (start 1.75 1.75) (end 1.75 -1.75) (layer "F.CrtYd") (width 0.05) (tstamp 90778098-11d2-4387-8034-6fb9e7499f01))
(fp_line (start -1.75 -1.75) (end -1.75 1.75) (layer "F.CrtYd") (width 0.05) (tstamp e71ab22f-26b3-470d-9261-9b9561982f75))
(fp_line (start -1.75 1.75) (end 1.75 1.75) (layer "F.CrtYd") (width 0.05) (tstamp fe2760a0-53e7-4010-891f-881eab63f2a9))
(fp_line (start 1.5 1.5) (end 1.5 -1.5) (layer "F.Fab") (width 0.127) (tstamp 47630037-5ac1-48a3-bd98-d1a71262f6f6))
(fp_line (start -1.5 -1.5) (end -1.5 1.5) (layer "F.Fab") (width 0.127) (tstamp 556f507a-48ab-4f3c-8abb-3f0f3d91aa76))
(fp_line (start 1.5 -1.5) (end -1.5 -1.5) (layer "F.Fab") (width 0.127) (tstamp bd3ff0a5-6d77-4d67-8d0b-b4976c46846c))
(fp_line (start -1.5 1.5) (end 1.5 1.5) (layer "F.Fab") (width 0.127) (tstamp ebb0933f-e66f-4aba-880c-7fca8b9f79d8))
(fp_circle (center -2 -1.275) (end -1.9 -1.275) (layer "F.Fab") (width 0.2) (fill none) (tstamp c94c5700-aec0-41d1-a114-505756d804f9))
(pad "1" smd rect (at -1.3 -1 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 7ce2738e-4072-48e7-a518-8a580ecee0f5))
(pad "2" smd rect (at -1.3 -0.5 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 04ea73f6-28d1-4d85-9bb8-4e5a753b3f65))
(pad "3" smd rect (at -1.3 0 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 482ffa32-4456-4c86-b66d-dceb6c27eeac))
(pad "4" smd rect (at -1.3 0.5 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp e8e4d6e7-cc95-4968-94fe-07b9bfef73f0))
(pad "5" smd rect (at -1.3 1 180) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 3b983567-e799-4945-857c-c5f9170ab567))
(pad "6" smd rect (at -0.5 1.3 90) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 28f8fe79-c66e-4459-92d7-108b74968d32))
(pad "7" smd rect (at 0 1.3 90) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 914f59c3-ce05-4f40-bfdc-047facb8783a))
(pad "8" smd rect (at 0.5 1.3 90) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 5f14e7da-b7d5-407f-95b8-eb7749d2a093))
(pad "9" smd rect (at 1.3 1) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 519d0b87-5fd1-417c-b3ea-eecd61e657e0))
(pad "10" smd rect (at 1.3 0.5) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp d6e846ea-ffd3-4433-90f9-6fa4e33544d3))
(pad "11" smd rect (at 1.3 0) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp a91a8bcf-e4a1-416e-8222-7ea6b67da753))
(pad "12" smd rect (at 1.3 -0.5) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 6c727f12-b586-47f1-9a08-5eb12ad424b2))
(pad "13" smd rect (at 1.3 -1) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 90f01d37-428b-4c39-804c-41bccfcd87d4))
(pad "14" smd rect (at 0.5 -1.3 90) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp 7badf7c8-880d-4196-b7b4-8fc3eb5d54f4))
(pad "15" smd rect (at 0 -1.3 90) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp d23e0d93-144a-486b-b85f-df6457adfb2f))
(pad "16" smd rect (at -0.5 -1.3 90) (size 0.8 0.3) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_paste_margin_ratio -0.05) (tstamp ff5fb629-bba5-476c-9a80-43cb06181e4d))
(model "${KICAD_USER_3DMODEL_DIR}/LIS3DHTR.step"
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz -90 0 0))
)
)

View File

@ -0,0 +1,815 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "Conn_01x50" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 63.5 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "Conn_01x50" (at 0 -66.04 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "omoteLib:TFT_2.83IN_240X320_50PIN" (at 1.27 -68.58 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (at 0 12.7 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "connector" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Generic connector, single row, 01x50" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "Conn_01x50_1_1"
(rectangle (start -1.27 -63.373) (end 0 -63.627)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -60.833) (end 0 -61.087)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -58.293) (end 0 -58.547)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -55.753) (end 0 -56.007)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -53.213) (end 0 -53.467)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -50.673) (end 0 -50.927)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -48.133) (end 0 -48.387)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -45.593) (end 0 -45.847)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -43.053) (end 0 -43.307)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -40.513) (end 0 -40.767)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -37.973) (end 0 -38.227)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -35.433) (end 0 -35.687)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -32.893) (end 0 -33.147)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -30.353) (end 0 -30.607)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -27.813) (end 0 -28.067)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -25.273) (end 0 -25.527)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -22.733) (end 0 -22.987)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -20.193) (end 0 -20.447)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -17.653) (end 0 -17.907)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -15.113) (end 0 -15.367)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -12.573) (end 0 -12.827)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -10.033) (end 0 -10.287)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -7.493) (end 0 -7.747)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -4.953) (end 0 -5.207)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -2.413) (end 0 -2.667)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 0.127) (end 0 -0.127)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 2.667) (end 0 2.413)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 5.207) (end 0 4.953)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 7.747) (end 0 7.493)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 10.287) (end 0 10.033)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 12.827) (end 0 12.573)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 15.367) (end 0 15.113)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 17.907) (end 0 17.653)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 20.447) (end 0 20.193)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 22.987) (end 0 22.733)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 25.527) (end 0 25.273)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 28.067) (end 0 27.813)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 30.607) (end 0 30.353)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 33.147) (end 0 32.893)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 35.687) (end 0 35.433)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 38.227) (end 0 37.973)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 40.767) (end 0 40.513)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 43.307) (end 0 43.053)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 45.847) (end 0 45.593)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 48.387) (end 0 48.133)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 50.927) (end 0 50.673)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 53.467) (end 0 53.213)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 56.007) (end 0 55.753)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 58.547) (end 0 58.293)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 61.087) (end 0 60.833)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 62.23) (end 1.27 -64.77)
(stroke (width 0.254) (type default))
(fill (type background))
)
(pin passive line (at -5.08 60.96 0) (length 3.81)
(name "Pin_1" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 38.1 0) (length 3.81)
(name "Pin_10" (effects (font (size 1.27 1.27))))
(number "10" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 35.56 0) (length 3.81)
(name "Pin_11" (effects (font (size 1.27 1.27))))
(number "11" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 33.02 0) (length 3.81)
(name "Pin_12" (effects (font (size 1.27 1.27))))
(number "12" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 30.48 0) (length 3.81)
(name "Pin_13" (effects (font (size 1.27 1.27))))
(number "13" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 27.94 0) (length 3.81)
(name "Pin_14" (effects (font (size 1.27 1.27))))
(number "14" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 25.4 0) (length 3.81)
(name "Pin_15" (effects (font (size 1.27 1.27))))
(number "15" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 22.86 0) (length 3.81)
(name "Pin_16" (effects (font (size 1.27 1.27))))
(number "16" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 20.32 0) (length 3.81)
(name "Pin_17" (effects (font (size 1.27 1.27))))
(number "17" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 17.78 0) (length 3.81)
(name "Pin_18" (effects (font (size 1.27 1.27))))
(number "18" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 15.24 0) (length 3.81)
(name "Pin_19" (effects (font (size 1.27 1.27))))
(number "19" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 58.42 0) (length 3.81)
(name "Pin_2" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 12.7 0) (length 3.81)
(name "Pin_20" (effects (font (size 1.27 1.27))))
(number "20" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 10.16 0) (length 3.81)
(name "Pin_21" (effects (font (size 1.27 1.27))))
(number "21" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 7.62 0) (length 3.81)
(name "Pin_22" (effects (font (size 1.27 1.27))))
(number "22" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 5.08 0) (length 3.81)
(name "Pin_23" (effects (font (size 1.27 1.27))))
(number "23" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 2.54 0) (length 3.81)
(name "Pin_24" (effects (font (size 1.27 1.27))))
(number "24" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 0 0) (length 3.81)
(name "Pin_25" (effects (font (size 1.27 1.27))))
(number "25" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -2.54 0) (length 3.81)
(name "Pin_26" (effects (font (size 1.27 1.27))))
(number "26" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -5.08 0) (length 3.81)
(name "Pin_27" (effects (font (size 1.27 1.27))))
(number "27" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -7.62 0) (length 3.81)
(name "Pin_28" (effects (font (size 1.27 1.27))))
(number "28" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -10.16 0) (length 3.81)
(name "Pin_29" (effects (font (size 1.27 1.27))))
(number "29" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 55.88 0) (length 3.81)
(name "Pin_3" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -12.7 0) (length 3.81)
(name "Pin_30" (effects (font (size 1.27 1.27))))
(number "30" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -15.24 0) (length 3.81)
(name "Pin_31" (effects (font (size 1.27 1.27))))
(number "31" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -17.78 0) (length 3.81)
(name "Pin_32" (effects (font (size 1.27 1.27))))
(number "32" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -20.32 0) (length 3.81)
(name "Pin_33" (effects (font (size 1.27 1.27))))
(number "33" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -22.86 0) (length 3.81)
(name "Pin_34" (effects (font (size 1.27 1.27))))
(number "34" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -25.4 0) (length 3.81)
(name "Pin_35" (effects (font (size 1.27 1.27))))
(number "35" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -27.94 0) (length 3.81)
(name "Pin_36" (effects (font (size 1.27 1.27))))
(number "36" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -30.48 0) (length 3.81)
(name "Pin_37" (effects (font (size 1.27 1.27))))
(number "37" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -33.02 0) (length 3.81)
(name "Pin_38" (effects (font (size 1.27 1.27))))
(number "38" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -35.56 0) (length 3.81)
(name "Pin_39" (effects (font (size 1.27 1.27))))
(number "39" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 53.34 0) (length 3.81)
(name "Pin_4" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -38.1 0) (length 3.81)
(name "Pin_40" (effects (font (size 1.27 1.27))))
(number "40" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -40.64 0) (length 3.81)
(name "Pin_41" (effects (font (size 1.27 1.27))))
(number "41" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -43.18 0) (length 3.81)
(name "Pin_41" (effects (font (size 1.27 1.27))))
(number "42" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -45.72 0) (length 3.81)
(name "Pin_43" (effects (font (size 1.27 1.27))))
(number "43" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -48.26 0) (length 3.81)
(name "Pin_44" (effects (font (size 1.27 1.27))))
(number "44" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -50.8 0) (length 3.81)
(name "Pin_45" (effects (font (size 1.27 1.27))))
(number "45" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -53.34 0) (length 3.81)
(name "Pin_46" (effects (font (size 1.27 1.27))))
(number "46" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -55.88 0) (length 3.81)
(name "Pin_47" (effects (font (size 1.27 1.27))))
(number "47" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -58.42 0) (length 3.81)
(name "Pin_48" (effects (font (size 1.27 1.27))))
(number "48" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -60.96 0) (length 3.81)
(name "Pin_49" (effects (font (size 1.27 1.27))))
(number "49" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 50.8 0) (length 3.81)
(name "Pin_5" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -63.5 0) (length 3.81)
(name "Pin_50" (effects (font (size 1.27 1.27))))
(number "50" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 48.26 0) (length 3.81)
(name "Pin_6" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 45.72 0) (length 3.81)
(name "Pin_7" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 43.18 0) (length 3.81)
(name "Pin_8" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 40.64 0) (length 3.81)
(name "Pin_9" (effects (font (size 1.27 1.27))))
(number "9" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 -68.58 90) (length 3.81)
(name "MP" (effects (font (size 1.27 1.27))))
(number "MP" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "LIS3DHTR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U5" (at 0 19.05 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "LIS3DHTR" (at 0 16.51 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "XDCR_LIS3DHTR" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Datasheet" "https://www.st.com/content/ccc/resource/technical/document/datasheet/3c/ae/50/85/d6/b1/46/fe/CD00274221.pdf/files/CD00274221.pdf/jcr:content/translations/en.CD00274221.pdf" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "MAXIMUM_PACKAGE_HEIGHT" "1mm" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "STANDARD" "Manufacturer Recommendations" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MANUFACTURER" "STMicroelectronics" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "PARTREV" "2" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(symbol "LIS3DHTR_0_0"
(rectangle (start -11.43 13.97) (end 11.43 -13.97)
(stroke (width 0.254) (type default))
(fill (type background))
)
(pin power_in line (at 16.51 8.89 180) (length 5.08)
(name "VDD_IO" (effects (font (size 1.016 1.016))))
(number "1" (effects (font (size 1.016 1.016))))
)
(pin passive line (at 16.51 -6.35 180) (length 5.08)
(name "RES" (effects (font (size 1.016 1.016))))
(number "10" (effects (font (size 1.016 1.016))))
)
(pin output line (at 16.51 2.54 180) (length 5.08)
(name "INT1" (effects (font (size 1.016 1.016))))
(number "11" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 16.51 -11.43 180) (length 5.08)
(name "GND" (effects (font (size 1.016 1.016))))
(number "12" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 6.35 0) (length 5.08)
(name "ADC3" (effects (font (size 1.016 1.016))))
(number "13" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 16.51 11.43 180) (length 5.08)
(name "VDD" (effects (font (size 1.016 1.016))))
(number "14" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 8.89 0) (length 5.08)
(name "ADC2" (effects (font (size 1.016 1.016))))
(number "15" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 11.43 0) (length 5.08)
(name "ADC1" (effects (font (size 1.016 1.016))))
(number "16" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 2.54 0) (length 5.08)
(name "NC" (effects (font (size 1.016 1.016))))
(number "2" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 0 0) (length 5.08)
(name "NC" (effects (font (size 1.016 1.016))))
(number "3" (effects (font (size 1.016 1.016))))
)
(pin input clock (at -16.51 -6.35 0) (length 5.08)
(name "SCL/SPC" (effects (font (size 1.016 1.016))))
(number "4" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 16.51 -8.89 180) (length 5.08)
(name "GND" (effects (font (size 1.016 1.016))))
(number "5" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -16.51 -8.89 0) (length 5.08)
(name "SDA/SDI/SDO" (effects (font (size 1.016 1.016))))
(number "6" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -16.51 -11.43 0) (length 5.08)
(name "SDO/SA0" (effects (font (size 1.016 1.016))))
(number "7" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 -3.81 0) (length 5.08)
(name "CS" (effects (font (size 1.016 1.016))))
(number "8" (effects (font (size 1.016 1.016))))
)
(pin output line (at 16.51 0 180) (length 5.08)
(name "INT2" (effects (font (size 1.016 1.016))))
(number "9" (effects (font (size 1.016 1.016))))
)
)
)
(symbol "TSSP77038" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U6" (at -1.27 11.43 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "TSSP77038" (at -1.27 8.89 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "omoteLib:Heimdall vertical" (at -1.27 -11.43 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "https://www.vishay.com/docs/82470/tssp770.pdf" (at 16.51 7.62 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "opto IR receiver" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "IR Receiver Modules for Remote Control Systems" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "Vishay*MOLD*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "TSSP77038_0_0"
(polyline
(pts
(xy 1.905 -5.08)
(xy 0.127 -5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.905 5.08)
(xy 0.127 5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(text "DEMOD" (at -3.175 0.254 900)
(effects (font (size 1.524 1.524)))
)
)
(symbol "TSSP77038_0_1"
(rectangle (start -10.16 6.35) (end 7.62 -8.89)
(stroke (width 0.254) (type default))
(fill (type background))
)
(rectangle (start -6.096 5.588) (end 0.127 -5.588)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.763 0.381)
(xy -9.652 1.27)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.763 0.381)
(xy -9.271 0.381)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.763 0.381)
(xy -8.763 0.889)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.636 -0.635)
(xy -9.525 0.254)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.636 -0.635)
(xy -9.144 -0.635)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.636 -0.635)
(xy -8.636 -0.127)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.382 -1.016)
(xy -6.731 -1.016)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -2.921)
(xy 0.127 -2.921)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -1.905)
(xy 1.27 -3.81)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.397 -3.556)
(xy 1.524 -3.556)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.651 -3.556)
(xy 1.524 -3.556)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.651 -3.556)
(xy 1.651 -3.302)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.905 0)
(xy 1.905 1.27)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.905 4.445)
(xy 1.905 5.08)
(xy 2.54 5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.382 0.635)
(xy -6.731 0.635)
(xy -7.62 -1.016)
(xy -8.382 0.635)
)
(stroke (width 0) (type default))
(fill (type outline))
)
(polyline
(pts
(xy -6.096 1.397)
(xy -7.62 1.397)
(xy -7.62 -1.778)
(xy -6.096 -1.778)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -3.175)
(xy 1.905 -3.81)
(xy 1.905 -5.08)
(xy 2.54 -5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -2.54)
(xy 1.905 -1.905)
(xy 1.905 0)
(xy 2.54 0)
)
(stroke (width 0) (type default))
(fill (type none))
)
(rectangle (start 2.54 1.27) (end 1.27 4.445)
(stroke (width 0) (type default))
(fill (type none))
)
)
(symbol "TSSP77038_1_1"
(pin power_in line (at 10.16 -5.08 180) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin output line (at 10.16 0 180) (length 2.54)
(name "OUT" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 10.16 5.08 180) (length 2.54)
(name "Vs" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 10.16 -7.62 180) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "USBLC6-2P6" (in_bom yes) (on_board yes)
(property "Reference" "U4" (at -7.62 8.89 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "USBLC6-2P6" (at 2.54 -3.81 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Package_TO_SOT_SMD:SOT-666" (at -1.27 17.78 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "https://www.st.com/resource/en/datasheet/usblc6-2.pdf" (at 8.89 -6.35 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "usb ethernet video" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Very low capacitance ESD protection diode, 2 data-line, SOT-666" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "SOT?666*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "USBLC6-2P6_0_1"
(rectangle (start -7.62 7.62) (end 7.62 -2.54)
(stroke (width 0.254) (type default))
(fill (type background))
)
)
(symbol "USBLC6-2P6_1_1"
(pin passive line (at -10.16 3.81 0) (length 2.54)
(name "I/O1" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 -5.08 90) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -10.16 1.27 0) (length 2.54)
(name "I/O2" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 10.16 1.27 180) (length 2.54)
(name "I/O2" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 10.16 270) (length 2.54)
(name "VBUS" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 10.16 3.81 180) (length 2.54)
(name "I/O1" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
)
)
)

View File

@ -0,0 +1,815 @@
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "Conn_01x50" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 63.5 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "Conn_01x50" (at 0 -66.04 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "omoteLib:TFT_2.83IN_240X320_50PIN" (at 1.27 -68.58 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "~" (at 0 12.7 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "connector" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Generic connector, single row, 01x50" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "Conn_01x50_1_1"
(rectangle (start -1.27 -63.373) (end 0 -63.627)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -60.833) (end 0 -61.087)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -58.293) (end 0 -58.547)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -55.753) (end 0 -56.007)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -53.213) (end 0 -53.467)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -50.673) (end 0 -50.927)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -48.133) (end 0 -48.387)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -45.593) (end 0 -45.847)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -43.053) (end 0 -43.307)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -40.513) (end 0 -40.767)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -37.973) (end 0 -38.227)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -35.433) (end 0 -35.687)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -32.893) (end 0 -33.147)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -30.353) (end 0 -30.607)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -27.813) (end 0 -28.067)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -25.273) (end 0 -25.527)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -22.733) (end 0 -22.987)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -20.193) (end 0 -20.447)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -17.653) (end 0 -17.907)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -15.113) (end 0 -15.367)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -12.573) (end 0 -12.827)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -10.033) (end 0 -10.287)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -7.493) (end 0 -7.747)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -4.953) (end 0 -5.207)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 -2.413) (end 0 -2.667)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 0.127) (end 0 -0.127)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 2.667) (end 0 2.413)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 5.207) (end 0 4.953)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 7.747) (end 0 7.493)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 10.287) (end 0 10.033)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 12.827) (end 0 12.573)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 15.367) (end 0 15.113)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 17.907) (end 0 17.653)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 20.447) (end 0 20.193)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 22.987) (end 0 22.733)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 25.527) (end 0 25.273)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 28.067) (end 0 27.813)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 30.607) (end 0 30.353)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 33.147) (end 0 32.893)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 35.687) (end 0 35.433)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 38.227) (end 0 37.973)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 40.767) (end 0 40.513)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 43.307) (end 0 43.053)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 45.847) (end 0 45.593)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 48.387) (end 0 48.133)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 50.927) (end 0 50.673)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 53.467) (end 0 53.213)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 56.007) (end 0 55.753)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 58.547) (end 0 58.293)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 61.087) (end 0 60.833)
(stroke (width 0.1524) (type default))
(fill (type none))
)
(rectangle (start -1.27 62.23) (end 1.27 -64.77)
(stroke (width 0.254) (type default))
(fill (type background))
)
(pin passive line (at -5.08 60.96 0) (length 3.81)
(name "Pin_1" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 38.1 0) (length 3.81)
(name "Pin_10" (effects (font (size 1.27 1.27))))
(number "10" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 35.56 0) (length 3.81)
(name "Pin_11" (effects (font (size 1.27 1.27))))
(number "11" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 33.02 0) (length 3.81)
(name "Pin_12" (effects (font (size 1.27 1.27))))
(number "12" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 30.48 0) (length 3.81)
(name "Pin_13" (effects (font (size 1.27 1.27))))
(number "13" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 27.94 0) (length 3.81)
(name "Pin_14" (effects (font (size 1.27 1.27))))
(number "14" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 25.4 0) (length 3.81)
(name "Pin_15" (effects (font (size 1.27 1.27))))
(number "15" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 22.86 0) (length 3.81)
(name "Pin_16" (effects (font (size 1.27 1.27))))
(number "16" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 20.32 0) (length 3.81)
(name "Pin_17" (effects (font (size 1.27 1.27))))
(number "17" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 17.78 0) (length 3.81)
(name "Pin_18" (effects (font (size 1.27 1.27))))
(number "18" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 15.24 0) (length 3.81)
(name "Pin_19" (effects (font (size 1.27 1.27))))
(number "19" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 58.42 0) (length 3.81)
(name "Pin_2" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 12.7 0) (length 3.81)
(name "Pin_20" (effects (font (size 1.27 1.27))))
(number "20" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 10.16 0) (length 3.81)
(name "Pin_21" (effects (font (size 1.27 1.27))))
(number "21" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 7.62 0) (length 3.81)
(name "Pin_22" (effects (font (size 1.27 1.27))))
(number "22" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 5.08 0) (length 3.81)
(name "Pin_23" (effects (font (size 1.27 1.27))))
(number "23" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 2.54 0) (length 3.81)
(name "Pin_24" (effects (font (size 1.27 1.27))))
(number "24" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 0 0) (length 3.81)
(name "Pin_25" (effects (font (size 1.27 1.27))))
(number "25" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -2.54 0) (length 3.81)
(name "Pin_26" (effects (font (size 1.27 1.27))))
(number "26" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -5.08 0) (length 3.81)
(name "Pin_27" (effects (font (size 1.27 1.27))))
(number "27" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -7.62 0) (length 3.81)
(name "Pin_28" (effects (font (size 1.27 1.27))))
(number "28" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -10.16 0) (length 3.81)
(name "Pin_29" (effects (font (size 1.27 1.27))))
(number "29" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 55.88 0) (length 3.81)
(name "Pin_3" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -12.7 0) (length 3.81)
(name "Pin_30" (effects (font (size 1.27 1.27))))
(number "30" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -15.24 0) (length 3.81)
(name "Pin_31" (effects (font (size 1.27 1.27))))
(number "31" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -17.78 0) (length 3.81)
(name "Pin_32" (effects (font (size 1.27 1.27))))
(number "32" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -20.32 0) (length 3.81)
(name "Pin_33" (effects (font (size 1.27 1.27))))
(number "33" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -22.86 0) (length 3.81)
(name "Pin_34" (effects (font (size 1.27 1.27))))
(number "34" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -25.4 0) (length 3.81)
(name "Pin_35" (effects (font (size 1.27 1.27))))
(number "35" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -27.94 0) (length 3.81)
(name "Pin_36" (effects (font (size 1.27 1.27))))
(number "36" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -30.48 0) (length 3.81)
(name "Pin_37" (effects (font (size 1.27 1.27))))
(number "37" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -33.02 0) (length 3.81)
(name "Pin_38" (effects (font (size 1.27 1.27))))
(number "38" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -35.56 0) (length 3.81)
(name "Pin_39" (effects (font (size 1.27 1.27))))
(number "39" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 53.34 0) (length 3.81)
(name "Pin_4" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -38.1 0) (length 3.81)
(name "Pin_40" (effects (font (size 1.27 1.27))))
(number "40" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -40.64 0) (length 3.81)
(name "Pin_41" (effects (font (size 1.27 1.27))))
(number "41" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -43.18 0) (length 3.81)
(name "Pin_41" (effects (font (size 1.27 1.27))))
(number "42" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -45.72 0) (length 3.81)
(name "Pin_43" (effects (font (size 1.27 1.27))))
(number "43" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -48.26 0) (length 3.81)
(name "Pin_44" (effects (font (size 1.27 1.27))))
(number "44" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -50.8 0) (length 3.81)
(name "Pin_45" (effects (font (size 1.27 1.27))))
(number "45" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -53.34 0) (length 3.81)
(name "Pin_46" (effects (font (size 1.27 1.27))))
(number "46" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -55.88 0) (length 3.81)
(name "Pin_47" (effects (font (size 1.27 1.27))))
(number "47" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -58.42 0) (length 3.81)
(name "Pin_48" (effects (font (size 1.27 1.27))))
(number "48" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -60.96 0) (length 3.81)
(name "Pin_49" (effects (font (size 1.27 1.27))))
(number "49" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 50.8 0) (length 3.81)
(name "Pin_5" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 -63.5 0) (length 3.81)
(name "Pin_50" (effects (font (size 1.27 1.27))))
(number "50" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 48.26 0) (length 3.81)
(name "Pin_6" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 45.72 0) (length 3.81)
(name "Pin_7" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 43.18 0) (length 3.81)
(name "Pin_8" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -5.08 40.64 0) (length 3.81)
(name "Pin_9" (effects (font (size 1.27 1.27))))
(number "9" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 -68.58 90) (length 3.81)
(name "MP" (effects (font (size 1.27 1.27))))
(number "MP" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "LIS3DHTR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U5" (at 0 19.05 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "LIS3DHTR" (at 0 16.51 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "omoteLib:XDCR_LIS3DHTR" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Datasheet" "https://www.st.com/content/ccc/resource/technical/document/datasheet/3c/ae/50/85/d6/b1/46/fe/CD00274221.pdf/files/CD00274221.pdf/jcr:content/translations/en.CD00274221.pdf" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "MAXIMUM_PACKAGE_HEIGHT" "1mm" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "STANDARD" "Manufacturer Recommendations" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MANUFACTURER" "STMicroelectronics" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "PARTREV" "2" (at 0 -3.81 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(symbol "LIS3DHTR_0_0"
(rectangle (start -11.43 13.97) (end 11.43 -13.97)
(stroke (width 0.254) (type default))
(fill (type background))
)
(pin power_in line (at 16.51 8.89 180) (length 5.08)
(name "VDD_IO" (effects (font (size 1.016 1.016))))
(number "1" (effects (font (size 1.016 1.016))))
)
(pin passive line (at 16.51 -6.35 180) (length 5.08)
(name "RES" (effects (font (size 1.016 1.016))))
(number "10" (effects (font (size 1.016 1.016))))
)
(pin output line (at 16.51 2.54 180) (length 5.08)
(name "INT1" (effects (font (size 1.016 1.016))))
(number "11" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 16.51 -11.43 180) (length 5.08)
(name "GND" (effects (font (size 1.016 1.016))))
(number "12" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 6.35 0) (length 5.08)
(name "ADC3" (effects (font (size 1.016 1.016))))
(number "13" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 16.51 11.43 180) (length 5.08)
(name "VDD" (effects (font (size 1.016 1.016))))
(number "14" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 8.89 0) (length 5.08)
(name "ADC2" (effects (font (size 1.016 1.016))))
(number "15" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 11.43 0) (length 5.08)
(name "ADC1" (effects (font (size 1.016 1.016))))
(number "16" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 2.54 0) (length 5.08)
(name "NC" (effects (font (size 1.016 1.016))))
(number "2" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 0 0) (length 5.08)
(name "NC" (effects (font (size 1.016 1.016))))
(number "3" (effects (font (size 1.016 1.016))))
)
(pin input clock (at -16.51 -6.35 0) (length 5.08)
(name "SCL/SPC" (effects (font (size 1.016 1.016))))
(number "4" (effects (font (size 1.016 1.016))))
)
(pin power_in line (at 16.51 -8.89 180) (length 5.08)
(name "GND" (effects (font (size 1.016 1.016))))
(number "5" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -16.51 -8.89 0) (length 5.08)
(name "SDA/SDI/SDO" (effects (font (size 1.016 1.016))))
(number "6" (effects (font (size 1.016 1.016))))
)
(pin bidirectional line (at -16.51 -11.43 0) (length 5.08)
(name "SDO/SA0" (effects (font (size 1.016 1.016))))
(number "7" (effects (font (size 1.016 1.016))))
)
(pin input line (at -16.51 -3.81 0) (length 5.08)
(name "CS" (effects (font (size 1.016 1.016))))
(number "8" (effects (font (size 1.016 1.016))))
)
(pin output line (at 16.51 0 180) (length 5.08)
(name "INT2" (effects (font (size 1.016 1.016))))
(number "9" (effects (font (size 1.016 1.016))))
)
)
)
(symbol "TSSP77038" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U6" (at -1.27 11.43 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "TSSP77038" (at -1.27 8.89 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "omoteLib:Heimdall vertical" (at -1.27 -11.43 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "https://www.vishay.com/docs/82470/tssp770.pdf" (at 16.51 7.62 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "opto IR receiver" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "IR Receiver Modules for Remote Control Systems" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "Vishay*MOLD*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "TSSP77038_0_0"
(polyline
(pts
(xy 1.905 -5.08)
(xy 0.127 -5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.905 5.08)
(xy 0.127 5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(text "DEMOD" (at -3.175 0.254 900)
(effects (font (size 1.524 1.524)))
)
)
(symbol "TSSP77038_0_1"
(rectangle (start -10.16 6.35) (end 7.62 -8.89)
(stroke (width 0.254) (type default))
(fill (type background))
)
(rectangle (start -6.096 5.588) (end 0.127 -5.588)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.763 0.381)
(xy -9.652 1.27)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.763 0.381)
(xy -9.271 0.381)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.763 0.381)
(xy -8.763 0.889)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.636 -0.635)
(xy -9.525 0.254)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.636 -0.635)
(xy -9.144 -0.635)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.636 -0.635)
(xy -8.636 -0.127)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.382 -1.016)
(xy -6.731 -1.016)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -2.921)
(xy 0.127 -2.921)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -1.905)
(xy 1.27 -3.81)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.397 -3.556)
(xy 1.524 -3.556)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.651 -3.556)
(xy 1.524 -3.556)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.651 -3.556)
(xy 1.651 -3.302)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.905 0)
(xy 1.905 1.27)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.905 4.445)
(xy 1.905 5.08)
(xy 2.54 5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy -8.382 0.635)
(xy -6.731 0.635)
(xy -7.62 -1.016)
(xy -8.382 0.635)
)
(stroke (width 0) (type default))
(fill (type outline))
)
(polyline
(pts
(xy -6.096 1.397)
(xy -7.62 1.397)
(xy -7.62 -1.778)
(xy -6.096 -1.778)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -3.175)
(xy 1.905 -3.81)
(xy 1.905 -5.08)
(xy 2.54 -5.08)
)
(stroke (width 0) (type default))
(fill (type none))
)
(polyline
(pts
(xy 1.27 -2.54)
(xy 1.905 -1.905)
(xy 1.905 0)
(xy 2.54 0)
)
(stroke (width 0) (type default))
(fill (type none))
)
(rectangle (start 2.54 1.27) (end 1.27 4.445)
(stroke (width 0) (type default))
(fill (type none))
)
)
(symbol "TSSP77038_1_1"
(pin power_in line (at 10.16 -5.08 180) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin output line (at 10.16 0 180) (length 2.54)
(name "OUT" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 10.16 5.08 180) (length 2.54)
(name "Vs" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 10.16 -7.62 180) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "USBLC6-2P6" (in_bom yes) (on_board yes)
(property "Reference" "U4" (at -7.62 8.89 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Value" "USBLC6-2P6" (at 2.54 -3.81 0)
(effects (font (size 1.27 1.27)) (justify left))
)
(property "Footprint" "Package_TO_SOT_SMD:SOT-666" (at -1.27 17.78 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "https://www.st.com/resource/en/datasheet/usblc6-2.pdf" (at 8.89 -6.35 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_keywords" "usb ethernet video" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_description" "Very low capacitance ESD protection diode, 2 data-line, SOT-666" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "SOT?666*" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "USBLC6-2P6_0_1"
(rectangle (start -7.62 7.62) (end 7.62 -2.54)
(stroke (width 0.254) (type default))
(fill (type background))
)
)
(symbol "USBLC6-2P6_1_1"
(pin passive line (at -10.16 3.81 0) (length 2.54)
(name "I/O1" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 -5.08 90) (length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -10.16 1.27 0) (length 2.54)
(name "I/O2" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 10.16 1.27 180) (length 2.54)
(name "I/O2" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 0 10.16 270) (length 2.54)
(name "VBUS" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 10.16 3.81 180) (length 2.54)
(name "I/O1" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
)
)
)

View File

@ -1,8 +1,86 @@
{ {
"cmake.configureOnOpen": false, "cmake.configureOnOpen": false,
"files.associations": { "files.associations": {
"*.json": "jsonc",
"random": "cpp", "random": "cpp",
"array": "cpp" "array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"map": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"set": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
"bit": "cpp",
"compare": "cpp",
"concepts": "cpp",
"numbers": "cpp",
"any": "cpp",
"hash_map": "cpp",
"strstream": "cpp",
"bitset": "cpp",
"charconv": "cpp",
"chrono": "cpp",
"complex": "cpp",
"condition_variable": "cpp",
"forward_list": "cpp",
"list": "cpp",
"ratio": "cpp",
"format": "cpp",
"future": "cpp",
"mutex": "cpp",
"semaphore": "cpp",
"shared_mutex": "cpp",
"span": "cpp",
"stop_token": "cpp",
"thread": "cpp",
"cfenv": "cpp",
"typeindex": "cpp",
"valarray": "cpp",
"variant": "cpp"
}, },
"cmake.sourceDirectory": "${workspaceFolder}/.pio/libdeps/esp32/Adafruit BusIO" "cmake.sourceDirectory": "${workspaceFolder}/.pio/libdeps/esp32/Adafruit BusIO",
"editor.formatOnSave": true,
"idf.portWin": "COM8"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,40 @@
@startuml
' KEY
' --> : is a
' *-- : must have
' o-- : should have
namespace HAL{
interface BatteryInterface
interface WifiInterface
interface OtherHWInterface
abstract HardwareAbstract
HardwareAbstract o-- BatteryInterface
HardwareAbstract o-- WifiInterface
HardwareAbstract o-- OtherHWInterface
}
namespace Simulator{
class BatterySimulator
class WifiSimulator
BatterySimulator --> HAL.BatteryInterface
WifiSimulator --> HAL.WifiInterface
}
namespace ESP32{
class Battery
class WifiHandler
Battery --> HAL.BatteryInterface
WifiHandler --> HAL.WifiInterface
}
namespace UI {
class OmoteUI
OmoteUI *-- HAL.HardwareAbstract
}
@enduml

View File

@ -0,0 +1,5 @@
#include "HardwareAbstract.hpp"
HardwareAbstract::HardwareAbstract(){
}

View File

@ -0,0 +1,40 @@
// OMOTE Hardware Abstraction
// 2023 Matthew Colvin
#pragma once
#include "BatteryInterface.h"
#include "DisplayAbstract.h"
#include "KeyPressAbstract.hpp"
#include "wifiHandlerInterface.h"
#include "Notification.hpp"
#include <memory>
class HardwareAbstract {
public:
HardwareAbstract();
/// @brief Override in order to do setup of hardware devices post construction
virtual void init() = 0;
/// @brief Override to processing in main thread
virtual void loopHandler() = 0;
/// @brief Override to allow printing of a message for debugging
/// @param message - Debug message
virtual void debugPrint(const char *fmt, ...) = 0;
virtual std::shared_ptr<BatteryInterface> battery() = 0;
virtual std::shared_ptr<DisplayAbstract> display() = 0;
virtual std::shared_ptr<wifiHandlerInterface> wifi() = 0;
virtual std::shared_ptr<KeyPressAbstract> keys() = 0;
virtual char getCurrentDevice() = 0;
virtual void setCurrentDevice(char currentDevice) = 0;
virtual bool getWakeupByIMUEnabled() = 0;
virtual void setWakeupByIMUEnabled(bool wakeupByIMUEnabled) = 0;
virtual uint16_t getSleepTimeout() = 0;
virtual void setSleepTimeout(uint16_t sleepTimeout) = 0;
};

View File

@ -0,0 +1,20 @@
#include "HardwareFactory.hpp"
#if OMOTE_SIM
#include "HardwareSimulator.hpp"
#endif
#if OMOTE_ESP32
#include "HardwareRevX.hpp"
#endif
#if OMOTE_SIM
std::unique_ptr<HardwareAbstract> HardwareFactory::mHardware =
std::make_unique<HardwareSimulator>();
#endif
#if OMOTE_ESP32
std::unique_ptr<HardwareAbstract> HardwareFactory::mHardware =
std::make_unique<HardwareRevX>();
#endif
HardwareAbstract &HardwareFactory::getAbstract() { return *mHardware; }

View File

@ -0,0 +1,11 @@
#include "HardwareAbstract.hpp"
#include <memory>
/**
* @brief The HardwareFactory is responsible for making the
*/
class HardwareFactory {
public:
static HardwareAbstract &getAbstract();
static std::unique_ptr<HardwareAbstract> mHardware;
};

View File

@ -0,0 +1,9 @@
#pragma once
#include "Notification.hpp"
class BatteryInterface {
public:
BatteryInterface() = default;
virtual int getPercentage() = 0;
virtual bool isCharging() = 0;
};

View File

@ -0,0 +1,35 @@
#include "DisplayAbstract.h"
std::shared_ptr<DisplayAbstract> DisplayAbstract::mInstance = nullptr;
DisplayAbstract::DisplayAbstract(){
lv_init();
lv_disp_draw_buf_init(&mdraw_buf, mbufA, mbufB,
SCREEN_WIDTH * SCREEN_HEIGHT / 10);
// Initialize the display driver
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = SCREEN_WIDTH;
disp_drv.ver_res = SCREEN_HEIGHT;
disp_drv.flush_cb = &DisplayAbstract::flushDisplayImpl;
disp_drv.draw_buf = &mdraw_buf;
lv_disp_drv_register(&disp_drv);
// Initialize the touchscreen driver
static lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = &DisplayAbstract::screenInputImpl;
lv_indev_drv_register(&indev_drv);
}
void DisplayAbstract::flushDisplayImpl(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
mInstance->flushDisplay(disp, area, color_p);
}
void DisplayAbstract::screenInputImpl(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) {
mInstance->screenInput(indev_driver, data);
}

View File

@ -0,0 +1,28 @@
#pragma once
#include <memory>
#include "lvgl.h"
class DisplayAbstract
{
public:
DisplayAbstract();
virtual void setBrightness(uint8_t brightness) = 0;
virtual uint8_t getBrightness() = 0;
virtual void turnOff() = 0;
protected:
// Set this with a getInstance method in the Child Class
static std::shared_ptr<DisplayAbstract> mInstance;
virtual void flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) = 0;
virtual void screenInput(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) = 0;
private:
// Used to satisfy LVGL APIs
static void flushDisplayImpl(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
static void screenInputImpl(lv_indev_drv_t *indev_driver, lv_indev_data_t *data);
// LVGL Screen Buffers
lv_disp_draw_buf_t mdraw_buf;
lv_color_t mbufA[SCREEN_WIDTH * SCREEN_HEIGHT / 10];
lv_color_t mbufB[SCREEN_WIDTH * SCREEN_HEIGHT / 10];
};

View File

@ -0,0 +1,8 @@
#include "KeyPressAbstract.hpp"
KeyPressAbstract::KeyPressAbstract() {}
void KeyPressAbstract::RegisterKeyPressHandler(
std::function<bool(KeyPressAbstract::KeyEvent)> aKeyEventHandler) {
mKeyEventHandler = std::move(aKeyEventHandler);
}

View File

@ -0,0 +1,73 @@
#pragma once
#include "Notification.hpp"
#include <memory>
class KeyPressAbstract {
public:
// Keys from Top Down left to right.
enum class KeyId {
Power,
// Top 4 Buttons left to right
Stop,
Rewind,
Play,
FastForward,
// Buttons around D Pad
Menu,
Info,
Back,
Source,
// D Pad
Up,
Down,
Left,
Right,
Center,
// Volume Channel and 2 between
VolUp,
VolDown,
Mute,
Record,
ChannelUp,
ChannelDown,
// Bottom 4 buttons left to right
Aux1,
Aux2,
Aux3,
Aux4,
INVALID
};
class KeyEvent {
public:
enum class Type { Press, Release, INVALID };
KeyEvent() = default;
KeyEvent(const KeyId aId, const Type aType) : mId(aId), mType(aType) {}
KeyId mId = KeyId::INVALID;
Type mType = Type::INVALID;
};
KeyPressAbstract();
/// @brief Register a SINGLE handler to be used for proccessing keys
/// @param aKeyEventHandler - Callable the Handles KeyEvent
void RegisterKeyPressHandler(std::function<bool(KeyEvent)> aKeyEventHandler);
protected:
/// @brief Function ment to be called regularly to allow
/// proccesssing of key presses by calling mKeyEventHandler
/// best case this is done on a seprate thread/task
/// since it could take a while to handle a KeyPress
virtual void HandleKeyPresses() = 0;
/// @brief Function to queue up Key events to be handled later on by
/// HandleKeyPresses() hopefully on a seprate thread or task
/// This function should be implemented in a way that makes it ISR
/// safe
/// @param aJustOccuredKeyEvent - A Key even that just occured
virtual void QueueKeyEvent(KeyEvent aJustOccuredKeyEvent) = 0;
std::function<bool(KeyEvent)> mKeyEventHandler;
};

View File

@ -0,0 +1,17 @@
#pragma once
class UIInterface
{
public:
virtual void setup() = 0;
virtual void setup_ui() = 0;
virtual void wifi_scan_complete(unsigned int size) = 0;
virtual void clear_wifi_networks() = 0;
virtual void update_wifi(bool connected) = 0;
virtual void hide_keyboard() = 0;
virtual void show_keyboard() = 0;
virtual void update() = 0;
virtual void reset_settings_menu() = 0;
virtual void update_battery(int percentage, bool isCharging, bool isConnected) = 0;
virtual void turnOff() = 0;
};

View File

@ -0,0 +1,54 @@
#pragma once
#include <functional>
#include <memory>
#include <string>
class wifiHandlerInterface {
public:
wifiHandlerInterface() = default;
struct WifiInfo {
WifiInfo() = default;
WifiInfo(std::string aSsid, int aRssi) : ssid(aSsid), rssi(aRssi) {}
std::string ssid = "";
int rssi = 0;
};
struct wifiStatus {
wifiStatus() = default;
wifiStatus(bool aConnected, std::string aIp, std::string aSsid)
: isConnected(aConnected), IP(aIp), ssid(aSsid){};
bool isConnected = false;
std::string IP = "";
std::string ssid = "";
};
typedef std::vector<WifiInfo> ScanDoneDataTy;
typedef Notification<ScanDoneDataTy> ScanNotificationTy;
/// @brief Initialize the wifi handler
virtual void begin() = 0;
/// @brief Trigger a scan scan for wifi networks
virtual void scan() = 0;
/// @brief Attempt a connection to the wifi using the provided credentials
virtual void connect(std::string ssid, std::string password) = 0;
/// @brief Get the status of the current wifi connection
virtual wifiStatus GetStatus() = 0;
// Register for Scan Notification to handle when scans are completed
std::shared_ptr<ScanNotificationTy> ScanCompleteNotification() {
return mScanNotification;
};
// Register for Status notifications to handle changes in status
std::shared_ptr<Notification<wifiStatus>> WifiStatusNotification() {
return mStatusUpdate;
};
protected:
std::shared_ptr<ScanNotificationTy> mScanNotification =
std::make_shared<ScanNotificationTy>();
std::shared_ptr<Notification<wifiStatus>> mStatusUpdate =
std::make_shared<Notification<wifiStatus>>();
};

View File

@ -0,0 +1,9 @@
#pragma once
#include "SPSCQueueInterface.hpp"
template <typename T>
class MPMCQueueInterface: public SPSCQueueInterface<T>
{
public:
bool push(T obj, bool overwrite = false);
};

View File

@ -0,0 +1,90 @@
#pragma once
#include <functional>
#include <map>
#include <memory>
template <class... notifyData> class Handler;
template <class... notifyData> class Notification {
friend class Handler<notifyData...>;
public:
typedef std::function<void(notifyData...)> HandlerTy;
typedef int HandlerID;
Notification() { mIdMaker = 0; };
void notify(notifyData... notifySendData);
protected:
HandlerID onNotify(HandlerTy aHandler);
void unregister(HandlerID aHandler);
private:
std::map<HandlerID, HandlerTy> mFunctionHandlers;
HandlerID mIdMaker;
};
template <class... handlerData>
int Notification<handlerData...>::onNotify(HandlerTy aHandler) {
if (aHandler) {
mFunctionHandlers[++mIdMaker] = std::move(aHandler);
return mIdMaker;
} else {
return -1;
}
}
template <class... outboundData>
void Notification<outboundData...>::notify(outboundData... notifySendData) {
for (auto handler : mFunctionHandlers) {
handler.second(notifySendData...);
}
}
template <class... handlerData>
void Notification<handlerData...>::unregister(HandlerID aHandlerId) {
auto handlerToUnRegister =
std::find_if(mFunctionHandlers.begin(), mFunctionHandlers.end(),
[aHandlerId](auto registeredHandler) {
return aHandlerId == registeredHandler.first;
});
if (handlerToUnRegister != mFunctionHandlers.end()) {
mFunctionHandlers.erase(handlerToUnRegister);
}
}
template <class... notifyData> class Handler {
public:
typedef std::function<void(notifyData...)> callableTy;
void operator=(Handler &other) = delete;
Handler() = default;
Handler(std::shared_ptr<Notification<notifyData...>> aNotification,
callableTy aCallable = nullptr)
: mNotification(aNotification),
mHandlerId(aNotification->onNotify(aCallable)) {}
virtual ~Handler() {
if (mHandlerId >= 0) {
mNotification->unregister(mHandlerId);
}
}
void operator=(callableTy aHandler) {
if (mHandlerId >= 0) {
mNotification->unregister(mHandlerId);
mHandlerId = -1;
}
if (aHandler) {
mHandlerId = mNotification->onNotify(aHandler);
}
}
void
SetNotification(std::shared_ptr<Notification<notifyData...>> aNotification) {
mNotification = aNotification;
}
private:
std::shared_ptr<Notification<notifyData...>> mNotification = nullptr;
int mHandlerId = -1;
};

View File

@ -0,0 +1,12 @@
#pragma once
#include <optional>
template <typename T>
class SPSCQueueInterface {
public:
virtual bool push(T obj) = 0;
virtual std::optional<T> pop() = 0;
virtual std::optional<T> peek() = 0;
virtual bool isFull() = 0;
virtual bool isEmpty() = 0;
};

View File

@ -0,0 +1,321 @@
#include "HardwareRevX.hpp"
#include "display.hpp"
#include "wifihandler.hpp"
void HardwareRevX::initIO() {
// Button Pin Definition
pinMode(SW_1, OUTPUT);
pinMode(SW_2, OUTPUT);
pinMode(SW_3, OUTPUT);
pinMode(SW_4, OUTPUT);
pinMode(SW_5, OUTPUT);
pinMode(SW_A, INPUT);
pinMode(SW_B, INPUT);
pinMode(SW_C, INPUT);
pinMode(SW_D, INPUT);
pinMode(SW_E, INPUT);
// Power Pin Definition
pinMode(CRG_STAT, INPUT_PULLUP);
pinMode(ADC_BAT, INPUT);
// IR Pin Definition
pinMode(IR_RX, INPUT);
pinMode(IR_LED, OUTPUT);
pinMode(IR_VCC, OUTPUT);
digitalWrite(IR_LED, HIGH); // HIGH off - LOW on
digitalWrite(IR_VCC, LOW); // HIGH on - LOW off
// LCD Pin Definition
pinMode(LCD_EN, OUTPUT);
digitalWrite(LCD_EN, HIGH);
pinMode(LCD_BL, OUTPUT);
digitalWrite(LCD_BL, HIGH);
// Other Pin Definition
pinMode(ACC_INT, INPUT);
pinMode(USER_LED, OUTPUT);
digitalWrite(USER_LED, LOW);
// Release GPIO hold in case we are coming out of standby
gpio_hold_dis((gpio_num_t)SW_1);
gpio_hold_dis((gpio_num_t)SW_2);
gpio_hold_dis((gpio_num_t)SW_3);
gpio_hold_dis((gpio_num_t)SW_4);
gpio_hold_dis((gpio_num_t)SW_5);
gpio_hold_dis((gpio_num_t)LCD_EN);
gpio_hold_dis((gpio_num_t)LCD_BL);
gpio_deep_sleep_hold_dis();
}
HardwareRevX::HardwareRevX() : HardwareAbstract() {}
HardwareRevX::WakeReason getWakeReason() {
// Find out wakeup cause
if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_EXT1) {
if (log(esp_sleep_get_ext1_wakeup_status()) / log(2) == 13)
return HardwareRevX::WakeReason::IMU;
else
return HardwareRevX::WakeReason::KEYPAD;
} else {
return HardwareRevX::WakeReason::RESET;
}
}
void HardwareRevX::init() {
// Make sure ESP32 is running at full speed
setCpuFrequencyMhz(240);
wakeup_reason = getWakeReason();
initIO();
Serial.begin(115200);
mDisplay = Display::getInstance();
mBattery = std::make_shared<Battery>(ADC_BAT, CRG_STAT);
mWifiHandler = wifiHandler::getInstance();
mKeys = std::make_shared<Keys>();
restorePreferences();
mTouchHandler.SetNotification(mDisplay->TouchNotification());
mTouchHandler = [this]([[maybe_unused]] auto touchPoint) {
standbyTimer = this->getSleepTimeout();
};
setupIMU();
setupIR();
debugPrint("Finished Hardware Setup in %d", millis());
}
void HardwareRevX::debugPrint(const char *fmt, ...) {
char result[100];
va_list arguments;
va_start(arguments, fmt);
vsnprintf(result, 100, fmt, arguments);
va_end(arguments);
Serial.print(result);
}
std::shared_ptr<wifiHandlerInterface> HardwareRevX::wifi() {
return mWifiHandler;
}
std::shared_ptr<BatteryInterface> HardwareRevX::battery() { return mBattery; }
std::shared_ptr<DisplayAbstract> HardwareRevX::display() { return mDisplay; }
std::shared_ptr<KeyPressAbstract> HardwareRevX::keys() { return mKeys; }
void HardwareRevX::activityDetection() {
static int accXold;
static int accYold;
static int accZold;
int accX = IMU.readFloatAccelX() * 1000;
int accY = IMU.readFloatAccelY() * 1000;
int accZ = IMU.readFloatAccelZ() * 1000;
// determine motion value as da/dt
motion = (abs(accXold - accX) + abs(accYold - accY) + abs(accZold - accZ));
// Calculate time to standby
standbyTimer -= 100;
if (standbyTimer < 0)
standbyTimer = 0;
// If the motion exceeds the threshold, the standbyTimer is reset
if (motion > MOTION_THRESHOLD)
standbyTimer = sleepTimeout;
// Store the current acceleration and time
accXold = accX;
accYold = accY;
accZold = accZ;
}
char HardwareRevX::getCurrentDevice() { return currentDevice; }
void HardwareRevX::setCurrentDevice(char currentDevice) {
this->currentDevice = currentDevice;
}
bool HardwareRevX::getWakeupByIMUEnabled() { return wakeupByIMUEnabled; }
void HardwareRevX::setWakeupByIMUEnabled(bool wakeupByIMUEnabled) {
this->wakeupByIMUEnabled = wakeupByIMUEnabled;
}
uint16_t HardwareRevX::getSleepTimeout() { return sleepTimeout; }
void HardwareRevX::setSleepTimeout(uint16_t sleepTimeout) {
this->sleepTimeout = sleepTimeout;
standbyTimer = sleepTimeout;
}
void HardwareRevX::enterSleep() {
// Save settings to internal flash memory
preferences.putBool("wkpByIMU", wakeupByIMUEnabled);
preferences.putUChar("blBrightness", mDisplay->getBrightness());
preferences.putUChar("currentDevice", currentDevice);
preferences.putUInt("sleepTimeout", sleepTimeout);
if (!preferences.getBool("alreadySetUp"))
preferences.putBool("alreadySetUp", true);
preferences.end();
// Configure IMU
uint8_t intDataRead;
IMU.readRegister(&intDataRead, LIS3DH_INT1_SRC); // clear interrupt
configIMUInterrupts();
IMU.readRegister(&intDataRead,
LIS3DH_INT1_SRC); // really clear interrupt
// Prepare IO states
digitalWrite(LCD_DC, LOW); // LCD control signals off
digitalWrite(LCD_CS, LOW);
digitalWrite(LCD_MOSI, LOW);
digitalWrite(LCD_SCK, LOW);
digitalWrite(LCD_EN, HIGH); // LCD logic off
digitalWrite(LCD_BL, HIGH); // LCD backlight off
pinMode(CRG_STAT, INPUT); // Disable Pull-Up
digitalWrite(IR_VCC, LOW); // IR Receiver off
// Configure button matrix for ext1 interrupt
pinMode(SW_1, OUTPUT);
pinMode(SW_2, OUTPUT);
pinMode(SW_3, OUTPUT);
pinMode(SW_4, OUTPUT);
pinMode(SW_5, OUTPUT);
digitalWrite(SW_1, HIGH);
digitalWrite(SW_2, HIGH);
digitalWrite(SW_3, HIGH);
digitalWrite(SW_4, HIGH);
digitalWrite(SW_5, HIGH);
gpio_hold_en((gpio_num_t)SW_1);
gpio_hold_en((gpio_num_t)SW_2);
gpio_hold_en((gpio_num_t)SW_3);
gpio_hold_en((gpio_num_t)SW_4);
gpio_hold_en((gpio_num_t)SW_5);
// Force display pins to high impedance
// Without this the display might not wake up from sleep
pinMode(LCD_BL, INPUT);
pinMode(LCD_EN, INPUT);
gpio_hold_en((gpio_num_t)LCD_BL);
gpio_hold_en((gpio_num_t)LCD_EN);
gpio_deep_sleep_hold_en();
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);
delay(100);
// Sleep
esp_deep_sleep_start();
}
void HardwareRevX::configIMUInterrupts() {
uint8_t dataToWrite = 0;
// LIS3DH_INT1_CFG
// dataToWrite |= 0x80;//AOI, 0 = OR 1 = AND
// dataToWrite |= 0x40;//6D, 0 = interrupt source, 1 = 6 direction source
// Set these to enable individual axes of generation source (or direction)
// -- high and low are used generically
dataToWrite |= 0x20; // Z high
// dataToWrite |= 0x10;//Z low
dataToWrite |= 0x08; // Y high
// dataToWrite |= 0x04;//Y low
dataToWrite |= 0x02; // X high
// dataToWrite |= 0x01;//X low
if (wakeupByIMUEnabled)
IMU.writeRegister(LIS3DH_INT1_CFG, 0b00101010);
else
IMU.writeRegister(LIS3DH_INT1_CFG, 0b00000000);
// LIS3DH_INT1_THS
dataToWrite = 0;
// Provide 7 bit value, 0x7F always equals max range by accelRange setting
dataToWrite |= 0x45;
IMU.writeRegister(LIS3DH_INT1_THS, dataToWrite);
// LIS3DH_INT1_DURATION
dataToWrite = 0;
// minimum duration of the interrupt
// LSB equals 1/(sample rate)
dataToWrite |= 0x00; // 1 * 1/50 s = 20ms
IMU.writeRegister(LIS3DH_INT1_DURATION, dataToWrite);
// LIS3DH_CTRL_REG5
// Int1 latch interrupt and 4D on int1 (preserve fifo en)
IMU.readRegister(&dataToWrite, LIS3DH_CTRL_REG5);
dataToWrite &= 0xF3; // Clear bits of interest
dataToWrite |= 0x08; // Latch interrupt (Cleared by reading int1_src)
// dataToWrite |= 0x04; //Pipe 4D detection from 6D recognition to int1?
IMU.writeRegister(LIS3DH_CTRL_REG5, dataToWrite);
// LIS3DH_CTRL_REG3
// Choose source for pin 1
dataToWrite = 0;
// dataToWrite |= 0x80; //Click detect on pin 1
dataToWrite |= 0x40; // AOI1 event (Generator 1 interrupt on pin 1)
dataToWrite |= 0x20; // AOI2 event ()
// dataToWrite |= 0x10; //Data ready
// dataToWrite |= 0x04; //FIFO watermark
// dataToWrite |= 0x02; //FIFO overrun
IMU.writeRegister(LIS3DH_CTRL_REG3, dataToWrite);
}
void HardwareRevX::restorePreferences() {
// Restore settings from internal flash memory
int backlight_brightness = 255;
preferences.begin("settings", false);
if (preferences.getBool("alreadySetUp")) {
wakeupByIMUEnabled = preferences.getBool("wkpByIMU");
backlight_brightness = preferences.getUChar("blBrightness");
currentDevice = preferences.getUChar("currentDevice");
sleepTimeout = preferences.getUInt("sleepTimeout");
// setting the default to prevent a 0ms sleep timeout
if (sleepTimeout == 0) {
sleepTimeout = SLEEP_TIMEOUT;
}
}
mDisplay->setBrightness(backlight_brightness);
}
void HardwareRevX::setupIMU() {
// Setup hal
IMU.settings.accelSampleRate =
50; // Hz. Can be: 0,1,10,25,50,100,200,400,1600,5000 Hz
IMU.settings.accelRange = 2; // Max G force readable. Can be: 2, 4, 8, 16
IMU.settings.adcEnabled = 0;
IMU.settings.tempEnabled = 0;
IMU.settings.xAccelEnabled = 1;
IMU.settings.yAccelEnabled = 1;
IMU.settings.zAccelEnabled = 1;
IMU.begin();
uint8_t intDataRead;
IMU.readRegister(&intDataRead, LIS3DH_INT1_SRC); // clear interrupt
}
void HardwareRevX::setupIR() {
// Setup IR
IrSender.begin();
digitalWrite(IR_VCC, HIGH); // Turn on IR receiver
IrReceiver.enableIRIn(); // Start the receiver
}
void HardwareRevX::startTasks() {}
void HardwareRevX::loopHandler() {
standbyTimer < 2000 ? mDisplay->sleep() : mDisplay->wake();
// TODO move to debug task
// Blink debug LED at 1 Hz
digitalWrite(USER_LED, millis() % 1000 > 500);
// Refresh IMU data at 10Hz
static unsigned long IMUTaskTimer = millis();
if (millis() - IMUTaskTimer >= 100) {
activityDetection();
if (standbyTimer == 0) {
Serial.println("Entering Sleep Mode. Goodbye.");
enterSleep();
}
IMUTaskTimer = millis();
}
}

View File

@ -0,0 +1,91 @@
#pragma once
#include "SparkFunLIS3DH.h"
#include "HardwareAbstract.hpp"
#include "battery.hpp"
#include "lvgl.h"
#include "wifihandler.hpp"
#include <Arduino.h>
#include <IRrecv.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <IRutils.h>
#include <Preferences.h>
#include <PubSubClient.h>
#include <functional>
#include <memory>
#include "omoteconfig.h"
#include "BatteryInterface.h"
#include "display.hpp"
#include "keys.hpp"
#include "wifiHandlerInterface.h"
class HardwareRevX : public HardwareAbstract {
public:
enum class WakeReason { RESET, IMU, KEYPAD };
HardwareRevX();
// HardwareAbstract
virtual void init() override;
virtual void debugPrint(const char *fmt, ...) override;
virtual std::shared_ptr<BatteryInterface> battery() override;
virtual std::shared_ptr<DisplayAbstract> display() override;
virtual std::shared_ptr<wifiHandlerInterface> wifi() override;
virtual std::shared_ptr<KeyPressAbstract> keys() override;
virtual char getCurrentDevice() override;
virtual void setCurrentDevice(char currentDevice) override;
virtual bool getWakeupByIMUEnabled() override;
virtual void setWakeupByIMUEnabled(bool wakeupByIMUEnabled) override;
virtual uint16_t getSleepTimeout() override;
virtual void setSleepTimeout(uint16_t sleepTimeout) override;
/// @brief To be ran in loop out in main
// TODO move to a freertos task
void loopHandler() override;
protected:
// Init Functions to setup hardware
void initIO();
void restorePreferences();
void slowDisplayWakeup();
void setupIMU();
void setupIR();
void activityDetection();
void enterSleep();
void configIMUInterrupts();
// Tasks
void startTasks();
private:
std::shared_ptr<Battery> mBattery;
std::shared_ptr<Display> mDisplay;
std::shared_ptr<wifiHandler> mWifiHandler;
std::shared_ptr<Keys> mKeys;
// IMU Motion Detection
LIS3DH IMU = LIS3DH(I2C_MODE, 0x19); // Default constructor is I2C, addr 0x19.
int standbyTimer = SLEEP_TIMEOUT;
int sleepTimeout = SLEEP_TIMEOUT;
int motion = 0;
WakeReason wakeup_reason;
Preferences preferences;
bool wakeupByIMUEnabled = true;
byte currentDevice = 1; // Current Device to control (allows switching
// mappings between devices)
// IR declarations
IRsend IrSender = IRsend(IR_LED, true);
IRrecv IrReceiver = IRrecv(IR_RX);
static std::shared_ptr<HardwareRevX> mInstance;
Handler<TS_Point> mTouchHandler;
};

View File

@ -0,0 +1,33 @@
#include "battery.hpp"
#include <Arduino.h>
Battery::Battery(int adc_pin, int charging_pin): BatteryInterface(),
mAdcPin(adc_pin),
mChargingPin(charging_pin)
{
mAdcPin = adc_pin;
mChargingPin = charging_pin;
// Power Pin Definition
pinMode(mChargingPin, INPUT_PULLUP);
pinMode(mAdcPin, INPUT);
}
int Battery::getPercentage()
{
return constrain(map(this->getVoltage(), 3700, 4200, 0, 100), 0, 100);
}
bool Battery::isCharging()
{
return !digitalRead(mChargingPin);
}
bool Battery::isConnected()
{
return ((!isCharging()) && (getVoltage() < 4350));
}
int Battery::getVoltage()
{
return analogRead(mAdcPin)*2*3300/4095 + 350;
}

View File

@ -0,0 +1,58 @@
#pragma once
#include "BatteryInterface.h"
#include "DisplayAbstract.h"
class Battery: public BatteryInterface {
public:
/**
* @brief Get the Percentage of the battery
*
* @return int Percentage of the battery
*/
virtual int getPercentage() override;
/**
* @brief Function to determine if the battery is charging or not
*
* @return true Battery is currently charging
* @return false Battery is currently not charging
*/
virtual bool isCharging() override;
/**
* @brief Function to determine if the battery is connected
*
* @return true Battery is connected
* @return false Battery is not connected
*/
bool isConnected();
Battery(int adc_pin, int charging_pin);
// Not sure why this is needed but shared_ptr seems to really
// need it possibly a compiler template handling limitation
// none the less we really should not use it.
Battery() = default;
private:
/**
* @brief Function to get the current voltage of the battery
*
* @return int Voltage of the battery in mV
*/
int getVoltage();
/**
* @brief Variable to store which pin should be used for ADC
*
*/
int mAdcPin;
/**
* @brief Variable to store which pin is used to indicate if the battery is currently charging or not
*
*/
int mChargingPin;
};

View File

@ -0,0 +1,184 @@
#include "display.hpp"
#include "Wire.h"
#include "driver/ledc.h"
#include "omoteconfig.h"
std::shared_ptr<Display> Display::getInstance() {
if (DisplayAbstract::mInstance == nullptr) {
DisplayAbstract::mInstance =
std::shared_ptr<Display>(new Display(LCD_BL, LCD_EN));
}
return std::static_pointer_cast<Display>(mInstance);
}
Display::Display(int backlight_pin, int enable_pin)
: DisplayAbstract(), mBacklightPin(backlight_pin), mEnablePin(enable_pin),
tft(TFT_eSPI()), touch(Adafruit_FT6206()) {
pinMode(mEnablePin, OUTPUT);
digitalWrite(mEnablePin, HIGH);
pinMode(mBacklightPin, OUTPUT);
digitalWrite(mBacklightPin, HIGH);
setupBacklight(); // This eliminates the flash of the backlight
// Slowly charge the VSW voltage to prevent a brownout
// Workaround for hardware rev 1!
for (int i = 0; i < 100; i++) {
digitalWrite(this->mEnablePin, HIGH); // LCD Logic off
delayMicroseconds(1);
digitalWrite(this->mEnablePin, LOW); // LCD Logic on
}
setupTFT();
setupTouchScreen();
mFadeTaskMutex = xSemaphoreCreateBinary();
xSemaphoreGive(mFadeTaskMutex);
}
void Display::setupBacklight() {
// Configure the backlight PWM
// Manual setup because ledcSetup() briefly turns on the backlight
ledc_channel_config_t ledc_channel_left;
ledc_channel_left.gpio_num = (gpio_num_t)mBacklightPin;
ledc_channel_left.speed_mode = LEDC_HIGH_SPEED_MODE;
ledc_channel_left.channel = LEDC_CHANNEL_5;
ledc_channel_left.intr_type = LEDC_INTR_DISABLE;
ledc_channel_left.timer_sel = LEDC_TIMER_1;
ledc_channel_left.flags.output_invert = 1; // Can't do this with ledcSetup()
ledc_channel_left.duty = 0;
ledc_channel_left.hpoint = 0;
ledc_timer_config_t ledc_timer;
ledc_timer.speed_mode = LEDC_HIGH_SPEED_MODE;
ledc_timer.duty_resolution = LEDC_TIMER_8_BIT;
ledc_timer.timer_num = LEDC_TIMER_1;
ledc_timer.clk_cfg = LEDC_AUTO_CLK;
ledc_timer.freq_hz = 640;
ledc_channel_config(&ledc_channel_left);
ledc_timer_config(&ledc_timer);
}
void Display::setupTFT() {
delay(100);
tft.init();
tft.initDMA();
tft.setRotation(0);
tft.fillScreen(TFT_BLACK);
tft.setSwapBytes(true);
}
void Display::setupTouchScreen() {
// Configure i2c pins and set frequency to 400kHz
Wire.begin(TFT_SDA, TFT_SCL, 400000);
touch.begin(128); // Initialize touchscreen and set sensitivity threshold
}
void Display::setBrightness(uint8_t brightness) {
mAwakeBrightness = brightness;
Serial.print("Set Brightness:");
Serial.println(mAwakeBrightness);
startFade();
}
uint8_t Display::getBrightness() { return mAwakeBrightness; }
void Display::setCurrentBrightness(uint8_t brightness) {
mBrightness = brightness;
auto duty = static_cast<int>(mBrightness);
ledcWrite(LCD_BACKLIGHT_LEDC_CHANNEL, duty);
// Serial.print("Current Brightness:");
// Serial.println(mBrightness);
}
void Display::turnOff() {
digitalWrite(this->mBacklightPin, HIGH);
digitalWrite(this->mEnablePin, HIGH);
pinMode(this->mBacklightPin, INPUT);
pinMode(this->mEnablePin, INPUT);
gpio_hold_en((gpio_num_t)mBacklightPin);
gpio_hold_en((gpio_num_t)mEnablePin);
}
void Display::screenInput(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) {
// int16_t touchX, touchY;
touchPoint = touch.getPoint();
int16_t touchX = touchPoint.x;
int16_t touchY = touchPoint.y;
bool touched = false;
if ((touchX > 0) || (touchY > 0)) {
touched = true;
mTouchEvent->notify(touchPoint);
}
if (!touched) {
data->state = LV_INDEV_STATE_REL;
} else {
data->state = LV_INDEV_STATE_PR;
// Set the coordinates
data->point.x = SCREEN_WIDTH - touchX;
data->point.y = SCREEN_HEIGHT - touchY;
// Serial.print( "touchpoint: x" );
// Serial.print( touchX );
// Serial.print( " y" );
// Serial.println( touchY );
// tft.drawFastHLine(0, screenHeight - touchY, screenWidth, TFT_RED);
// tft.drawFastVLine(screenWidth - touchX, 0, screenHeight, TFT_RED);
}
}
void Display::fadeImpl(void *) {
bool fadeDone = false;
while (!fadeDone) {
fadeDone = getInstance()->fade();
vTaskDelay(3 / portTICK_PERIOD_MS); // 3 miliseconds between steps
// 0 - 255 will take about .75 seconds to fade up.
}
xSemaphoreTake(getInstance()->mFadeTaskMutex, portMAX_DELAY);
getInstance()->mDisplayFadeTask = nullptr;
xSemaphoreGive(getInstance()->mFadeTaskMutex);
vTaskDelete(nullptr); // Delete Fade Task
}
bool Display::fade() {
// Early return no fade needed.
if (mBrightness == mAwakeBrightness || isAsleep && mBrightness == 0) {
return true;
}
bool fadeDown = isAsleep || mBrightness > mAwakeBrightness;
if (fadeDown) {
setCurrentBrightness(mBrightness - 1);
auto setPoint = isAsleep ? 0 : mAwakeBrightness;
return mBrightness == setPoint;
} else {
setCurrentBrightness(mBrightness + 1);
return mBrightness == mAwakeBrightness;
}
}
void Display::startFade() {
xSemaphoreTake(mFadeTaskMutex, portMAX_DELAY);
// Only Create Task if it is needed
if (mDisplayFadeTask == nullptr) {
xTaskCreate(&Display::fadeImpl, "Display Fade Task", 1024, nullptr, 5,
&mDisplayFadeTask);
}
xSemaphoreGive(mFadeTaskMutex);
}
void Display::flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area,
lv_color_t *color_p) {
uint32_t w = (area->x2 - area->x1 + 1);
uint32_t h = (area->y2 - area->y1 + 1);
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.pushPixelsDMA((uint16_t *)&color_p->full, w * h);
tft.endWrite();
lv_disp_flush_ready(disp);
}

View File

@ -0,0 +1,86 @@
#pragma once
#include "DisplayAbstract.h"
#include "HardwareAbstract.hpp"
#include "Notification.hpp"
#include "driver/ledc.h"
#include <Adafruit_FT6206.h>
#include <TFT_eSPI.h>
#include <memory>
/*LEDC Channel to use for the LCD backlight*/
#define LCD_BACKLIGHT_LEDC_CHANNEL LEDC_CHANNEL_5
#define LCD_BACKLIGHT_LEDC_FREQUENCY 640
#define LCD_BACKLIGHT_LEDC_BIT_RESOLUTION 8
#define DEFAULT_BACKLIGHT_BRIGHTNESS 128
class Display : public DisplayAbstract {
public:
static std::shared_ptr<Display> getInstance();
/// @brief Set brightness setting and fade to it
/// @param brightness
virtual void setBrightness(uint8_t brightness) override;
virtual uint8_t getBrightness() override;
virtual void turnOff() override;
std::shared_ptr<Notification<TS_Point>> TouchNotification() {
return mTouchEvent;
}
inline void wake() {
if (isAsleep) {
isAsleep = false;
startFade();
}
}
inline void sleep() {
if (!isAsleep) {
isAsleep = true;
startFade();
}
}
protected:
virtual void flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area,
lv_color_t *color_p);
virtual void screenInput(lv_indev_drv_t *indev_driver,
lv_indev_data_t *data) override;
/// @brief Fade toward brightness based on isAwake
/// @return True - Fade complete
/// False - Fade set point not reached
bool fade();
/// @brief Start the Fade task
void startFade();
/// @brief Set the actual display brightness right now
/// @param brightness
void setCurrentBrightness(uint8_t brightness);
private:
Display(int backlight_pin, int enable_pin);
void setupTFT();
void setupTouchScreen();
void setupBacklight();
int mEnablePin;
int mBacklightPin;
TFT_eSPI tft;
Adafruit_FT6206 touch;
TS_Point touchPoint;
TS_Point oldPoint;
std::shared_ptr<Notification<TS_Point>> mTouchEvent =
std::make_shared<Notification<TS_Point>>();
TaskHandle_t mDisplayFadeTask = nullptr;
SemaphoreHandle_t mFadeTaskMutex = nullptr;
static void fadeImpl(void *aBrightness);
uint8_t mBrightness = 0; // Current display brightness
uint8_t mAwakeBrightness = 100; // Current setting for brightness when awake
bool isAsleep = false;
};

View File

@ -0,0 +1,70 @@
#include "freeRTOSMPMCQueue.hpp"
template <typename T>
freeRTOSMPMCQueue<T>::freeRTOSMPMCQueue(uint32_t size)
{
this->queue = xQueueCreate(size, sizeof(T));
}
template <typename T>
freeRTOSMPMCQueue<T>::~freeRTOSMPMCQueue()
{
vQueueDelete(this->queue);
}
template <typename T>
bool freeRTOSMPMCQueue<T>::push(T obj)
{
return xQueueSendToBack(this->queue, &obj, 0) == pdTRUE;
}
template <typename T>
bool freeRTOSMPMCQueue<T>::push(T obj, bool overwrite)
{
if (overwrite == true)
{
xQueueOverwrite(this->queue, obj);
return true;
}
else
{
return this->push(obj);
}
}
template <typename T>
std::optional<T> freeRTOSMPMCQueue<T>::pop()
{
T retval;
if (xQueueReceive(this->queue, &retval, 0) == pdTRUE)
{
return retval;
}
return std::nullopt;
}
template <typename T>
std::optional<T> freeRTOSMPMCQueue<T>::peek()
{
T retval;
if (xQueuePeek(this->queue, &retval, 0) == pdTRUE)
{
return retval;
}
return std::nullopt;
}
template <typename T>
bool freeRTOSMPMCQueue<T>::isFull()
{
return (xQueueIsQueueFullFromISR(this->queue) == pdTRUE);
}
template <typename T>
bool freeRTOSMPMCQueue<T>::isEmpty()
{
return (xQueueIsQueueEmptyFromISR(this->queue) == pdTRUE);
}

View File

@ -0,0 +1,18 @@
#pragma once
#include "MPMCQueueInterface.hpp"
#include "Arduino.h"
template <typename T>
class freeRTOSMPMCQueue: public MPMCQueueInterface<T>
{
public:
freeRTOSMPMCQueue(uint32_t size);
~freeRTOSMPMCQueue();
bool push (T obj);
bool push (T obj, bool overwrite);
std::optional<T> pop();
std::optional<T> peek();
bool isFull();
bool isEmpty();
private:
QueueHandle_t queue;
};

View File

@ -0,0 +1,61 @@
#include "keys.hpp"
Keys::Keys() {
static constexpr auto MaxQueueableKeyPresses = 5;
mKeyPressQueueHandle = xQueueCreate(MaxQueueableKeyPresses, sizeof(KeyEvent));
xTaskCreate(KeyGrabberTask, "KeyGrabber", 1024, this, 1, &mKeyGrabbingTask);
xTaskCreate(KeyProccessor, "KeyProccessor", 4096, this, 1, &mKeyHandlingTask);
}
void Keys::KeyGrabberTask(void *aSelf) {
auto self = reinterpret_cast<Keys *>(aSelf);
while (true) {
self->GrabKeys();
vTaskDelay(5 / portTICK_PERIOD_MS); // 5 ms between key grabs
}
}
void Keys::KeyProccessor(void *aSelf) {
auto self = reinterpret_cast<Keys *>(aSelf);
while (true) {
self->HandleKeyPresses();
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
void Keys::HandleKeyPresses() {
KeyPressAbstract::KeyEvent eventToHandle;
while (xQueueReceive(mKeyPressQueueHandle, &eventToHandle, 0) == pdTRUE) {
if (mKeyEventHandler) {
mKeyEventHandler(eventToHandle);
}
}
};
void Keys::QueueKeyEvent(KeyEvent aJustOccuredKeyEvent) {
BaseType_t higherPriorityTaskAwoke;
xQueueSendFromISR(mKeyPressQueueHandle, &aJustOccuredKeyEvent,
&higherPriorityTaskAwoke);
};
void Keys::GrabKeys() {
if (!customKeypad.getKeys()) {
return; // no activity return early.
}
for (int i = 0; i < LIST_MAX; i++) {
if (customKeypad.key[i].kstate == PRESSED ||
customKeypad.key[i].kstate == RELEASED) {
// May need to think about resetting sleep timer in key handler....
// standbyTimer =
// sleepTimeout; // Reset the sleep timer when a button is
// pressed
auto eventType = customKeypad.key[i].kstate == PRESSED
? KeyEvent::Type::Press
: KeyEvent::Type::Release;
const auto keyChar = customKeypad.key[i].kchar;
auto stateChange = customKeypad.key[i].stateChanged;
if (charKeyToKeyIds.count(keyChar) > 0 && stateChange) {
QueueKeyEvent(KeyEvent(charKeyToKeyIds.at(keyChar), eventType));
}
}
}
}

View File

@ -0,0 +1,76 @@
#pragma once
#include "KeyPressAbstract.hpp"
#include "omoteconfig.h"
#include <Keypad.h> // modified for inverted logic
#include <map>
class Keys : public KeyPressAbstract {
public:
Keys();
void HandleKeyPresses() override;
void QueueKeyEvent(KeyEvent aJustOccuredKeyEvent) override;
protected:
void GrabKeys();
private:
static void KeyGrabberTask(void *aSelf);
static void KeyProccessor(void *aSelf);
QueueHandle_t mKeyPressQueueHandle;
TaskHandle_t mKeyGrabbingTask;
TaskHandle_t mKeyHandlingTask;
// Keypad declarations
static const byte ROWS = 5; // four rows
static const byte COLS = 5; // four columns
// define the symbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'s', '^', '-', 'm', 'r'}, // source, channel+, Volume-, mute, record
{'i', 'R', '+', 'k', 'd'}, // info, right, Volume+, OK, down
{'4', 'v', '1', '3', '2'}, // blue, channel-, red, yellow, green
{'>', 'o', 'b', 'u', 'L'}, // forward, off, back, up, left
{'?', 'p', 'c', '<', '='} // ?, play, config, rewind, stop
};
// TODO what is '?' lol
// TODO Should be able to optomize this out by reordering Ids at some point
// or even using interrupts to trigger key press queueing
static inline const std::map<char, KeyId> charKeyToKeyIds{
{'o', KeyId::Power},
// Top 4 Buttons left to right
{'=', KeyId::Stop},
{'<', KeyId::Rewind},
{'p', KeyId::Play},
{'>', KeyId::FastForward},
// Buttons around D Pad
{'c', KeyId::Menu},
{'i', KeyId::Info},
{'b', KeyId::Back},
{'s', KeyId::Source},
// D Pad
{'u', KeyId::Up},
{'d', KeyId::Down},
{'L', KeyId::Left},
{'R', KeyId::Right},
{'k', KeyId::Center},
// Volume Channel and 2 between
{'+', KeyId::VolUp},
{'-', KeyId::VolDown},
{'m', KeyId::Mute},
{'r', KeyId::Record},
{'^', KeyId::ChannelUp},
{'v', KeyId::ChannelDown},
// Bottom 4 buttons left to right
{'1', KeyId::Aux1},
{'2', KeyId::Aux2},
{'3', KeyId::Aux3},
{'4', KeyId::Aux4}};
byte rowPins[ROWS] = {SW_A, SW_B, SW_C, SW_D,
SW_E}; // connect to the row pinouts of the keypad
byte colPins[COLS] = {SW_1, SW_2, SW_3, SW_4,
SW_5}; // connect to the column pinouts of the keypad
Keypad customKeypad =
Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
};

View File

@ -0,0 +1,52 @@
#pragma once
#define IS_SIMULATOR false
// Comment out to disable connected features
#define ENABLE_WIFI
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
#define MQTT_SERVER "YOUR_MQTT_SERVER_IP"
// time until device enters sleep mode in milliseconds
#define SLEEP_TIMEOUT 20000
// motion above threshold keeps device awake
#define MOTION_THRESHOLD 50
// IO34+IO35+IO37+IO38+IO39(+IO13)
#define BUTTON_PIN_BITMASK 0b1110110000000000000000000010000000000000
// Pin assignment
// -----------------------------------------------------------------------------------------------------------------------
#define LCD_DC 9 // defined in TFT_eSPI User_Setup.h
#define LCD_CS 5
#define LCD_MOSI 23
#define LCD_SCK 18
#define LCD_BL 4
#define LCD_EN 10
#define USER_LED 2
#define SW_1 32 // 1...5: Output
#define SW_2 26
#define SW_3 27
#define SW_4 14
#define SW_5 12
#define SW_A 37 // A...E: Input
#define SW_B 38
#define SW_C 39
#define SW_D 34
#define SW_E 35
#define IR_RX 15 // IR receiver input
#define ADC_BAT 36 // Battery voltage sense input (1/2 divider)
#define IR_VCC 25 // IR receiver power
#define IR_LED 33 // IR LED output
#define TFT_SCL 22
#define TFT_SDA 19
#define ACC_INT 20
#define CRG_STAT 21 // battery charger feedback

View File

@ -0,0 +1,116 @@
#include "wifihandler.hpp"
#include "HardwareAbstract.hpp"
#include <Arduino.h>
#include <Preferences.h>
#include <WiFi.h>
std::shared_ptr<wifiHandler> wifiHandler::mInstance = nullptr;
std::shared_ptr<wifiHandler> wifiHandler::getInstance() {
if (mInstance) {
return mInstance;
}
mInstance = std::shared_ptr<wifiHandler>(new wifiHandler());
return mInstance;
};
void wifiHandler::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t aEventInfo) {
int no_networks = 0;
switch (event) {
case ARDUINO_EVENT_WIFI_SCAN_DONE: {
no_networks = WiFi.scanComplete();
auto info = std::vector<WifiInfo>(no_networks);
for (int i = 0; i < no_networks; i++) {
auto ssid =
WiFi.SSID(i).c_str() ? std::string(WiFi.SSID(i).c_str()) : "No SSID";
info[i] = WifiInfo(ssid, WiFi.RSSI(i));
}
mScanNotification->notify(info);
if (WiFi.isConnected() == false) {
WiFi.reconnect();
}
break;
}
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
StoreCredentials();
WiFi.setAutoConnect(true);
UpdateStatus();
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
case ARDUINO_EVENT_WIFI_STA_LOST_IP:
case ARDUINO_EVENT_WIFI_STA_STOP:
UpdateStatus();
break;
default:
break;
}
}
void wifiHandler::UpdateStatus() {
Serial.println("UpdateStatus");
mCurrentStatus.isConnected = WiFi.isConnected();
mCurrentStatus.IP = WiFi.localIP().toString().c_str();
mCurrentStatus.ssid =
mCurrentStatus.isConnected ? WiFi.SSID().c_str() : mConnectionAttemptSSID;
mStatusUpdate->notify(mCurrentStatus);
}
void wifiHandler::StoreCredentials() {
// No connection was attempted so don't try to to save the creds
if (!mIsConnectionAttempt) {
return;
}
mPassword = mConnectionAttemptPassword;
mSSID = mConnectionAttemptSSID;
Preferences preferences;
preferences.begin("wifiSettings", false);
preferences.putString("password", mPassword.c_str());
preferences.putString("SSID", mSSID.c_str());
preferences.end();
mConnectionAttemptPassword.clear();
mConnectionAttemptSSID.clear();
mIsConnectionAttempt = false;
}
void wifiHandler::scan() {
Serial.println("scan called");
WiFi.setAutoReconnect(false);
WiFi.scanNetworks(true);
}
void wifiHandler::begin() {
WiFi.setHostname("OMOTE");
WiFi.mode(WIFI_STA);
WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t aEventInfo) {
mInstance->WiFiEvent(event, aEventInfo);
});
Preferences preferences;
preferences.begin("wifiSettings", false);
String ssid = preferences.getString("SSID");
String password = preferences.getString("password");
preferences.end();
// Attempt Connection with stored Credentials
if (!ssid.isEmpty()) {
connect(ssid.c_str(), password.c_str());
} else {
Serial.println("no SSID or password stored");
WiFi.disconnect();
}
WiFi.setSleep(true);
}
void wifiHandler::connect(std::string ssid, std::string password) {
Serial.printf("Attempting Wifi Connection To %s \n", ssid.c_str());
mIsConnectionAttempt = true;
mConnectionAttemptPassword = password;
mConnectionAttemptSSID = ssid;
auto status = WiFi.begin(mConnectionAttemptSSID.c_str(),
mConnectionAttemptPassword.c_str());
}

View File

@ -0,0 +1,53 @@
#pragma once
#include "Notification.hpp"
#include "memory.h"
#include "wifiHandlerInterface.h"
#include <WiFi.h>
class wifiHandler : public wifiHandlerInterface {
public:
static std::shared_ptr<wifiHandler> getInstance();
// wifiHandlerInterface Implementation
void begin() override;
void scan() override;
void connect(std::string ssid, std::string password) override;
wifiStatus GetStatus() override { return mCurrentStatus; };
//
protected:
wifiHandler() = default;
static std::shared_ptr<wifiHandler> mInstance;
/**
* @brief Function to store the credentials when we have had a
* successful connection
*/
void StoreCredentials();
private:
/**
* @brief Handler for incoming arduino wifi events
* @param event - a Wifi event
*/
void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t aEventInfo);
/**
* @brief Update Internal status and send out a notification
*/
void UpdateStatus();
wifiStatus mCurrentStatus;
/**
* @brief Variables used to track wifi connection attempts
*/
bool mIsConnectionAttempt = false;
std::string mConnectionAttemptPassword;
std::string mConnectionAttemptSSID;
/**
* @brief Verified Working User and Pass to Wifi network
*/
std::string mPassword;
std::string mSSID;
};

View File

@ -0,0 +1,62 @@
#include "HardwareSimulator.hpp"
#include "SDLDisplay.hpp"
#include <sstream>
HardwareSimulator::HardwareSimulator()
: HardwareAbstract(), mTickThread([]() {
while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(2));
lv_tick_inc(2); /*Tell lvgl that 2 milliseconds were elapsed*/
}
}),
mBattery(std::make_shared<BatterySimulator>()),
mDisplay(SDLDisplay::getInstance()),
mWifiHandler(std::make_shared<wifiHandlerSim>()),
mKeys(std::make_shared<KeyPressSim>()) {
mHardwareStatusTitleUpdate = std::thread([this] {
int dataToShow = 0;
while (true) {
std::stringstream title;
switch (dataToShow) {
case 0:
title << "Batt:" << mBattery->getPercentage() << "%" << std::endl;
break;
case 1:
title << "BKLght: " << static_cast<int>(mDisplay->getBrightness())
<< std::endl;
dataToShow = -1;
break;
default:
dataToShow = -1;
}
dataToShow++;
mDisplay->setTitle(title.str());
std::this_thread::sleep_for(std::chrono::seconds(2));
}
});
}
std::shared_ptr<BatteryInterface> HardwareSimulator::battery() {
return mBattery;
}
std::shared_ptr<DisplayAbstract> HardwareSimulator::display() {
return mDisplay;
}
std::shared_ptr<wifiHandlerInterface> HardwareSimulator::wifi() {
return mWifiHandler;
}
std::shared_ptr<KeyPressAbstract> HardwareSimulator::keys() { return mKeys; }
char HardwareSimulator::getCurrentDevice() { return 0; }
void HardwareSimulator::setCurrentDevice(char currentDevice) {}
bool HardwareSimulator::getWakeupByIMUEnabled() { return true; }
void HardwareSimulator::setWakeupByIMUEnabled(bool wakeupByIMUEnabled) {}
uint16_t HardwareSimulator::getSleepTimeout() { return 20000; }
void HardwareSimulator::setSleepTimeout(uint16_t sleepTimeout) {}

View File

@ -0,0 +1,47 @@
#pragma once
#include "HardwareAbstract.hpp"
#include "KeyPressSim.hpp"
#include "SDLDisplay.hpp"
#include "batterySimulator.hpp"
#include "wifiHandlerSim.hpp"
#include <thread>
class HardwareSimulator : public HardwareAbstract {
public:
HardwareSimulator();
void init() override{};
void loopHandler() override{};
void debugPrint(const char *fmt, ...) override {
va_list arguments;
va_start(arguments, fmt);
vprintf(fmt, arguments);
va_end(arguments);
}
std::shared_ptr<BatteryInterface> battery() override;
std::shared_ptr<DisplayAbstract> display() override;
std::shared_ptr<wifiHandlerInterface> wifi() override;
std::shared_ptr<KeyPressAbstract> keys() override;
char getCurrentDevice() override;
void setCurrentDevice(char currentDevice) override;
bool getWakeupByIMUEnabled() override;
void setWakeupByIMUEnabled(bool wakeupByIMUEnabled) override;
uint16_t getSleepTimeout() override;
void setSleepTimeout(uint16_t sleepTimeout) override;
private:
std::thread mTickThread;
std::thread mHardwareStatusTitleUpdate;
std::shared_ptr<BatterySimulator> mBattery;
std::shared_ptr<SDLDisplay> mDisplay;
std::shared_ptr<wifiHandlerSim> mWifiHandler;
std::shared_ptr<KeyPressSim> mKeys;
};

View File

@ -0,0 +1,44 @@
#include "KeyPressSim.hpp"
#include <memory>
KeyPressSim::KeyPressSim()
: mKeyHandlerThread([this] {
while (true) {
HandleKeyPresses();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
}) {
SDL_AddEventWatch(KeyPressSim::GrabKeyImpl, this);
};
int KeyPressSim::GrabKeyImpl(void *aSelf, SDL_Event *aEvent) {
reinterpret_cast<KeyPressSim *>(aSelf)->GrabKeys(aEvent);
return 0;
}
void KeyPressSim::GrabKeys(SDL_Event *aEvent) {
if (aEvent->type == SDL_KEYDOWN || aEvent->type == SDL_KEYUP) {
auto keyEventType = aEvent->type == SDL_KEYDOWN ? KeyEvent::Type::Press
: KeyEvent::Type::Release;
const auto SDLK_key = aEvent->key.keysym.sym;
if (KeyMap.count(SDLK_key) > 0) {
QueueKeyEvent(KeyEvent(KeyMap.at(SDLK_key), keyEventType));
}
}
};
void KeyPressSim::HandleKeyPresses() {
std::lock_guard lock(mQueueGaurd);
while (!mKeyEventQueue.empty()) {
if (mKeyEventHandler) {
mKeyEventHandler(mKeyEventQueue.front());
}
mKeyEventQueue.pop();
}
};
void KeyPressSim::QueueKeyEvent(KeyEvent aJustOccuredKeyEvent) {
std::lock_guard lock(mQueueGaurd);
mKeyEventQueue.push(aJustOccuredKeyEvent);
};

View File

@ -0,0 +1,59 @@
#include "KeyPressAbstract.hpp"
#include "SDL2/SDL.h"
#include <map>
#include <mutex>
#include <queue>
#include <thread>
class KeyPressSim : public KeyPressAbstract {
public:
static constexpr auto MaxQueueableKeyEvents = 3;
KeyPressSim();
static int GrabKeyImpl(void *aSelf, SDL_Event *aEvent);
void GrabKeys(SDL_Event *aEvent);
void HandleKeyPresses() override;
void QueueKeyEvent(KeyEvent aJustOccuredKeyEvent) override;
private:
std::thread mKeyGrabberThread;
std::thread mKeyHandlerThread;
std::queue<KeyEvent> mKeyEventQueue;
std::mutex mQueueGaurd;
using Key = KeyPressAbstract::KeyId;
static inline const std::map<SDL_Keycode, KeyPressAbstract::KeyId> KeyMap{
{SDLK_p, Key::Power},
// Video Control row
{SDLK_5, Key::Stop},
{SDLK_6, Key::Rewind},
{SDLK_7, Key::Play},
{SDLK_8, Key::FastForward},
// D-Pad
{SDLK_UP, Key::Up},
{SDLK_DOWN, Key::Down},
{SDLK_LEFT, Key::Left},
{SDLK_RIGHT, Key::Right},
{SDLK_SPACE, Key::Center},
// General Keys
{SDLK_h, Key::Menu},
{SDLK_j, Key::Info},
{SDLK_l, Key::Back},
{SDLK_k, Key::Source},
// Volume/ Channel UP and down
{SDLK_w, Key::VolUp},
{SDLK_s, Key::VolDown},
{SDLK_e, Key::ChannelUp},
{SDLK_d, Key::ChannelDown},
// Mute & record
{SDLK_x, Key::Mute},
{SDLK_c, Key::Record},
// Aux Keys
{SDLK_1, Key::Aux1},
{SDLK_2, Key::Aux2},
{SDLK_3, Key::Aux3},
{SDLK_4, Key::Aux4}};
};

View File

@ -0,0 +1,39 @@
#include "SDLDisplay.hpp"
#include "sdl/sdl.h"
#include <string>
std::shared_ptr<SDLDisplay> SDLDisplay::getInstance() {
if (!DisplayAbstract::mInstance) {
DisplayAbstract::mInstance = std::shared_ptr<SDLDisplay>(new SDLDisplay());
}
return std::static_pointer_cast<SDLDisplay>(mInstance);
}
void SDLDisplay::setBrightness(uint8_t brightness) { mBrightness = brightness; }
uint8_t SDLDisplay::getBrightness() { return mBrightness; }
void SDLDisplay::turnOff() {}
void SDLDisplay::flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area,
lv_color_t *color_p) {
sdl_display_flush(disp, area, color_p);
}
void SDLDisplay::screenInput(lv_indev_drv_t *indev_driver,
lv_indev_data_t *data) {
sdl_mouse_read(indev_driver, data);
}
void SDLDisplay::setTitle(std::string aNewTitle) {
SDL_SetWindowTitle(mSimWindow, aNewTitle.c_str());
}
SDLDisplay::SDLDisplay() : DisplayAbstract() {
sdl_init();
// Get the SDL window via an event
SDL_Event aWindowIdFinder;
SDL_PollEvent(&aWindowIdFinder);
mSimWindow = SDL_GetWindowFromID(aWindowIdFinder.window.windowID);
}

View File

@ -0,0 +1,27 @@
#pragma once
#include "DisplayAbstract.h"
#include "SDL2/SDL.h"
#include <stdint.h>
class SDLDisplay : public DisplayAbstract {
public:
static std::shared_ptr<SDLDisplay> getInstance();
virtual void setBrightness(uint8_t brightness) override;
virtual uint8_t getBrightness() override;
virtual void turnOff() override;
void setTitle(std::string aNewTitle);
protected:
virtual void flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area,
lv_color_t *color_p) override;
virtual void screenInput(lv_indev_drv_t *indev_driver,
lv_indev_data_t *data) override;
private:
SDLDisplay();
uint8_t mBrightness;
SDL_Window *mSimWindow;
};

View File

@ -0,0 +1,77 @@
#include "SimulatorMPMCQueue.hpp"
template <typename T>
bool SimulatorMPMCQueue<T>::push(T obj)
{
return this->push(obj, false);
}
template <typename T>
bool SimulatorMPMCQueue<T>::push(T obj, bool overwrite)
{
bool retval = false;
if (this->mtx.try_lock())
{
if (this->isFull() && overwrite)
{
/* If we should overwrite already written data and the buffer is full, we increment the rd_index as well.
This has to be done in the mutex so we do not overwrite data which is already being read*/
this->rd_index = this->incrementIndex(this->rd_index);
}
/* If the buffer is full, we can not write to the buffer. If overwrite is set to true, this check will never
fail as we move the rd_index if the buffer would otherwise be full*/
if (!this->isFull())
{
retval = true;
this->data[this->wr_index] = obj;
this->wr_index = this->incrementIndex(this->wr_index);
}
this->mtx.unlock();
}
return retval;
}
template <typename T>
std::optional<T> SimulatorMPMCQueue<T>::pop()
{
T retval;
if (this->mtx.try_lock()){
if (this->isEmpty())
{
return std::nullopt;
}
retval = this->data[this->rd_index];
this->rd_index = this->incrementIndex(this->rd_index);
this->mtx.unlock();
return retval;
}
return std::nullopt;
}
template <typename T>
std::optional<T> SimulatorMPMCQueue<T>::peek()
{
T retval;
if (this->mtx.try_lock())
{
if (this->isEmpty())
{
return std::nullopt;
}
retval = this->data[this->rd_index];
this->mtx.unlock();
return retval;
}
return std::nullopt;
}
template <typename T>
uint32_t SimulatorMPMCQueue<T>::incrementIndex(uint32_t index)
{
return (index + 1) % this->size;
}

View File

@ -0,0 +1,24 @@
#pragma once
#include "MPMCQueueInterface.hpp"
#include "SimulatorSPSCQueue.hpp"
#include <mutex>
template <typename T>
class SimulatorMPMCQueue: public SimulatorSPSCQueue<T>, public MPMCQueueInterface<T>
{
public:
SimulatorMPMCQueue(uint32_t size): SimulatorSPSCQueue<T>(size){};
bool push (T obj);
bool push (T obj, bool overwrite);
std::optional<T> pop();
std::optional<T> peek();
bool isFull();
bool isEmpty();
private:
T* data;
uint32_t size;
uint32_t rd_index;
uint32_t wr_index;
uint32_t incrementIndex(uint32_t index);
std::mutex mtx;
};

View File

@ -0,0 +1,68 @@
#include "SimulatorSPSCQueue.hpp"
template <typename T>
SimulatorSPSCQueue<T>::SimulatorSPSCQueue(uint32_t size)
{
this->size = size;
this->data = new T[this->size + 1];
this->rd_index = 0;
this->wr_index = 0;
}
template <typename T>
SimulatorSPSCQueue<T>::~SimulatorSPSCQueue()
{
free(this->data);
}
template <typename T>
bool SimulatorSPSCQueue<T>::isFull()
{
return ((this->wr_index + 1) % this->size) == this->rd_index;
}
template <typename T>
bool SimulatorSPSCQueue<T>::isEmpty()
{
return this->rd_index == this->wr_index;
}
template <typename T>
bool SimulatorSPSCQueue<T>::push(T obj)
{
bool retval = false;
if (!this->isFull())
{
retval = true;
this->data[this->wr_index] = obj;
this->wr_index = this->incrementIndex(this->wr_index);
}
return retval;
}
template <typename T>
std::optional<T> SimulatorSPSCQueue<T>::pop()
{
std::optional<T> retval;
retval = this->peek();
this->rd_index = this->incrementIndex(this->rd_index);
return retval;
}
template <typename T>
std::optional<T> SimulatorSPSCQueue<T>::peek()
{
if (this->isEmpty())
{
return std::nullopt;
}
return this->data[this->rd_index];
}
template <typename T>
uint32_t SimulatorSPSCQueue<T>::incrementIndex(uint32_t index)
{
return (index + 1) % this->size;
}

View File

@ -0,0 +1,22 @@
#pragma once
#include "SPSCQueueInterface.hpp"
#include <cstdint>
template <typename T>
class SimulatorSPSCQueue: public SPSCQueueInterface<T>
{
public:
SimulatorSPSCQueue(uint32_t size);
~SimulatorSPSCQueue();
bool push (T obj);
std::optional<T> pop();
std::optional<T> peek();
bool isFull();
bool isEmpty();
private:
T* data;
uint32_t size;
uint32_t rd_index;
uint32_t wr_index;
uint32_t incrementIndex(uint32_t index);
};

View File

@ -0,0 +1,23 @@
#include "BatteryInterface.h"
#include <chrono>
#include <cmath>
class BatterySimulator: public BatteryInterface{
public:
BatterySimulator() :
mCreationTime(std::chrono::high_resolution_clock::now())
{};
~BatterySimulator(){}
virtual int getPercentage() override {
auto now = std::chrono::high_resolution_clock::now();
auto batteryRunTime = std::chrono::duration_cast<std::chrono::seconds>(now - mCreationTime);
constexpr auto minToBatteryZero = 3;
auto fakeBattPercentage = 100 - ((batteryRunTime / std::chrono::duration<float,std::ratio<60LL>>(minToBatteryZero)) * 100);
return std::floor(fakeBattPercentage < 100 ? fakeBattPercentage : 0);
}
virtual bool isCharging() override { return false; }
private:
std::chrono::_V2::system_clock::time_point mCreationTime;
};

View File

@ -0,0 +1,3 @@
#pragma once
#define IS_SIMULATOR true

View File

@ -0,0 +1,35 @@
#include "wifiHandlerSim.hpp"
using WifiInfo = wifiHandlerInterface::WifiInfo;
wifiHandlerSim::wifiHandlerSim() {}
void wifiHandlerSim::begin() {}
void wifiHandlerSim::connect(std::string ssid, std::string password) {
if (mFakeStatusThread.joinable()) {
mFakeStatusThread.join();
mCurrentStatus.ssid = ssid;
mCurrentStatus.isConnected = true;
mFakeStatusThread = std::thread([this] {
std::this_thread::sleep_for(std::chrono::seconds(1));
mStatusUpdate->notify(mCurrentStatus);
});
}
}
static const WifiInfo wifis[] = {
WifiInfo("High Signal Wifi", -49), WifiInfo("Mid Signal Wifi", -55),
WifiInfo("Low Signal Wifi", -65), WifiInfo("No Signal Wifi", -90)};
void wifiHandlerSim::scan() {
if (mFakeScanThread.joinable()) {
mFakeScanThread.join();
mFakeScanThread = std::thread([this] {
std::vector<WifiInfo> info =
std::vector(std::begin(wifis), std::end(wifis));
std::this_thread::sleep_for(std::chrono::seconds(2));
mScanNotification->notify(info);
});
}
}

View File

@ -0,0 +1,21 @@
#pragma once
#include "Notification.hpp"
#include "wifiHandlerInterface.h"
#include <atomic>
#include <memory>
#include <thread>
class wifiHandlerSim : public wifiHandlerInterface {
public:
wifiHandlerSim();
void begin() override;
void scan() override;
void connect(std::string ssid, std::string password) override;
wifiStatus GetStatus() override { return mCurrentStatus; };
private:
std::thread mFakeScanThread = std::thread([] {});
std::thread mFakeStatusThread = std::thread([] {});
wifiStatus mCurrentStatus = wifiStatus(true, "172.0.0.1", "FakeNet");
};

View File

@ -0,0 +1,534 @@
#include "OmoteUI.hpp"
#include "lvgl.h"
#include "omoteconfig.h"
#include <functional>
using namespace UI::Basic;
std::shared_ptr<OmoteUI> OmoteUI::mInstance = nullptr;
// This can be used to flag out specific code for SIM only
// #if defined(IS_SIMULATOR) && (IS_SIMULATOR == true)
// #endif
OmoteUI::OmoteUI(std::shared_ptr<HardwareAbstract> aHardware)
: UIBase(aHardware) {}
// Set the page indicator scroll position relative to the tabview scroll
// position
void OmoteUI::store_scroll_value_event_cb(lv_event_t *e) {
float bias = (150.0 + 8.0) / 240.0;
int offset = 240 / 2 - 150 / 2 - 8 - 50 - 3;
lv_obj_t *screen = lv_event_get_target(e);
lv_obj_scroll_to_x(panel, lv_obj_get_scroll_x(screen) * bias - offset,
LV_ANIM_OFF);
}
// Update current device when the tabview page is changes
void OmoteUI::tabview_device_event_cb(lv_event_t *e) {
currentDevice = lv_tabview_get_tab_act(lv_event_get_target(e));
this->mHardware->setCurrentDevice(currentDevice);
}
// Slider Event handler
void OmoteUI::bl_slider_event_cb(lv_event_t *e) {
lv_obj_t *slider = lv_event_get_target(e);
auto newBrightness = std::clamp(lv_slider_get_value(slider), 60, 255);
mHardware->display()->setBrightness(newBrightness);
}
// Apple Key Event handler
void OmoteUI::appleKey_event_cb(lv_event_t *e) {
// Send IR command based on the event user data
// mHardware->debugPrint(std::to_string(50 + (int)e->user_data));
}
// Wakeup by IMU Switch Event handler
void OmoteUI::WakeEnableSetting_event_cb(lv_event_t *e) {
this->mHardware->setWakeupByIMUEnabled(
lv_obj_has_state(lv_event_get_target(e), LV_STATE_CHECKED));
}
// Wakeup timeout dropdown Event handler
void OmoteUI::wakeTimeoutSetting_event_cb(lv_event_t *e) {
lv_obj_t *drop = lv_event_get_target(e);
int sleepTimeout = sleepTimeoutMap[lv_dropdown_get_selected(drop)];
mHardware->setSleepTimeout(sleepTimeout);
}
// Smart Home Toggle Event handler
void OmoteUI::smartHomeToggle_event_cb(lv_event_t *e) {
char payload[8];
if (lv_obj_has_state(lv_event_get_target(e), LV_STATE_CHECKED))
strcpy(payload, "true");
else
strcpy(payload, "false");
// Publish an MQTT message based on the event user data
// if ((int)e->user_data == 1)
// mHardware->MQTTPublish("bulb1_set", payload);
// if ((int)e->user_data == 2)
// mHardware->MQTTPublish("bulb2_set", payload);
}
// Smart Home Toggle Event handler
void OmoteUI::smartHomeSlider_event_cb(lv_event_t *e) {
lv_obj_t *slider = lv_event_get_target(e);
char payload[8];
auto sliderValue = lv_slider_get_value(slider);
// TODO convert this dtostrf to somethign more portable.
// I gave it a stab here but not sure it is the same.
// dtostrf(lv_slider_get_value(slider), 1, 2, payload);
snprintf(payload, sizeof(payload), "%8.2f", sliderValue);
// Publish an MQTT message based on the event user data
// if ((int)e->user_data == 1)
// mHardware->MQTTPublish("bulb1_setbrightness", payload);
// if ((int)e->user_data == 2)
// mHardware->MQTTPublish("bulb2_setbrightness", payload);
}
void OmoteUI::virtualKeypad_event_cb(lv_event_t *e) {
lv_obj_t *target = lv_event_get_target(e);
lv_obj_t *cont = lv_event_get_current_target(e);
if (target == cont)
return;
char buffer[100];
// sprintf(buffer, "check it out: %d\n",
// virtualKeyMapTechnisat[(int)target->user_data]);
// mHardware->debugPrint(buffer);
}
void OmoteUI::loopHandler() {
lv_timer_handler();
lv_task_handler();
}
void OmoteUI::create_status_bar() {
// Create a status bar
lv_obj_t *statusbar = lv_btn_create(lv_scr_act());
lv_obj_set_size(statusbar, 240, 20);
lv_obj_set_style_shadow_width(statusbar, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(statusbar, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_radius(statusbar, 0, LV_PART_MAIN);
lv_obj_align(statusbar, LV_ALIGN_TOP_MID, 0, 0);
this->WifiLabel = lv_label_create(statusbar);
lv_label_set_text(this->WifiLabel, "");
lv_obj_align(this->WifiLabel, LV_ALIGN_LEFT_MID, -8, 0);
lv_obj_set_style_text_font(this->WifiLabel, &lv_font_montserrat_12,
LV_PART_MAIN);
this->objBattPercentage = lv_label_create(statusbar);
lv_label_set_text(this->objBattPercentage, "");
lv_obj_align(this->objBattPercentage, LV_ALIGN_RIGHT_MID, -16, 0);
lv_obj_set_style_text_font(this->objBattPercentage, &lv_font_montserrat_12,
LV_PART_MAIN);
this->objBattIcon = lv_label_create(statusbar);
lv_label_set_text(this->objBattIcon, LV_SYMBOL_BATTERY_EMPTY);
lv_obj_align(this->objBattIcon, LV_ALIGN_RIGHT_MID, 8, 0);
lv_obj_set_style_text_font(this->objBattIcon, &lv_font_montserrat_16,
LV_PART_MAIN);
batteryPoller = std::make_unique<poller>(
[&batteryIcon = objBattIcon, battery = mHardware->battery()]() {
auto percent = battery->getPercentage();
if (percent > 95)
lv_label_set_text(batteryIcon, LV_SYMBOL_BATTERY_FULL);
else if (percent > 75)
lv_label_set_text(batteryIcon, LV_SYMBOL_BATTERY_3);
else if (percent > 50)
lv_label_set_text(batteryIcon, LV_SYMBOL_BATTERY_2);
else if (percent > 25)
lv_label_set_text(batteryIcon, LV_SYMBOL_BATTERY_1);
else
lv_label_set_text(batteryIcon, LV_SYMBOL_BATTERY_EMPTY);
});
}
void OmoteUI::setup_settings(lv_obj_t *parent) {
// Add content to the settings tab
// With a flex layout, setting groups/boxes will position themselves
// automatically
lv_obj_set_layout(parent, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(parent, LV_SCROLLBAR_MODE_ACTIVE);
// Add a label, then a box for the display settings
this->settingsMenu = lv_menu_create(parent);
lv_obj_set_width(this->settingsMenu, 210);
/* Create main page for settings this->settingsMenu*/
this->settingsMainPage = lv_menu_page_create(this->settingsMenu, NULL);
lv_obj_t *cont = lv_menu_cont_create(this->settingsMainPage);
lv_obj_set_layout(cont, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_ACTIVE);
// lv_obj_set_width(cont, lv_obj_get_width(parent));
this->display_settings(cont);
this->create_wifi_settings(this->settingsMenu, cont);
// Another setting for the battery
lv_obj_t *menuLabel = lv_label_create(cont);
lv_label_set_text(menuLabel, "Battery");
lv_obj_t *menuBox = lv_obj_create(cont);
lv_obj_set_size(menuBox, lv_pct(100), 125);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
lv_menu_set_page(this->settingsMenu, this->settingsMainPage);
}
void OmoteUI::ta_kb_event_cb(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *ta = lv_event_get_target(e);
lv_obj_t *kb = (lv_obj_t *)lv_event_get_user_data(e);
switch (code) {
case LV_EVENT_FOCUSED:
lv_keyboard_set_textarea(kb, ta);
lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
lv_obj_move_foreground(kb);
break;
case LV_EVENT_DEFOCUSED:
lv_keyboard_set_textarea(kb, NULL);
lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
break;
default:
break;
}
}
void OmoteUI::create_keyboard() {
this->kb = lv_keyboard_create(lv_scr_act());
lv_obj_add_flag(this->kb, LV_OBJ_FLAG_HIDDEN);
lv_obj_set_y(this->kb, 0);
}
void OmoteUI::hide_keyboard() { lv_obj_add_flag(this->kb, LV_OBJ_FLAG_HIDDEN); }
void OmoteUI::reset_settings_menu() {
lv_menu_set_page(this->settingsMenu, this->settingsMainPage);
}
void OmoteUI::attach_keyboard(lv_obj_t *textarea) {
if (this->kb == NULL) {
this->create_keyboard();
}
lv_keyboard_set_textarea(this->kb, textarea);
lv_obj_add_event_cb(
textarea, [](lv_event_t *e) { mInstance->ta_kb_event_cb(e); },
LV_EVENT_FOCUSED, this->kb);
lv_obj_add_event_cb(
textarea, [](lv_event_t *e) { mInstance->ta_kb_event_cb(e); },
LV_EVENT_DEFOCUSED, this->kb);
}
void OmoteUI::layout_UI() {
// Set the background color
lv_obj_set_style_bg_color(lv_scr_act(), lv_color_black(), LV_PART_MAIN);
this->create_keyboard();
// Setup a scrollable tabview for devices and settings
lv_obj_t *tabview;
tabview =
lv_tabview_create(lv_scr_act(), LV_DIR_TOP,
0); // Hide tab labels by setting their height to 0
lv_obj_set_style_bg_color(tabview, lv_color_black(), LV_PART_MAIN);
lv_obj_set_size(tabview, SCREEN_WIDTH,
270); // 270 = screenHeight(320) - panel(30) - statusbar(20)
lv_obj_align(tabview, LV_ALIGN_TOP_MID, 0, 20);
// Add 4 tabs (names are irrelevant since the labels are hidden)
lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Settings");
lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Technisat");
lv_obj_t *tab3 = lv_tabview_add_tab(tabview, "Apple TV");
lv_obj_t *tab4 = lv_tabview_add_tab(tabview, "Smart Home");
// Configure number button grid
static lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST}; // equal x distribution
static lv_coord_t row_dsc[] = {
52, 52, 52, 52, LV_GRID_TEMPLATE_LAST}; // manual y distribution to
// compress the grid a bit
// Create a container with grid for tab2
lv_obj_set_style_pad_all(tab2, 0, LV_PART_MAIN);
lv_obj_t *cont = lv_obj_create(tab2);
lv_obj_set_style_shadow_width(cont, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(cont, lv_color_black(), LV_PART_MAIN);
lv_obj_set_style_border_width(cont, 0, LV_PART_MAIN);
lv_obj_set_style_grid_column_dsc_array(cont, col_dsc, 0);
lv_obj_set_style_grid_row_dsc_array(cont, row_dsc, 0);
lv_obj_set_size(cont, 240, 270);
lv_obj_set_layout(cont, LV_LAYOUT_GRID);
lv_obj_align(cont, LV_ALIGN_TOP_MID, 0, 0);
lv_obj_set_style_radius(cont, 0, LV_PART_MAIN);
lv_obj_t *buttonLabel;
lv_obj_t *obj;
// Iterate through grid buttons configure them
for (int i = 0; i < 12; i++) {
uint8_t col = i % 3;
uint8_t row = i / 3;
// Create the button object
if ((row == 3) && ((col == 0) || (col == 2)))
continue; // Do not create a complete fourth row, only a 0 button
obj = lv_btn_create(cont);
lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
LV_GRID_ALIGN_STRETCH, row, 1);
lv_obj_set_style_bg_color(obj, this->color_primary, LV_PART_MAIN);
lv_obj_set_style_radius(obj, 14, LV_PART_MAIN);
lv_obj_set_style_shadow_color(obj, lv_color_hex(0x404040), LV_PART_MAIN);
lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE); // Clicking a button causes
// a event in its container
// Create Labels for each button
buttonLabel = lv_label_create(obj);
if (i < 9) {
lv_label_set_text_fmt(buttonLabel, std::to_string(i + 1).c_str(), col,
row);
lv_obj_set_user_data(obj,
(void *)i); // Add user data so we can identify which
// button caused the container event
} else {
lv_label_set_text_fmt(buttonLabel, "0", col, row);
lv_obj_set_user_data(obj, (void *)9);
}
lv_obj_set_style_text_font(buttonLabel, &lv_font_montserrat_24,
LV_PART_MAIN);
lv_obj_center(buttonLabel);
}
// Create a shared event for all button inside container
lv_obj_add_event_cb(
cont, [](lv_event_t *e) { mInstance->virtualKeypad_event_cb(e); },
LV_EVENT_CLICKED, NULL);
// Add content to the Apple TV tab (3)
// Add a nice apple tv logo
lv_obj_t *appleImg = imgs.addAppleTVIcon(tab3);
// create two buttons and add their icons accordingly
lv_obj_t *button = lv_btn_create(tab3);
lv_obj_align(button, LV_ALIGN_BOTTOM_LEFT, 10, 0);
lv_obj_set_size(button, 60, 60);
lv_obj_set_style_radius(button, 30, LV_PART_MAIN);
lv_obj_set_style_bg_color(button, color_primary, LV_PART_MAIN);
lv_obj_add_event_cb(
button, [](lv_event_t *e) { mInstance->appleKey_event_cb(e); },
LV_EVENT_CLICKED, (void *)1);
appleImg = imgs.addAppleDisplayImage(button);
lv_obj_align(appleImg, LV_ALIGN_CENTER, -3, 0);
lv_obj_set_style_img_recolor(appleImg, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(appleImg, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(appleImg, LV_ALIGN_CENTER, -3, 0);
button = lv_btn_create(tab3);
lv_obj_align(button, LV_ALIGN_BOTTOM_RIGHT, -10, 0);
lv_obj_set_size(button, 60, 60);
lv_obj_set_style_radius(button, 30, LV_PART_MAIN);
lv_obj_set_style_bg_color(button, color_primary, LV_PART_MAIN);
lv_obj_add_event_cb(
button, [](lv_event_t *e) { mInstance->appleKey_event_cb(e); },
LV_EVENT_CLICKED, (void *)2);
appleImg = imgs.addAppleDisplayImage(button);
lv_obj_align(appleImg, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_img_recolor(appleImg, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_img_recolor_opa(appleImg, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_align(appleImg, LV_ALIGN_CENTER, 0, 0);
this->setup_settings(tab1);
// Add content to the smart home tab (4)
lv_obj_set_layout(tab4, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(tab4, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(tab4, LV_SCROLLBAR_MODE_ACTIVE);
// Add a label, then a box for the light controls
lv_obj_t *menuLabel = lv_label_create(tab4);
lv_label_set_text(menuLabel, "Living Room");
lv_obj_t *menuBox = lv_obj_create(tab4);
lv_obj_set_size(menuBox, lv_pct(100), 79);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
lv_obj_t *bulbIcon = imgs.addLightBulbIcon(menuBox);
lv_obj_align(bulbIcon, LV_ALIGN_TOP_LEFT, 0, 0);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Floor Lamp");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 22, 3);
lv_obj_t *lightToggleA = lv_switch_create(menuBox);
lv_obj_set_size(lightToggleA, 40, 22);
lv_obj_align(lightToggleA, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_set_style_bg_color(lightToggleA, lv_color_lighten(color_primary, 50),
LV_PART_MAIN);
lv_obj_set_style_bg_color(lightToggleA, color_primary, LV_PART_INDICATOR);
lv_obj_add_event_cb(
lightToggleA,
[](lv_event_t *e) { mInstance->smartHomeToggle_event_cb(e); },
LV_EVENT_VALUE_CHANGED, (void *)1);
lv_obj_t *slider = lv_slider_create(menuBox);
lv_slider_set_range(slider, 0, 100);
lv_obj_set_style_bg_color(slider, lv_color_lighten(lv_color_black(), 30),
LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_color(
slider, lv_color_lighten(lv_palette_main(LV_PALETTE_AMBER), 180),
LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_dir(slider, LV_GRAD_DIR_HOR, LV_PART_INDICATOR);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider, 255, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_lighten(color_primary, 50),
LV_PART_MAIN);
lv_slider_set_value(slider, 255, LV_ANIM_OFF);
lv_obj_set_size(slider, lv_pct(90), 10);
lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 37);
lv_obj_add_event_cb(
slider, [](lv_event_t *e) { mInstance->smartHomeSlider_event_cb(e); },
LV_EVENT_VALUE_CHANGED, (void *)1);
// Add another this->settingsMenu box for a second appliance
menuBox = lv_obj_create(tab4);
lv_obj_set_size(menuBox, lv_pct(100), 79);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
bulbIcon = imgs.addLightBulbIcon(menuBox);
lv_obj_align(bulbIcon, LV_ALIGN_TOP_LEFT, 0, 0);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Ceiling Light");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 22, 3);
lv_obj_t *lightToggleB = lv_switch_create(menuBox);
lv_obj_set_size(lightToggleB, 40, 22);
lv_obj_align(lightToggleB, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_set_style_bg_color(lightToggleB, lv_color_lighten(color_primary, 50),
LV_PART_MAIN);
lv_obj_set_style_bg_color(lightToggleB, color_primary, LV_PART_INDICATOR);
lv_obj_add_event_cb(
lightToggleB,
[](lv_event_t *e) { mInstance->smartHomeToggle_event_cb(e); },
LV_EVENT_VALUE_CHANGED, (void *)2);
slider = lv_slider_create(menuBox);
lv_slider_set_range(slider, 0, 100);
lv_obj_set_style_bg_color(slider, lv_color_lighten(lv_color_black(), 30),
LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_color(
slider, lv_color_lighten(lv_palette_main(LV_PALETTE_AMBER), 180),
LV_PART_INDICATOR);
lv_obj_set_style_bg_grad_dir(slider, LV_GRAD_DIR_HOR, LV_PART_INDICATOR);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider, 255, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_lighten(color_primary, 50),
LV_PART_MAIN);
lv_slider_set_value(slider, 255, LV_ANIM_OFF);
lv_obj_set_size(slider, lv_pct(90), 10);
lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 37);
lv_obj_add_event_cb(
slider, [](lv_event_t *e) { mInstance->smartHomeSlider_event_cb(e); },
LV_EVENT_VALUE_CHANGED, (void *)2);
// Add another room (empty for now)
menuLabel = lv_label_create(tab4);
lv_label_set_text(menuLabel, "Kitchen");
menuBox = lv_obj_create(tab4);
lv_obj_set_size(menuBox, lv_pct(100), 79);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
// Set current page according to the current Device
currentDevice = this->mHardware->getCurrentDevice();
lv_tabview_set_act(tabview, currentDevice, LV_ANIM_OFF);
// Create a page indicator
panel = lv_obj_create(lv_scr_act());
lv_obj_clear_flag(
panel, LV_OBJ_FLAG_CLICKABLE); // This indicator will not be clickable
lv_obj_set_size(panel, SCREEN_WIDTH, 30);
lv_obj_set_flex_flow(panel, LV_FLEX_FLOW_ROW);
lv_obj_align(panel, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_scrollbar_mode(panel, LV_SCROLLBAR_MODE_OFF);
// This small hidden button enables the page indicator to scroll further
lv_obj_t *btn = lv_btn_create(panel);
lv_obj_set_size(btn, 50, lv_pct(100));
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_opa(btn, LV_OPA_TRANSP, LV_PART_MAIN);
// Create actual (non-clickable) buttons for every tab
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
lv_obj_t *label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Settings");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Technisat");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Apple TV");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
btn = lv_btn_create(panel);
lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(btn, 150, lv_pct(100));
label = lv_label_create(btn);
lv_label_set_text_fmt(label, "Smart Home");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN);
// This small hidden button enables the page indicator to scroll further
btn = lv_btn_create(panel);
lv_obj_set_size(btn, 50, lv_pct(100));
lv_obj_set_style_shadow_width(btn, 0, LV_PART_MAIN);
lv_obj_set_style_opa(btn, LV_OPA_TRANSP, LV_PART_MAIN);
// Make the indicator scroll together with the tabs by creating a scroll event
lv_obj_add_event_cb(
lv_tabview_get_content(tabview),
[](lv_event_t *e) { mInstance->store_scroll_value_event_cb(e); },
LV_EVENT_SCROLL, NULL);
lv_obj_add_event_cb(
tabview, [](lv_event_t *e) { mInstance->tabview_device_event_cb(e); },
LV_EVENT_VALUE_CHANGED, NULL);
// Initialize scroll position for the indicator
lv_event_send(lv_tabview_get_content(tabview), LV_EVENT_SCROLL, NULL);
// Style the panel background
static lv_style_t style_btn;
lv_style_init(&style_btn);
lv_style_set_pad_all(&style_btn, 3);
lv_style_set_border_width(&style_btn, 0);
lv_style_set_bg_opa(&style_btn, LV_OPA_TRANSP);
lv_obj_add_style(panel, &style_btn, 0);
// Make the indicator fade out at the sides using gradient bitmaps
lv_obj_t *img1 = imgs.addLeftGradiant(lv_scr_act());
lv_obj_align(img1, LV_ALIGN_BOTTOM_LEFT, 0, 0);
lv_obj_set_size(img1, 30, 30); // stretch the 1-pixel high image to 30px
lv_obj_t *img2 = imgs.addRightGradiant(lv_scr_act());
lv_obj_align(img2, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_set_size(img2, 30, 30);
this->create_status_bar();
this->mHardware->wifi()->begin();
}

View File

@ -0,0 +1,250 @@
// OMOTE UI
// 2023 Matthew Colvin
#pragma once
#include "Images.hpp"
#include "UIBase.hpp"
#include "lvgl.h"
#include "poller.hpp"
#include <algorithm>
#include <memory>
#include <stdio.h>
#include <string>
namespace UI::Basic {
/// @brief Singleton to allow UI code to live separately from the Initialization
/// of resources.
class OmoteUI : public UIBase {
public:
OmoteUI(std::shared_ptr<HardwareAbstract> aHardware);
static std::weak_ptr<OmoteUI> getRefrence() { return getInstance(); };
static std::shared_ptr<OmoteUI>
getInstance(std::shared_ptr<HardwareAbstract> aHardware = nullptr) {
if (mInstance) {
return mInstance;
} else if (aHardware) {
mInstance = std::make_shared<OmoteUI>(aHardware);
}
return mInstance;
};
// Set the page indicator scroll position relative to the tabview scroll
// position
void store_scroll_value_event_cb(lv_event_t *e);
// Update current device when the tabview page is changes
void tabview_device_event_cb(lv_event_t *e);
// Update wake timeout handler
void wakeTimeoutSetting_event_cb(lv_event_t *e);
// Slider Event handler
void bl_slider_event_cb(lv_event_t *e);
// Apple Key Event handler
void appleKey_event_cb(lv_event_t *e);
// Wakeup by IMU Switch Event handler
void WakeEnableSetting_event_cb(lv_event_t *e);
// Smart Home Toggle Event handler
void smartHomeToggle_event_cb(lv_event_t *e);
// Smart Home Toggle Event handler
void smartHomeSlider_event_cb(lv_event_t *e);
// Virtual Keypad Event handler
void virtualKeypad_event_cb(lv_event_t *e);
void wifi_settings_cb(lv_event_t *event);
void connect_btn_cb(lv_event_t *event);
void password_field_event_cb(lv_event_t *e);
// Use LVGL to layout the ui and register the callbacks
void layout_UI();
void ta_kb_event_cb(lv_event_t *e);
void wifi_scan_done(std::shared_ptr<std::vector<WifiInfo>> info);
void loopHandler();
/**
* @brief Function to hide the keyboard. If the keyboard is attached to a text
* area, it will be hidden when the text area is defocused. This function can
* be used if the keyboard need to be hidden due to some script event.
*
*/
void hide_keyboard();
/**
* @brief Function to show the keyboard. If a text area needs the keybaord, it
* should be attached to the text area using the approbiate function. The
* keyboard will then show up when the text area is focused. This function is
* needed if the keyboard should be shown due to some script or other trigger.
*
*/
void show_keyboard();
private:
static std::shared_ptr<OmoteUI> mInstance;
std::unique_ptr<poller> batteryPoller;
int sleepTimeoutMap[5] = {10000,30000,60000,180000,600000};
void reset_settings_menu();
void attach_keyboard(lv_obj_t *textarea);
std::shared_ptr<std::vector<WifiInfo>> found_wifi_networks;
/**
* @brief Keyboard object used whenever a keyboard is needed.
*
*/
lv_obj_t *kb;
/**
* @brief Function to create the keyboard object which can then be attached to
* different text areas.
*
*/
void create_keyboard();
/**
* @brief Set the up settings object
*
* @param parent
*/
void setup_settings(lv_obj_t *parent);
/**
* @brief LVGL Menu for settings pages as needed.
*
*/
lv_obj_t *settingsMenu;
/**
* @brief Main page of the settings menu
*
*/
lv_obj_t *settingsMainPage;
/**
* @brief Battery percentage label
*
*/
lv_obj_t *objBattPercentage;
/**
* @brief Battery icon object in the status bar
*
*/
lv_obj_t *objBattIcon;
void create_status_bar();
lv_obj_t *panel = nullptr;
Images imgs = Images();
uint_fast8_t currentDevice = 4;
lv_color_t color_primary = lv_color_hex(0x303030); // gray
inline static const uint_fast8_t virtualKeyMapTechnisat[10] = {
0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0};
/************************************** WIFI Settings Menu
* *******************************************************/
/**
* @brief Container within the wifi selection page
*/
lv_obj_t *wifi_setting_cont;
/**
* @brief Wifi settings entry point on the settings tab
*
*/
lv_obj_t *wifiOverview;
/**
* @brief Label in the wifi password page. This label is updated with the
* selected SSID when the credentials for a wifi network is entered.
*
*/
lv_obj_t *wifi_password_label;
/**
* @brief Menu Subpage for the wifi password
*/
lv_obj_t *wifi_password_page;
/**
* @brief Menu Subpage for wifi selection
*/
lv_obj_t *wifi_selection_page;
/**
* @brief Wifi Label shown in the top status bar
*/
lv_obj_t *WifiLabel;
/**
* @brief Number of wifi subpage needed to display the found wifi networks
*
*/
unsigned int no_subpages;
/**
* @brief number of wifi networks found
*
*/
unsigned int no_wifi_networks;
void wifi_status(std::shared_ptr<wifiStatus> status);
/**
* @brief callback function to get next wifi subpage. This callback can be
* used to get the next or previous page
*
* @param e lvgl event object
*/
void next_wifi_selection_subpage(lv_event_t *e);
/**
* @brief Create a wifi selection sub page object
*
* @param menu LVGL Menu where the sub page should be added to
* @return lv_obj_t* Menu sub page object pointer
*/
lv_obj_t *create_wifi_selection_page(lv_obj_t *menu);
/**
* @brief Method to create the wifi password sub page
*
* @param menu Menu where the sub page should be created
* @return lv_obj_t* menu sub page object pointer
*/
lv_obj_t *create_wifi_password_page(lv_obj_t *menu);
/**
* @brief Method to create the wifi settings on the main page
*
* @param parent lv object parent where the main settings page should be
* added to
*/
void create_wifi_main_page(lv_obj_t *parent);
/**
* @brief Method to create wifi settings. This method will call the
* create_wifi_selection_page, the create_wifi_password_page, and the
* create_wifi_main_page
*
* @param menu Settings menu where the sub pages should be added to
* @param parent lv object parent where the main settings page should be
* added to
*/
void create_wifi_settings(lv_obj_t *menu, lv_obj_t *parent);
/**
* @brief Function to update the wifi selection sub page
*
* @param page index of the page to display
*/
void update_wifi_selection_subpage(int page);
/**
* @brief Function to create the display settings page.
*
* @param parent LVGL object acting as a parent for the display settings page
*/
void display_settings(lv_obj_t *parent);
};
} // namespace UI::Basic

View File

@ -0,0 +1,78 @@
#include "OmoteUI.hpp"
using namespace UI::Basic;
void OmoteUI::display_settings(lv_obj_t *parent) {
lv_obj_t *menuLabel = lv_label_create(parent);
lv_label_set_text(menuLabel, "Display");
lv_obj_t *menuBox = lv_obj_create(parent);
lv_obj_set_size(menuBox, lv_pct(100), 109);
lv_obj_set_style_bg_color(menuBox, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(menuBox, 0, LV_PART_MAIN);
lv_obj_t *brightnessIcon = imgs.addLowBrightnessIcon(menuBox);
lv_obj_align(brightnessIcon, LV_ALIGN_TOP_LEFT, 0, 0);
lv_obj_t *slider = lv_slider_create(menuBox);
lv_slider_set_range(slider, 0, 255);
lv_obj_set_style_bg_color(slider, lv_color_white(), LV_PART_KNOB);
lv_obj_set_style_bg_opa(slider, LV_OPA_COVER, LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_lighten(color_primary, 50),
LV_PART_MAIN);
lv_slider_set_value(slider, mHardware->display()->getBrightness(),
LV_ANIM_OFF);
lv_obj_set_size(slider, lv_pct(66), 10);
lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 3);
brightnessIcon = imgs.addHighBrightnessIcon(menuBox);
lv_obj_align(brightnessIcon, LV_ALIGN_TOP_RIGHT, 0, -1);
lv_obj_add_event_cb(
slider, [](lv_event_t *e) { mInstance->bl_slider_event_cb(e); },
LV_EVENT_VALUE_CHANGED, nullptr);
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Lift to Wake");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 0, 32);
lv_obj_t *wakeToggle = lv_switch_create(menuBox);
lv_obj_set_size(wakeToggle, 40, 22);
lv_obj_align(wakeToggle, LV_ALIGN_TOP_RIGHT, 0, 29);
lv_obj_set_style_bg_color(wakeToggle, lv_color_hex(0x505050), LV_PART_MAIN);
lv_obj_add_event_cb(
wakeToggle,
[](lv_event_t *e) { mInstance->WakeEnableSetting_event_cb(e); },
LV_EVENT_VALUE_CHANGED, NULL);
if (mHardware->getWakeupByIMUEnabled())
lv_obj_add_state(wakeToggle, LV_STATE_CHECKED); // set default state
menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Timeout");
lv_obj_align(menuLabel, LV_ALIGN_TOP_LEFT, 0, 64);
lv_obj_t *drop = lv_dropdown_create(menuBox);
lv_dropdown_set_options(drop, "10s\n"
"30s\n"
"1m\n"
"3m");
lv_obj_align(drop, LV_ALIGN_TOP_RIGHT, 0, 61);
lv_obj_set_size(drop, 70, 22);
// lv_obj_set_style_text_font(drop, &lv_font_montserrat_12, LV_PART_MAIN);
// lv_obj_set_style_text_font(lv_dropdown_get_list(drop),
// &lv_font_montserrat_12, LV_PART_MAIN);
lv_obj_set_style_pad_top(drop, 1, LV_PART_MAIN);
lv_obj_set_style_bg_color(drop, color_primary, LV_PART_MAIN);
lv_obj_set_style_bg_color(lv_dropdown_get_list(drop), color_primary,
LV_PART_MAIN);
lv_obj_set_style_border_width(lv_dropdown_get_list(drop), 1, LV_PART_MAIN);
lv_obj_set_style_border_color(lv_dropdown_get_list(drop),
lv_color_hex(0x505050), LV_PART_MAIN);
int sleepTimeoutMapSize =
sizeof(sleepTimeoutMap) / sizeof(sleepTimeoutMap[0]);
int currentTimeout = mHardware->getSleepTimeout();
for (int i = 0; i < sleepTimeoutMapSize; i++) {
if (currentTimeout == sleepTimeoutMap[i])
lv_dropdown_set_selected(drop, i);
}
lv_obj_add_event_cb(
drop, [](lv_event_t *e) { mInstance->wakeTimeoutSetting_event_cb(e); },
LV_EVENT_VALUE_CHANGED, NULL);
}

View File

@ -0,0 +1,314 @@
#include "OmoteUI.hpp"
#define WIFI_SUBPAGE_SIZE 3
static char* ssid;
using namespace UI::Basic;
lv_obj_t* OmoteUI::create_wifi_selection_page(lv_obj_t* menu)
{
/* Create sub page for wifi*/
lv_obj_t* subpage = lv_menu_page_create(menu, NULL);
this->wifi_setting_cont = lv_menu_cont_create(subpage);
lv_obj_set_layout(this->wifi_setting_cont, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(this->wifi_setting_cont, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(this->wifi_setting_cont, LV_SCROLLBAR_MODE_ACTIVE);
lv_obj_t* menuLabel = lv_label_create(this->wifi_setting_cont);
lv_label_set_text(menuLabel, "Searching for wifi networks");
return subpage;
}
/**
* @brief Callback function for the show password checkbox. Checking the box will show the password while unchecked the
* password will be shown as dots.
*
* @param e Pointer to event object for the event where this callback is called
*/
static void show_password_cb(lv_event_t* e)
{
lv_obj_t* password_field = (lv_obj_t*) e->user_data;
if (lv_obj_has_state(e->target, LV_STATE_CHECKED)){
lv_textarea_set_password_mode(password_field, false);
}
else{
lv_textarea_set_password_mode(password_field, true);
}
}
/**
* @brief Textarea callback function for the password field. In case the enter key is pressed in the text area, the
* function will try to connect to the network with the provided password.
*
* @param e Pointer to event object for the event where this callback is called
*/
void OmoteUI::password_field_event_cb(lv_event_t* e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * ta = lv_event_get_target(e);
lv_obj_t * kb = (lv_obj_t*) lv_event_get_user_data(e);
const char* password = lv_textarea_get_text(ta);
switch(code){
case LV_EVENT_READY:
this->mHardware->wifi()->connect(std::make_shared<std::string>(std::string(ssid)), std::make_shared<std::string>(std::string(password)));
lv_obj_clear_state(ta, LV_STATE_FOCUSED);
this->hide_keyboard();
this->reset_settings_menu();
/* Fall through on purpose. Pressing enter should disable the keyboard as well*/
default:
break;
}
}
/**
* @brief Callback which is triggered when clicking the connect button. It triggers the wifi connection.
*
* @param event Pointer to event object for the event where this callback is called
*/
void OmoteUI::connect_btn_cb(lv_event_t* event)
{
lv_obj_t* ta = (lv_obj_t*) event->user_data;
const char* password = lv_textarea_get_text(ta);
this->mHardware->wifi()->connect(std::make_shared<std::string>(std::string(ssid)), std::make_shared<std::string>(std::string(password)));
//Trigger wifi connection here
//wifihandler.connect(ssid, password);
lv_obj_clear_state(ta, LV_STATE_FOCUSED);
this->hide_keyboard();
this->reset_settings_menu();
}
void OmoteUI::create_wifi_main_page(lv_obj_t* parent)
{
lv_obj_t* menuLabel = lv_label_create(parent);
lv_label_set_text(menuLabel, "Wi-Fi");
this->wifiOverview = lv_obj_create(parent);
lv_obj_set_size(this->wifiOverview, lv_pct(100), 80);
lv_obj_set_style_bg_color(this->wifiOverview, color_primary, LV_PART_MAIN);
lv_obj_set_style_border_width(this->wifiOverview, 0, LV_PART_MAIN);
menuLabel = lv_label_create(this->wifiOverview);
lv_obj_t* arrow = lv_label_create(this->wifiOverview);
lv_label_set_text(arrow, LV_SYMBOL_RIGHT);
lv_obj_align(arrow, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_t* ip_label = lv_label_create(this->wifiOverview);
lv_label_set_text(ip_label, "IP:");
lv_obj_align(ip_label, LV_ALIGN_BOTTOM_LEFT, 0, 0);
lv_obj_t* ip = lv_label_create(this->wifiOverview);
lv_obj_align(ip, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_label_set_text(menuLabel, "Disconnected");
lv_label_set_text(ip, "-");
lv_menu_set_load_page_event(this->settingsMenu, this->wifiOverview, this->wifi_selection_page);
lv_obj_add_event_cb(this->wifiOverview, [] (lv_event_t* e) {mInstance->wifi_settings_cb(e);}, LV_EVENT_CLICKED, this->wifi_setting_cont);
}
void OmoteUI::wifi_scan_done(std::shared_ptr<std::vector<WifiInfo>> info)
{
unsigned int size = info->size();
this->no_subpages = (size + WIFI_SUBPAGE_SIZE - 1)/WIFI_SUBPAGE_SIZE;
this->no_wifi_networks = size;
this->found_wifi_networks = info;
if (size == 0)
{
lv_obj_t* menuBox = lv_obj_create(this->wifi_setting_cont);
lv_obj_set_size(menuBox, lv_pct(100), 45);
lv_obj_set_scrollbar_mode(menuBox, LV_SCROLLBAR_MODE_OFF);
lv_obj_t* menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "no networks found");
}
else
{
this->update_wifi_selection_subpage(0);
}
}
void OmoteUI::next_wifi_selection_subpage(lv_event_t* e)
{
int subpage = (uintptr_t) lv_event_get_user_data(e);
this->update_wifi_selection_subpage(subpage);
}
/**
* @brief Callback function in case a wifi is selected. This callback function will change the label of the wifi password
* sub page to the selected wifi network.
*
* @param e Pointer to event object for the event where this callback is called
*/
static void wifi_selected_cb(lv_event_t* e)
{
lv_obj_t* label = lv_obj_get_child(e->target, 0);
lv_label_set_text((lv_obj_t*) e->user_data, lv_label_get_text(label));
ssid = lv_label_get_text(label);
}
void OmoteUI::update_wifi_selection_subpage(int page)
{
if (page < this->no_subpages)
{
lv_obj_clean(this->wifi_setting_cont);
lv_obj_t* pageLabel = lv_label_create(this->wifi_setting_cont);
lv_label_set_text_fmt(pageLabel, "Page %d/%d", page + 1, this->no_subpages);
if (page > 0)
{
lv_obj_t* menuBox = lv_obj_create(this->wifi_setting_cont);
lv_obj_set_size(menuBox, lv_pct(100), 45);
lv_obj_set_scrollbar_mode(menuBox, LV_SCROLLBAR_MODE_OFF);
lv_obj_t* menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Previous");
lv_obj_align(menuLabel, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_add_event_cb(menuBox, [](lv_event_t* e) {mInstance->next_wifi_selection_subpage(e);},LV_EVENT_CLICKED, (void*)(page - 1));
lv_obj_t* arrow = lv_label_create(menuBox);
lv_label_set_text(arrow, LV_SYMBOL_LEFT);
lv_obj_align(arrow, LV_ALIGN_TOP_LEFT, 0, 0);
}
for (int i = 0; i < WIFI_SUBPAGE_SIZE && (page*WIFI_SUBPAGE_SIZE + i) < this->no_wifi_networks; i++)
{
lv_obj_t* menuBox = lv_obj_create(this->wifi_setting_cont);
lv_obj_set_size(menuBox, lv_pct(100), 45);
lv_obj_set_scrollbar_mode(menuBox, LV_SCROLLBAR_MODE_OFF);
lv_obj_add_flag(menuBox, LV_OBJ_FLAG_EVENT_BUBBLE);
lv_obj_t* menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, this->found_wifi_networks->at(page*WIFI_SUBPAGE_SIZE + i).ssid.c_str());
lv_obj_t* wifi_image;
int RSSI = this->found_wifi_networks->at(page*WIFI_SUBPAGE_SIZE + i).rssi;
if (RSSI > -50)
{
wifi_image = imgs.addWifiHighSignal(menuBox);
}
else if (RSSI > -60)
{
wifi_image = imgs.addWifiMidSignal(menuBox);
}
else if (RSSI > -70)
{
wifi_image = imgs.addWifiLowSignal(menuBox);
}
else
{
wifi_image = imgs.addWifiLowSignal(menuBox);
}
lv_obj_align(wifi_image, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_menu_set_load_page_event(this->settingsMenu, menuBox, this->wifi_password_page);
lv_obj_add_event_cb(menuBox, wifi_selected_cb, LV_EVENT_CLICKED, this->wifi_password_label);
}
if ((page + 1) < this->no_subpages)
{
lv_obj_t* menuBox = lv_obj_create(this->wifi_setting_cont);
lv_obj_set_size(menuBox, lv_pct(100), 45);
lv_obj_set_scrollbar_mode(menuBox, LV_SCROLLBAR_MODE_OFF);
lv_obj_t* menuLabel = lv_label_create(menuBox);
lv_label_set_text(menuLabel, "Next");
lv_obj_add_event_cb(menuBox, [](lv_event_t* e) {mInstance->next_wifi_selection_subpage(e);}, LV_EVENT_CLICKED, (void*)(page + 1));
lv_obj_t* arrow = lv_label_create(menuBox);
lv_label_set_text(arrow, LV_SYMBOL_RIGHT);
lv_obj_align(arrow, LV_ALIGN_TOP_RIGHT, 0, 0);
}
lv_obj_scroll_to_y(this->wifi_setting_cont, 0, LV_ANIM_OFF);
}
}
void OmoteUI::create_wifi_settings(lv_obj_t* menu, lv_obj_t* parent)
{
this->wifi_selection_page = this->create_wifi_selection_page(menu);
this->wifi_password_page = this->create_wifi_password_page(this->settingsMenu);
this->create_wifi_main_page(parent);
this->mHardware->wifi()->onScanDone([] (std::shared_ptr<std::vector<WifiInfo>> info) {mInstance->wifi_scan_done(info);});
this->mHardware->wifi()->onStatusUpdate([] (std::shared_ptr<wifiStatus> status) {mInstance->wifi_status(status);});
}
void OmoteUI::wifi_status(std::shared_ptr<wifiStatus> status)
{
this->mHardware->debugPrint("connected %d\n", status->isConnected);
this->mHardware->debugPrint("IP %s\n", status->IP);
this->mHardware->debugPrint("SSID %s\n", status->ssid);
lv_obj_t* ip_label = lv_obj_get_child(this->wifiOverview, 3);
lv_obj_t* ssid_label = lv_obj_get_child(this->wifiOverview, 0);
if (status->isConnected)
{
lv_label_set_text(this->WifiLabel, LV_SYMBOL_WIFI);
lv_label_set_text(ssid_label, status->ssid.c_str());
lv_label_set_text(ip_label, status->IP.c_str());
}
else
{
lv_label_set_text(this->WifiLabel, "");
lv_label_set_text(ssid_label, "Disconnected");
lv_label_set_text(ip_label, "-");
}
}
lv_obj_t* OmoteUI::create_wifi_password_page(lv_obj_t* menu)
{
lv_obj_t* ret_val = lv_menu_page_create(menu, NULL);
lv_obj_t* cont = lv_menu_cont_create(ret_val);
lv_obj_set_layout(cont, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_ACTIVE);
this->wifi_password_label = lv_label_create(cont);
lv_label_set_text(this->wifi_password_label, "Password");
lv_obj_t* password_input = lv_textarea_create(cont);
lv_obj_set_width(password_input, lv_pct(100));
lv_textarea_set_password_mode(password_input, true);
lv_textarea_set_one_line(password_input, true);
lv_textarea_set_placeholder_text(password_input, "Password");
lv_obj_add_event_cb(password_input, [] (lv_event_t* e) {mInstance->password_field_event_cb(e);} , LV_EVENT_READY, NULL );
this->attach_keyboard(password_input);
lv_obj_t* show_password = lv_checkbox_create(cont);
lv_checkbox_set_text(show_password, "Show password");
lv_obj_add_event_cb(show_password, show_password_cb, LV_EVENT_VALUE_CHANGED, password_input);
lv_obj_t* connect_button = lv_btn_create(cont);
lv_obj_t* label = lv_label_create(connect_button);
lv_label_set_text(label, "Connect");
lv_obj_add_event_cb(connect_button,[] (lv_event_t* e) { mInstance->connect_btn_cb(e);}, LV_EVENT_CLICKED, password_input);
return ret_val;
}
/**
* @brief Callback which is triggered when the wifi settings are opened (the wifi settings are pressed in the settings
* main page). This function will trigger the asynchronous scan for wifi networks and update the label of the wifi
* selection page to indicate that wifi networks are being searched for. The wifi event callback function then has to
* call the API function to fill the page with the found networks.
*
* @param event Pointer to event object for the event where this callback is called
*/
void OmoteUI::wifi_settings_cb(lv_event_t* event)
{
lv_obj_t* cont = (lv_obj_t*) lv_event_get_user_data(event);
lv_obj_clean(cont);
lv_obj_t* label = lv_label_create(cont);
lv_label_set_text(label, "Searching for wifi networks");
mHardware->debugPrint("Wifi settings cb called\n");
mHardware->wifi()->scan();
//This will trigger an asynchronouse network scan
// We need to trigger wifi search via HAL
//wifihandler.scan();
}

View File

@ -0,0 +1,21 @@
#include "BasicUI.hpp"
#include "HardwareFactory.hpp"
#include "HomeScreen.hpp"
#include "ScreenManager.hpp"
using namespace UI;
BasicUI::BasicUI() : UIBase() {
HardwareFactory::getAbstract().keys()->RegisterKeyPressHandler(
[](auto aKeyEvent) {
return Screen::Manager::getInstance().distributeKeyEvent(aKeyEvent);
// Could potentially add a check here and display that a key event was
// unused.
});
Screen::Manager::getInstance().pushScreen(
std::make_unique<Screen::HomeScreen>());
HardwareFactory::getAbstract().wifi()->begin();
}

View File

@ -0,0 +1,11 @@
#pragma once
#include "UIBase.hpp"
namespace UI {
class BasicUI : public UIBase {
public:
BasicUI();
};
} // namespace UI

View File

@ -0,0 +1,51 @@
#include "Demo.hpp"
#include "Slider.hpp"
using namespace UI::Page;
Demo::Demo() : Base(ID::Pages::Demo) {}
void Demo::AddSlider() {
auto fakeSlider = std::make_unique<Widget::Slider>([](auto data) {});
fakeSlider->SetHeight(lv_pct(10));
fakeSlider->SetWidth(GetContentWidth());
if (sliders.empty()) {
fakeSlider->AlignTo(this, LV_ALIGN_TOP_MID);
} else {
auto nextY = sliders.back()->GetY() + sliders.back()->GetHeight();
fakeSlider->SetY(nextY + 10);
}
sliders.push_back(AddElement(std::move(fakeSlider)));
}
bool Demo::OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
using id = KeyPressAbstract::KeyId;
using eventType = KeyPressAbstract::KeyEvent::Type;
bool used = true;
switch (aKeyEvent.mId) {
case id::Aux1:
if (aKeyEvent.mType == eventType::Press) {
AddSlider();
}
break;
case id::Aux2:
if (aKeyEvent.mType == eventType::Release) {
if (sliders.size() > 0) {
RemoveElement(sliders[0]);
sliders.erase(
sliders.begin()); // sliders is non owning so after removing delete
// it from non owning array
}
}
break;
case id::Aux3:
break;
case id::Aux4:
break;
default:
used = Page::Base::OnKeyEvent(aKeyEvent);
break;
}
return used;
}

View File

@ -0,0 +1,20 @@
#pragma once
#include "PageBase.hpp"
namespace UI::Page {
class Demo : public Base {
public:
Demo();
void AddSlider();
void OnShow() override{};
void OnHide() override{};
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent);
private:
std::vector<UIElement *> sliders;
};
} // namespace UI::Page

View File

@ -0,0 +1,16 @@
#include "DisplaySettings.hpp"
#include "BrightnessSlider.hpp"
#include "Label.hpp"
using namespace UI::Page;
DisplaySettings::DisplaySettings(std::shared_ptr<DisplayAbstract> aDisplay)
: Base(UI::ID::Pages::DisplaySettings), mDisplay(aDisplay),
mBrightnessSlider(AddElement<Widget::BrightnessSlider>(
std::make_unique<Widget::BrightnessSlider>(mDisplay))) {
SetBgColor(Color::GREY);
mBrightnessSlider->SetWidth(GetContentWidth());
mBrightnessSlider->SetHeight(80);
mBrightnessSlider->AlignTo(this, LV_ALIGN_TOP_MID);
}

View File

@ -0,0 +1,21 @@
#pragma once
#include "DisplayAbstract.h"
#include "DropDown.hpp"
#include "PageBase.hpp"
namespace UI::Widget {
class BrightnessSlider;
} // namespace UI::Widget
namespace UI::Page {
class DisplaySettings : public Base {
public:
DisplaySettings(std::shared_ptr<DisplayAbstract> aDisplay);
std::string GetTitle() override { return "Display Settings"; };
private:
std::shared_ptr<DisplayAbstract> mDisplay;
Widget::BrightnessSlider *mBrightnessSlider;
};
} // namespace UI::Page

View File

@ -0,0 +1,43 @@
#include "SettingsPage.hpp"
#include "BackgroundScreen.hpp"
#include "Button.hpp"
#include "Colors.hpp"
#include "DisplaySettings.hpp"
#include "HardwareFactory.hpp"
#include "List.hpp"
#include "PopUpScreen.hpp"
#include "ScreenManager.hpp"
#include "Slider.hpp"
#include "SystemSettings.hpp"
#include "WifiSettings.hpp"
using namespace UI::Page;
using namespace UI::Color;
SettingsPage::SettingsPage()
: Base(ID::Pages::Settings), mSettingsList(AddElement<Widget::List>(
std::make_unique<Widget::List>())) {
mSettingsList->AddItem("Display", LV_SYMBOL_EYE_OPEN,
[this] { PushDisplaySettings(); });
mSettingsList->AddItem("Wifi", LV_SYMBOL_WIFI,
[this] { PushWifiSettings(); });
mSettingsList->AddItem("System", LV_SYMBOL_SETTINGS,
[this] { PushSystemSettings(); });
}
void SettingsPage::PushDisplaySettings() {
UI::Screen::Manager::getInstance().pushPopUp(
std::make_unique<DisplaySettings>(
HardwareFactory::getAbstract().display()));
}
void SettingsPage::PushSystemSettings() {
UI::Screen::Manager::getInstance().pushPopUp(
std::make_unique<SystemSettings>());
}
void SettingsPage::PushWifiSettings() {
UI::Screen::Manager::getInstance().pushPopUp(
std::make_unique<WifiSettings>(HardwareFactory::getAbstract().wifi()));
}

View File

@ -0,0 +1,28 @@
#include "HardwareAbstract.hpp"
#include "PageBase.hpp"
namespace UI::Widget {
class Button;
class List;
} // namespace UI::Widget
namespace UI::Page {
class SettingsPage : public Base {
public:
SettingsPage();
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override {
return false;
};
void PushDisplaySettings();
void PushSystemSettings();
void PushWifiSettings();
protected:
void OnShow() override{};
void OnHide() override{};
Widget::Button *mButton;
Widget::List *mSettingsList;
};
} // namespace UI::Page

View File

@ -0,0 +1,27 @@
#include "SystemSettings.hpp"
#include "HardwareFactory.hpp"
#include "Label.hpp"
using namespace UI::Page;
SystemSettings::SystemSettings()
: Base(ID::Pages::SystemSettings),
mTimeoutLabel(AddElement<Widget::Label>(
std::make_unique<Widget::Label>("TimeOut"))),
mScreenTimeOutDropDown(AddElement<Widget::DropDown<int>>(
std::make_unique<Widget::DropDown<int>>([this](int aTimeout) {
HardwareFactory::getAbstract().setSleepTimeout(aTimeout);
}))) {
mTimeoutLabel->AlignTo(this, LV_ALIGN_TOP_MID);
mTimeoutLabel->SetHeight(15);
mScreenTimeOutDropDown->SetHeight(30);
mScreenTimeOutDropDown->SetWidth(GetContentWidth());
mScreenTimeOutDropDown->AddItem("10 Seconds", 10000);
mScreenTimeOutDropDown->AddItem("15 Seconds", 15000);
mScreenTimeOutDropDown->AddItem("20 Seconds", 20000);
mScreenTimeOutDropDown->AlignTo(mTimeoutLabel, LV_ALIGN_OUT_BOTTOM_MID);
mScreenTimeOutDropDown->SetSelected(
HardwareFactory::getAbstract().getSleepTimeout());
}

View File

@ -0,0 +1,23 @@
#pragma once
#include "DropDown.hpp"
#include "PageBase.hpp"
namespace UI::Widget {
class Label;
}
namespace UI::Page {
class SystemSettings : public Base {
public:
SystemSettings();
protected:
std::string GetTitle() override { return "System Settings"; }
private:
Widget::Label *mTimeoutLabel;
Widget::DropDown<int> *mScreenTimeOutDropDown;
};
} // namespace UI::Page

View File

@ -0,0 +1,79 @@
#include "WifiSettings.hpp"
#include "Keyboard.hpp"
#include "Label.hpp"
#include "List.hpp"
#include "LvglResourceManager.hpp"
using namespace UI;
using namespace UI::Page;
WifiSettings::WifiSettings(std::shared_ptr<wifiHandlerInterface> aWifi)
: Base(ID::Pages::WifiSettings), mWifi(aWifi),
mScanCompleteHandler(mWifi->ScanCompleteNotification()),
mScanStatusHandler(mWifi->WifiStatusNotification()),
mScanningText(AddElement<Widget::Label>(
std::make_unique<Widget::Label>("Scanning..."))),
mWifiNetworks(AddElement<Widget::List>(std::make_unique<Widget::List>())),
mPasswordGetter(nullptr) {
// Set Handler for when the wifi scan is done
mScanCompleteHandler = [this](auto aWifiInfos) {
if (aWifiInfos.empty()) {
mScanningText->SetText("No Networks Found");
return;
}
mScanningText->SetText("Networks Found");
// Create List of wifi infos that when pressed a Keyboard opens
for (WifiInfo wifiInfo : aWifiInfos) {
mWifiNetworks->AddItem(wifiInfo.ssid, LV_SYMBOL_WIFI, [this, wifiInfo] {
OpenPasswordKeyboard(wifiInfo);
});
}
};
mWifi->scan();
}
void WifiSettings::OpenPasswordKeyboard(WifiInfo aNetworkToConnectTo) {
// We already have a Keyboard don't launch another one.
if (mPasswordGetter) {
return;
}
auto keyboard = std::make_unique<Widget::Keyboard>(
[this, aNetworkToConnectTo](auto aUserEnteredPassword) {
// Attempt Connection when user finishes up with keyboard input
mWifi->connect(aNetworkToConnectTo.ssid, aUserEnteredPassword);
mScanningText->SetText("Attempting Connection to " +
aNetworkToConnectTo.ssid);
mPasswordGetter->AnimateOut();
StartHandlingStatusUpdates();
},
"Password:");
keyboard->OnKeyboardAnimatedOut([this] {
// Keyboard is done animating out remove it and null the ref
RemoveElement(mPasswordGetter);
mPasswordGetter = nullptr;
});
mPasswordGetter = AddElement<Widget::Keyboard>(std::move(keyboard));
}
void WifiSettings::StartHandlingStatusUpdates() {
mScanStatusHandler = [this](auto aWifiStatus) {
if (aWifiStatus.isConnected) {
mScanningText->SetText("Connected to " + aWifiStatus.ssid);
} else {
mScanningText->SetText("Failed To Connect To " + aWifiStatus.ssid);
}
};
}
void WifiSettings::SetHeight(lv_coord_t aHeight) {
Base::SetHeight(aHeight);
mScanningText->AlignTo(this, LV_ALIGN_TOP_MID);
mScanningText->SetHeight(20);
mScanningText->SetLongMode(LV_LABEL_LONG_SCROLL);
const auto padding = 10;
mWifiNetworks->AlignTo(mScanningText, LV_ALIGN_OUT_BOTTOM_MID, 0, padding);
mWifiNetworks->SetHeight(GetContentHeight() - mScanningText->GetBottom() -
padding);
};

View File

@ -0,0 +1,37 @@
#pragma once
#include "PageBase.hpp"
#include "wifiHandlerInterface.h"
namespace UI::Widget {
class List;
class Label;
class Keyboard;
} // namespace UI::Widget
namespace UI::Page {
class WifiSettings : public Base {
using WifiInfo = wifiHandlerInterface::WifiInfo;
public:
WifiSettings(std::shared_ptr<wifiHandlerInterface> aWifi);
std::string GetTitle() override { return "Wifi Settings"; };
void SetHeight(lv_coord_t aHeight) override;
protected:
void StartHandlingStatusUpdates();
void OpenPasswordKeyboard(WifiInfo aNetworkToConnectTo);
private:
std::shared_ptr<wifiHandlerInterface> mWifi;
Handler<wifiHandlerInterface::ScanDoneDataTy> mScanCompleteHandler;
Handler<wifiHandlerInterface::wifiStatus> mScanStatusHandler;
UI::Widget::Label *mScanningText;
UI::Widget::List *mWifiNetworks;
UI::Widget::Keyboard *mPasswordGetter;
};
} // namespace UI::Page

View File

@ -0,0 +1,28 @@
#include "HomeScreen.hpp"
#include "Colors.hpp"
#include "Demo.hpp"
#include "SettingsPage.hpp"
using namespace UI::Screen;
HomeScreen::HomeScreen()
: Base(UI::ID::Screens::Home),
mTabView(AddElement<Page::TabView>(
std::make_unique<Page::TabView>(ID(ID::Pages::INVALID_PAGE_ID)))) {
SetBgColor(UI::Color::BLACK);
SetPushAnimation(LV_SCR_LOAD_ANIM_FADE_IN);
// Adds pages to the Tab view
mTabView->AddTab(std::make_unique<Page::SettingsPage>());
mTabView->AddTab(std::make_unique<Page::Demo>());
}
void HomeScreen::SetBgColor(lv_color_t value, lv_style_selector_t selector) {
mTabView->SetBgColor(value, selector);
UI::UIElement::SetBgColor(value, selector);
}
bool HomeScreen::OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
return false;
};

View File

@ -0,0 +1,23 @@
#pragma once
#include "HardwareAbstract.hpp"
#include "PageBase.hpp"
#include "ScreenBase.hpp"
#include "TabView.hpp"
#include <string>
namespace UI::Screen {
class HomeScreen : public Base {
public:
HomeScreen();
void SetBgColor(lv_color_t value,
lv_style_selector_t selector = LV_PART_MAIN) override;
protected:
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;
private:
Page::TabView *mTabView;
};
} // namespace UI::Screen

View File

@ -0,0 +1,44 @@
#include "BrightnessSlider.hpp"
#include "Label.hpp"
#include "Slider.hpp"
using namespace UI::Widget;
BrightnessSlider::BrightnessSlider(std::shared_ptr<DisplayAbstract> aDisplay)
: Base(ID::Widgets::BrightnessSlider), mDisplay(aDisplay),
mSlider(AddElement<Widget::Slider>(std::make_unique<Slider>(
[this](auto aNewBrightness) {
mDisplay->setBrightness(aNewBrightness);
},
0, 255))),
mLabel(AddElement<Widget::Label>(std::make_unique<Label>("Brightness"))) {
mLabel->AlignTo(this, LV_ALIGN_TOP_MID);
mSlider->AlignTo(mLabel, LV_ALIGN_OUT_BOTTOM_MID);
mSlider->SetWidth(GetContentWidth() - GetContentWidth() * 0.25f);
}
void BrightnessSlider::OnShow() {
mSlider->SetValue(mDisplay->getBrightness());
Base::OnShow();
}
void BrightnessSlider::SetHeight(lv_coord_t aHeight) {
Base::SetHeight(aHeight);
auto labelHeight = 12;
auto sliderHeight = aHeight * 0.60f - labelHeight;
mLabel->SetHeight(labelHeight);
mSlider->SetHeight(sliderHeight);
mLabel->AlignTo(this, LV_ALIGN_TOP_MID);
mSlider->AlignTo(mLabel, LV_ALIGN_OUT_BOTTOM_MID, 0,
mLabel->GetContentHeight());
}
bool BrightnessSlider::OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
using ID = KeyPressAbstract::KeyId;
using Type = KeyPressAbstract::KeyEvent::Type;
if (aKeyEvent.mId == ID::Aux1 && aKeyEvent.mType == Type::Press) {
SetVisiblity(!IsSetVisible());
return true;
}
return false;
}

View File

@ -0,0 +1,25 @@
#pragma once
#include "DisplayAbstract.h"
#include "WidgetBase.hpp"
namespace UI::Widget {
class Slider;
class Label;
class BrightnessSlider : public Base {
public:
BrightnessSlider(std::shared_ptr<DisplayAbstract> aDisplay);
void SetHeight(lv_coord_t aHeight) override;
protected:
void OnShow() override;
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;
private:
std::shared_ptr<DisplayAbstract> mDisplay;
Slider *mSlider;
Label *mLabel;
};
} // namespace UI::Widget

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,48 @@
// OMOTE UI Images
// 2023 Matthew Colvin
#pragma once
#include "lvgl.h"
class Images {
public:
Images();
lv_obj_t *addAppleTVIcon(lv_obj_t *parent);
lv_obj_t *addAppleDisplayImage(lv_obj_t *parent);
lv_obj_t *addAppleBackIcon(lv_obj_t *parent);
lv_obj_t *addLowBrightnessIcon(lv_obj_t *parent);
lv_obj_t *addHighBrightnessIcon(lv_obj_t *parent);
lv_obj_t *addLightBulbIcon(lv_obj_t *parent);
lv_obj_t *addLeftGradiant(lv_obj_t *parent);
lv_obj_t *addRightGradiant(lv_obj_t *parent);
lv_obj_t *addWifiNoSignal(lv_obj_t *parent);
lv_obj_t *addWifiLowSignal(lv_obj_t *parent);
lv_obj_t *addWifiMidSignal(lv_obj_t *parent);
lv_obj_t *addWifiHighSignal(lv_obj_t *parent);
private:
// Make Image based on anImageDesc then
// add that image to parent.
lv_obj_t *addImg(lv_obj_t *parent, lv_img_dsc_t *anImgDesc);
void setupImageDescriptions();
lv_img_dsc_t appleTvIcon;
lv_img_dsc_t appleDisplayIcon;
lv_img_dsc_t appleBackIcon;
lv_img_dsc_t low_brightness;
lv_img_dsc_t high_brightness;
lv_img_dsc_t lightbulb_icon;
lv_img_dsc_t gradientLeft;
lv_img_dsc_t gradientRight;
lv_img_dsc_t wifiNoSignal;
lv_img_dsc_t wifiLowSignal;
lv_img_dsc_t wifiMidSignal;
lv_img_dsc_t wifiHighSignal;
};

View File

@ -0,0 +1,49 @@
#pragma once
#include <functional>
#include <mutex>
#include <queue>
namespace UI {
class UIBase;
} // namespace UI
class LvglResourceManager {
friend UI::UIBase;
public:
static LvglResourceManager &GetInstance() {
static LvglResourceManager mInstance;
return mInstance;
}
[[nodiscard]] std::scoped_lock<std::recursive_mutex> scopeLock() {
return std::scoped_lock(mLvglMutex);
}
void AttemptNow(std::function<void()> aLvglModifierFunction) {
// Attempt to take mutex and preform op if you can't then queue up.
if (mLvglMutex.try_lock()) {
aLvglModifierFunction();
mLvglMutex.unlock();
} else {
QueueForLater(aLvglModifierFunction);
}
}
void QueueForLater(std::function<void()> aLvglModifierFunction) {
mLvglTasks.push(std::move(aLvglModifierFunction));
}
protected:
LvglResourceManager(){};
void HandleQueuedTasks() {
auto lock = scopeLock();
while (!mLvglTasks.empty()) {
mLvglTasks.front()();
mLvglTasks.pop();
}
}
std::queue<std::function<void()>> mLvglTasks;
std::recursive_mutex mLvglMutex;
};

View File

@ -0,0 +1,15 @@
#include "UIBase.hpp"
#include "LvglResourceManager.hpp"
using namespace UI;
UIBase::UIBase() {}
void UIBase::loopHandler() {
{
auto lock = LvglResourceManager::GetInstance().scopeLock();
lv_timer_handler();
lv_task_handler();
}
LvglResourceManager::GetInstance().HandleQueuedTasks();
}

View File

@ -0,0 +1,19 @@
// OMOTE UI
// 2023 Matthew Colvin
#pragma once
#include "HardwareAbstract.hpp"
#include <memory>
namespace UI {
class UIBase {
public:
UIBase();
virtual void loopHandler();
protected:
};
} // namespace UI

View File

@ -0,0 +1,40 @@
#include "Animation.hpp"
using namespace UI;
Animation::Animation(std::function<void(int32_t)> aAnimator,
int32_t aAnimationTime, int32_t aStart, int32_t aEnd)
: mAnimator(aAnimator), mStart(aStart), mEnd(aEnd) {
lv_anim_init(&mAnimation);
mAnimation.user_data = this;
lv_anim_set_custom_exec_cb(&mAnimation, AnimatorImpl);
lv_anim_set_time(&mAnimation, aAnimationTime);
}
Animation::~Animation() { lv_anim_custom_del(&mAnimation, AnimatorImpl); }
void Animation::HandleAnimationComplete(
std::function<void()> onAnimationComplete) {
mOnComplete = onAnimationComplete;
}
void Animation::Start() {
lv_anim_set_values(&mAnimation, mStart, mEnd);
lv_anim_start(&mAnimation);
}
void Animation::Reverse() {
std::swap(mStart, mEnd);
Start();
}
//////////////////////// Statics /////////////////////////////////////////
void Animation::AnimatorImpl(lv_anim_t *aSelf, int32_t aNextValue) {
auto self = reinterpret_cast<Animation *>(aSelf->user_data);
self->mAnimator(aNextValue);
// TODO This probably will not support Overshoot animations.
if (self->mOnComplete && aNextValue == self->mEnd) {
self->mOnComplete();
}
}

Some files were not shown because too many files have changed in this diff Show More