Compare commits

..

5 Commits

26 changed files with 6958 additions and 143 deletions

4
.gitmodules vendored Normal file
View File

@@ -0,0 +1,4 @@
[submodule "PCB_Charger"]
path = PCB_Charger
url = https://git.rd12.ru/Razvalyaev/Charger.git
branch = master

View File

@@ -19,7 +19,7 @@ constexpr uint8_t MENU_OPTICAL_CALIBRATION_ITEM = 7;
const char *uiFailName(FailReason reason);
const char *appStateName(AppState state) {
static const char *names[] = {"IDLE", "MENU", "BOARD_TEST", "SOLO_MEASURE", "SOLO_DRIVER", "MASTER_DISCOVER",
static const char *names[] = {"IDLE", "MENU", "BOARD_TEST", "PWM_OUTPUT", "SOLO_MEASURE", "SOLO_DRIVER", "MASTER_DISCOVER",
"MASTER_WAIT_READY", "MASTER_WAIT_RESULT", "MASTER_FINALIZE", "SLAVE_READY", "SLAVE_WAIT_START",
"SLAVE_MEASURE", "SLAVE_WAIT_ACK", "FINISHED"};
const uint8_t index = static_cast<uint8_t>(state);
@@ -250,9 +250,12 @@ uint8_t cycleIndex(uint8_t value, uint8_t first, uint8_t last, int direction) {
return value <= first ? last : static_cast<uint8_t>(value - 1U);
}
uint8_t nextMenuItem(uint8_t current, TestGroup group) {
uint8_t nextMenuItem(uint8_t current, TestGroup group, TestKind kind) {
if (group == TestGroup::BOARD)
return current == 0U ? MENU_OPTICAL_CALIBRATION_ITEM : 0U;
if (kind == TestKind::PWM_OUTPUT)
return current == 0U ? 1U : current == 1U ? 2U
: current == 2U ? MENU_OPTICAL_CALIBRATION_ITEM : 0U;
return current >= MENU_OPTICAL_CALIBRATION_ITEM ? 0U
: static_cast<uint8_t>(current + 1U);
}
@@ -356,6 +359,12 @@ void App::update() {
}
return;
}
if (state_ == AppState::PWM_OUTPUT) {
if (startEvent == ButtonEvent::LONG) stopPwmOutput();
else if (modeEvent != ButtonEvent::NONE)
Log::event("ACTION", "MODE ignored while PWM output is active");
return;
}
if (state_ != AppState::IDLE && state_ != AppState::MENU && state_ != AppState::FINISHED &&
startEvent == ButtonEvent::LONG) { abortTest(); return; }
if (state_ != AppState::IDLE && state_ != AppState::MENU && state_ != AppState::FINISHED &&
@@ -399,7 +408,8 @@ void App::update() {
if (modeEvent == ButtonEvent::SHORT) {
leaveOpticalCalibration();
menuItem_ = nextMenuItem(menuItem_,
static_cast<TestGroup>(settings_.testGroup));
static_cast<TestGroup>(settings_.testGroup),
static_cast<TestKind>(settings_.testKind));
Log::printf("ACTION", "menu item selected index=%u", menuItem_);
showMenu();
}
@@ -529,12 +539,12 @@ void App::printSerialHelp() {
Serial.println(" set group optics|board");
Serial.println(" set boardtest adc|pwm|rx");
Serial.println(" set role solo|master|slave");
Serial.println(" set test optical|driver");
Serial.println(" set frequency 500|1000|2000|5000|10000|25000");
Serial.println(" set max 2000|5000|10000|20000|50000|100000|200000|500000");
Serial.println(" set test optical|driver|pwm (driver/pwm: SOLO only)");
Serial.println(" set frequency 500|1000|2000|5000|10000");
Serial.println(" set max 2000|5000|10000|50000|100000|500000 (PWM pulse in SOLO PWM)");
Serial.println(" set min 250|500|1000|2000|5000|10000|50000");
Serial.println(" set accuracy 1|2|5|10");
Serial.println(" set time 100|250|500|1000|2000|5000 (ms)");
Serial.println(" set time 100|250|500|1000|2000|5000|60000 (ms)");
Serial.println(" set light HH|HL|LH|LL (DRIVER only)");
}
@@ -605,6 +615,9 @@ void App::handleSerialCommand(char *line) {
else if (state_ == AppState::BOARD_TEST) {
Serial.println("OK board test stopped");
stopBoardTest();
} else if (state_ == AppState::PWM_OUTPUT) {
Serial.println("OK PWM output stopped");
stopPwmOutput();
} else if (state_ == AppState::MENU) {
leaveOpticalCalibration();
state_ = AppState::IDLE; showIdle(); Serial.println("OK menu closed");
@@ -659,6 +672,9 @@ void App::handleSerialCommand(char *line) {
else if (!strcmp(value, "driver") && !TARGET_IS_C3 &&
static_cast<Role>(settings_.role) == Role::SOLO) {
settings_.testKind = static_cast<uint8_t>(TestKind::DRIVER); accepted = true;
} else if (!strcmp(value, "pwm") &&
static_cast<Role>(settings_.role) == Role::SOLO) {
settings_.testKind = static_cast<uint8_t>(TestKind::PWM_OUTPUT); accepted = true;
}
} else if ((!strcmp(name, "frequency") || !strcmp(name, "freq")) && parseUnsigned(value, numeric)) {
const int index = optionIndex(PWM_FREQUENCY_OPTIONS_HZ, numeric);
@@ -705,6 +721,8 @@ void App::cycleRunMode() {
const TestKind kind = static_cast<TestKind>(settings_.testKind);
if (role == Role::SOLO && kind == TestKind::OPTICAL && !TARGET_IS_C3) {
settings_.testKind = static_cast<uint8_t>(TestKind::DRIVER);
} else if (role == Role::SOLO && kind != TestKind::PWM_OUTPUT) {
settings_.testKind = static_cast<uint8_t>(TestKind::PWM_OUTPUT);
} else if (role == Role::SOLO) {
settings_.role = static_cast<uint8_t>(Role::MASTER);
settings_.testKind = static_cast<uint8_t>(TestKind::OPTICAL);
@@ -725,11 +743,12 @@ void App::sanitizeRange() {
settings_.boardTest = static_cast<uint8_t>(defaultBoardTest());
if (settings_.role > static_cast<uint8_t>(Role::SLAVE))
settings_.role = static_cast<uint8_t>(Role::SOLO);
if (settings_.testKind > static_cast<uint8_t>(TestKind::DRIVER))
if (settings_.testKind > static_cast<uint8_t>(TestKind::PWM_OUTPUT))
settings_.testKind = static_cast<uint8_t>(TestKind::OPTICAL);
if (settings_.lightCode > static_cast<uint8_t>(LightCode::LL))
settings_.lightCode = static_cast<uint8_t>(LightCode::HH);
if (settings_.role != static_cast<uint8_t>(Role::SOLO) ||
if ((settings_.role != static_cast<uint8_t>(Role::SOLO) &&
settings_.testKind != static_cast<uint8_t>(TestKind::OPTICAL)) ||
(TARGET_IS_C3 && settings_.testKind == static_cast<uint8_t>(TestKind::DRIVER)))
settings_.testKind = static_cast<uint8_t>(TestKind::OPTICAL);
settings_.frequencyIndex %= countOf(PWM_FREQUENCY_OPTIONS_HZ);
@@ -760,8 +779,8 @@ void App::changeMenu(int d) {
} else if (menuItem_ == 2) {
const uint8_t last = lastValidMaxPulseIndex(
PWM_FREQUENCY_OPTIONS_HZ[settings_.frequencyIndex]);
const uint8_t first = firstMaxPulseIndexAtLeast(
MIN_PULSE_OPTIONS_NS[settings_.minPulseIndex], last);
const uint8_t first = static_cast<TestKind>(settings_.testKind) == TestKind::PWM_OUTPUT
? 0U : firstMaxPulseIndexAtLeast(MIN_PULSE_OPTIONS_NS[settings_.minPulseIndex], last);
settings_.maxPulseIndex = cycleIndex(settings_.maxPulseIndex,
first, last, d);
} else if (menuItem_ == 3) {
@@ -811,7 +830,8 @@ void App::showMenu() {
break;
case 2:
Display::formatPulse(params_.maxPulseNs, value, sizeof(value));
label = UiText::MENU_MAX_PULSE;
label = static_cast<TestKind>(settings_.testKind) == TestKind::PWM_OUTPUT
? UiText::MENU_PWM_PULSE : UiText::MENU_MAX_PULSE;
break;
case 3:
Display::formatPulse(params_.minPulseNs, value, sizeof(value));
@@ -847,7 +867,8 @@ void App::showMenu() {
default: return;
}
formatMenuLine(label, value, one, sizeof(one));
if (static_cast<TestGroup>(settings_.testGroup) == TestGroup::BOARD)
if (static_cast<TestGroup>(settings_.testGroup) == TestGroup::BOARD ||
static_cast<TestKind>(settings_.testKind) == TestKind::PWM_OUTPUT)
snprintf(total, sizeof(total), "%s", UiText::BOARD_READY);
else
formatMenuLine(UiText::MENU_TOTAL_TIME, all, total, sizeof(total));
@@ -900,6 +921,10 @@ void App::startTest() {
startBoardTest();
return;
}
if (static_cast<TestKind>(settings_.testKind) == TestKind::PWM_OUTPUT) {
startPwmOutput();
return;
}
params_ = store_.params(settings_); stageCount_ = pulseWidthPointCount(params_.maxPulseNs, params_.minPulseNs);
stageIndex_ = 0; requestedHz_ = params_.frequencyHz; requestedPulseNs_ = 0; pendingReason_ = FailReason::NONE;
havePeer_ = false; lastHeartbeatMs_ = 0; lastPeerSeenMs_ = 0;
@@ -1019,6 +1044,37 @@ void App::stopBoardTest() {
showIdle();
}
void App::startPwmOutput() {
params_ = store_.params(settings_);
requestedHz_ = params_.frequencyHz;
requestedPulseNs_ = params_.maxPulseNs;
stageIndex_ = 0;
stageCount_ = 1;
pwm_.configureActiveLight(true);
if (!pwm_.start(requestedHz_, requestedPulseNs_, actual_)) {
Log::printf("PWM", "start failed: frequency=%luHz pulse=%luns",
requestedHz_, requestedPulseNs_);
finish(false, FailReason::RESOLUTION);
return;
}
state_ = AppState::PWM_OUTPUT;
char target[32], one[48];
formatTarget(actual_.actualHz, actual_.actualPulseNs, target, sizeof(target));
snprintf(one, sizeof(one), "%s: %s", uiTestName(TestKind::PWM_OUTPUT), target);
display_.show(one, UiText::BOARD_STOP);
Log::printf("PWM", "continuous output GPIO=%u requested=%luHz/%luns actual=%luHz/%luns duty=%.2f%%",
GPIO_PWM, requestedHz_, requestedPulseNs_, actual_.actualHz,
actual_.actualPulseNs, actual_.actualDutyPct);
}
void App::stopPwmOutput() {
Log::event("PWM", "continuous output stopped");
pwm_.stop();
state_ = AppState::IDLE;
setActivePerformance(false);
showIdle();
}
bool App::armSlave(bool preserveDisplay) {
setActivePerformance(false);
pwm_.stop();
@@ -1652,6 +1708,11 @@ void App::printConfiguration() {
Serial.printf("MAC=%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Serial.printf("GPIO PWM=%u RX=%u START=%u MODE=%u SDA=%u SCL=%u\n", GPIO_PWM, GPIO_RX,
GPIO_BUTTON_START, GPIO_BUTTON_MODE, GPIO_SDA, GPIO_SCL);
if (static_cast<TestKind>(settings_.testKind) == TestKind::PWM_OUTPUT) {
Serial.printf("Continuous PWM output %lu Hz, pulse %lu ns; RX unused\n",
params_.frequencyHz, params_.maxPulseNs);
return;
}
if (static_cast<TestKind>(settings_.testKind) == TestKind::DRIVER) {
const char *code = lightCodeName(static_cast<LightCode>(settings_.lightCode));
Serial.printf("Test %lu Hz, pulse %lu..%lu ns, accuracy %.2f%%, %lums, TX light=%c RX active light=%c\n",

View File

@@ -9,7 +9,7 @@
#include "SettingsStore.h"
enum class AppState : uint8_t {
IDLE, MENU, BOARD_TEST, SOLO_MEASURE, SOLO_DRIVER, MASTER_DISCOVER, MASTER_WAIT_READY,
IDLE, MENU, BOARD_TEST, PWM_OUTPUT, SOLO_MEASURE, SOLO_DRIVER, MASTER_DISCOVER, MASTER_WAIT_READY,
MASTER_WAIT_RESULT, MASTER_FINALIZE, SLAVE_READY, SLAVE_WAIT_START, SLAVE_MEASURE,
SLAVE_WAIT_ACK, FINISHED
};
@@ -33,6 +33,8 @@ class App {
void startBoardTest();
void updateBoardTest(uint32_t now);
void stopBoardTest();
void startPwmOutput();
void stopPwmOutput();
bool armSlave(bool preserveDisplay = false);
bool prepareStage(bool showProgress = true);
bool startLocalMeasurement(float hz, float duty);

View File

@@ -2,9 +2,13 @@
#include <Arduino.h>
// Uncomment to build the standalone PWM/RX pulse probe instead of the tester UI.
#define SIGNAL_PROBE_FIRMWARE
// ------------------------- Hardware configuration -------------------------
// Enabled for the hand-wired prototype. Comment out for the production PCB.
// Both profiles map S3 signals by physical header position with 5V/GND aligned.
#define MAKETKA
// Select exactly one populated receiver circuit. Use

View File

@@ -18,7 +18,7 @@ constexpr const char *ROLE_NAMES[] = {
};
constexpr const char *TEST_NAMES[] = {
"ОПТИКА", "ДРАЙВЕР"
"ОПТИКА", "ДРАЙВЕР", "ШИМ"
};
constexpr const char *TEST_GROUP_NAMES[] = {
@@ -54,6 +54,7 @@ constexpr const char *START_RUN = "ГОТОВ К ЗАПУСКУ";
constexpr const char *MENU_FREQUENCY = "ЧАСТОТА ШИМ:";
constexpr const char *MENU_TEST_GROUP = "ГРУППА ТЕСТОВ:";
constexpr const char *MENU_MAX_PULSE = "МАКС. ИМПУЛЬС:";
constexpr const char *MENU_PWM_PULSE = "ИМПУЛЬС ШИМ:";
constexpr const char *MENU_MIN_PULSE = "МИН. ИМПУЛЬС:";
constexpr const char *MENU_ACCURACY = "ТОЧНОСТЬ:";
constexpr const char *MENU_TEST_TIME = "ВРЕМЯ ВЫБОРКИ:";
@@ -97,7 +98,7 @@ constexpr const char *ROLE_NAMES[] = {
};
constexpr const char *TEST_NAMES[] = {
"OPTICAL", "DRIVER"
"OPTICAL", "DRIVER", "PWM"
};
constexpr const char *TEST_GROUP_NAMES[] = {
@@ -133,6 +134,7 @@ constexpr const char *START_RUN = "READY TO START";
constexpr const char *MENU_FREQUENCY = "PWM FREQUENCY:";
constexpr const char *MENU_TEST_GROUP = "TEST GROUP:";
constexpr const char *MENU_MAX_PULSE = "MAX PULSE:";
constexpr const char *MENU_PWM_PULSE = "PWM PULSE:";
constexpr const char *MENU_MIN_PULSE = "MIN PULSE:";
constexpr const char *MENU_ACCURACY = "ACCURACY:";
constexpr const char *MENU_TEST_TIME = "TEST TIME:";

View File

@@ -16,9 +16,9 @@ const char *testGroupName(TestGroup group) {
}
const char *testKindName(TestKind kind) {
static const char *names[] = {"OPTICAL", "DRIVER"};
static const char *names[] = {"OPTICAL", "DRIVER", "PWM OUTPUT"};
const uint8_t i = static_cast<uint8_t>(kind);
return i < 2 ? names[i] : "?";
return i < 3 ? names[i] : "?";
}
const char *boardTestName(BoardTest test) {

View File

@@ -5,7 +5,7 @@
enum class Role : uint8_t { SOLO, MASTER, SLAVE };
enum class TestGroup : uint8_t { OPTICS, BOARD };
enum class TestKind : uint8_t { OPTICAL, DRIVER };
enum class TestKind : uint8_t { OPTICAL, DRIVER, PWM_OUTPUT };
enum class BoardTest : uint8_t { ADC, PWM_OUTPUT, RX_INPUT };
enum class LightCode : uint8_t { HH, HL, LH, LL };
enum class FailReason : uint8_t {

View File

@@ -8,17 +8,29 @@
#include <esp_task_wdt.h>
#include <esp_timer.h>
#include <esp32-hal-cpu.h>
#include <soc/gpio_struct.h>
#include <soc/gpio_reg.h>
#include <soc/soc.h>
#include <string.h>
#if CONFIG_IDF_TARGET_ESP32C3
#include <riscv/rv_utils.h>
#endif
static inline uint32_t IRAM_ATTR maskAllInterrupts() {
#if CONFIG_IDF_TARGET_ESP32C3
return RV_CLEAR_CSR(mstatus, MSTATUS_MIE);
#else
uint32_t state;
asm volatile("rsil %0, 15" : "=a"(state) :: "memory");
return state;
#endif
}
static inline void IRAM_ATTR restoreInterrupts(uint32_t state) {
#if CONFIG_IDF_TARGET_ESP32C3
RV_SET_CSR(mstatus, state & MSTATUS_MIE);
#else
asm volatile("wsr %0, ps\nrsync" :: "a"(state) : "memory");
#endif
}
void DriverEdgeStats::reset() {
@@ -193,7 +205,7 @@ void IRAM_ATTR DriverTest::pollTaskLoop() {
constexpr uint32_t PIN_MASK = (1UL << GPIO_PWM) | (1UL << GPIO_RX);
for (;;) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
uint32_t levels = GPIO.in & PIN_MASK;
uint32_t levels = REG_READ(GPIO_IN_REG) & PIN_MASK;
uint32_t nextStart = 0;
uint32_t windowEnd = 0;
uint32_t lastTxStart = 0;
@@ -205,7 +217,7 @@ void IRAM_ATTR DriverTest::pollTaskLoop() {
uint32_t interruptState = 0;
auto sampleOnce = [&]() {
const uint32_t current = GPIO.in & PIN_MASK;
const uint32_t current = REG_READ(GPIO_IN_REG) & PIN_MASK;
if (current == levels) return;
const uint32_t now = esp_cpu_get_cycle_count();
const uint32_t changed = current ^ levels;
@@ -636,8 +648,7 @@ void IRAM_ATTR DriverTest::recordRaw(uint32_t tick, bool rising,
return;
}
ring_[write] = {tick, rising, source};
asm volatile("memw" ::: "memory");
ringWrite_ = next;
__atomic_store_n(&ringWrite_, next, __ATOMIC_RELEASE);
}
size_t DriverTest::readRaw(TimedEvent *events, size_t capacity,

View File

@@ -1,5 +1,11 @@
#include "Config.h"
#ifdef SIGNAL_PROBE_FIRMWARE
#include "SignalProbe.h"
SignalProbe app;
#else
#include "App.h"
App app;
#endif
void setup() { app.begin(); }
void loop() { app.update(); }

View File

@@ -88,6 +88,19 @@ bool PulseReceiver::start(uint32_t expectedHz, float expectedDutyPct,
return startCapture(false);
}
bool PulseReceiver::startRaw() {
if (!queue_ || running_) return false;
#if OPTICAL_USE_MCPWM_CAPTURE
if (!captureTimer_) return false;
#endif
#if !OPTICAL_USE_MCPWM_CAPTURE
cpuTickHz_ = getCpuFrequencyMhz() * 1000000UL;
if (!cpuTickHz_) return false;
#endif
resetStream();
return startCapture(false);
}
#if OPTICAL_USE_MCPWM_CAPTURE
bool PulseReceiver::configureDriverTxCapture(bool risingEdge) {
if (running_) return false;
@@ -376,6 +389,18 @@ size_t PulseReceiver::readPeriods(PulsePeriod *periods, size_t capacity,
return count;
}
size_t PulseReceiver::readRawEdges(CaptureEvent *events, size_t capacity,
TickType_t waitTicks) {
if (!events || !capacity) return 0;
size_t count = 0;
Edge edge = {};
while (count < capacity && nextOrderedEdge(edge, count ? 0 : waitTicks)) {
const TimedEdge timed = extendEdge(edge);
events[count++] = {timed.tick, timed.rising, CaptureSource::RX};
}
return count;
}
size_t PulseReceiver::readEvents(CaptureEvent *events, size_t capacity,
TickType_t waitTicks) {
if (!events || capacity < 3U || !txCaptureEnabled_ || !driverPulseTicks_ ||

View File

@@ -24,11 +24,13 @@ class PulseReceiver {
public:
bool begin();
bool start(uint32_t expectedHz, float expectedDutyPct, bool activeLightOn);
bool startRaw();
bool startDriver(uint32_t frequencyHz, uint32_t pulseNs,
bool activeTxLightOn);
void stop();
void resetStream();
size_t readPeriods(PulsePeriod *periods, size_t capacity, TickType_t waitTicks = 0);
size_t readRawEdges(CaptureEvent *events, size_t capacity, TickType_t waitTicks = 0);
size_t readEvents(CaptureEvent *events, size_t capacity, TickType_t waitTicks = 0);
uint32_t takeDroppedItems();
uint32_t tickHz() const;

View File

@@ -8,10 +8,10 @@
namespace { constexpr uint16_t SETTINGS_VERSION = 11; constexpr char NAMESPACE[] = "opt-test"; }
void SettingsStore::defaults(Settings &s) const {
// 2 kHz, 200 us .. 2 us, 5%, 1 s.
// 2 kHz, 100 us .. 2 us, 5%, 1 s.
s = {SETTINGS_VERSION, static_cast<uint8_t>(Role::SOLO),
static_cast<uint8_t>(TestKind::OPTICAL), static_cast<uint8_t>(LightCode::HH),
2, 6, 3, 2, 3, static_cast<uint8_t>(TestGroup::OPTICS),
2, 4, 3, 2, 3, static_cast<uint8_t>(TestGroup::OPTICS),
static_cast<uint8_t>(BoardTest::ADC), 0};
s.checksum = settingsChecksum(s);
}
@@ -20,9 +20,9 @@ bool SettingsStore::valid(const Settings &s) const {
return s.version == SETTINGS_VERSION && s.role <= static_cast<uint8_t>(Role::SLAVE) &&
s.testGroup <= static_cast<uint8_t>(TestGroup::BOARD) &&
s.boardTest <= static_cast<uint8_t>(BoardTest::RX_INPUT) &&
s.testKind <= static_cast<uint8_t>(TestKind::DRIVER) &&
s.testKind <= static_cast<uint8_t>(TestKind::PWM_OUTPUT) &&
s.lightCode <= static_cast<uint8_t>(LightCode::LL) &&
(s.testKind != static_cast<uint8_t>(TestKind::DRIVER) ||
(s.testKind == static_cast<uint8_t>(TestKind::OPTICAL) ||
s.role == static_cast<uint8_t>(Role::SOLO)) &&
s.frequencyIndex < countOf(PWM_FREQUENCY_OPTIONS_HZ) &&
s.maxPulseIndex < countOf(MAX_PULSE_OPTIONS_NS) &&

View File

@@ -0,0 +1,236 @@
#include "SignalProbe.h"
#include "Config.h"
#include <esp32-hal-cpu.h>
namespace {
constexpr uint32_t DISPLAY_INTERVAL_MS = 250;
constexpr uint8_t PERIOD_TOLERANCE_PCT = 10;
bool pwmPointAvailable(uint32_t frequencyHz, uint32_t pulseNs) {
return static_cast<uint64_t>(frequencyHz) * pulseNs < 1000000000ULL;
}
void formatWidth(uint64_t nanoseconds, char *out, size_t size) {
if (nanoseconds < 1000ULL)
snprintf(out, size, "%lluns", nanoseconds);
else if (nanoseconds < 1000000ULL)
snprintf(out, size, "%.2fus", nanoseconds / 1000.0);
else
snprintf(out, size, "%.2fms", nanoseconds / 1000000.0);
}
void formatPulseCount(uint64_t count, char *out, size_t size) {
if (count < 1000000ULL) snprintf(out, size, "%llu", count);
else if (count < 1000000000ULL) snprintf(out, size, "%lluM", count / 1000000ULL);
else snprintf(out, size, "%lluG", count / 1000000000ULL);
}
}
SignalProbe::SignalProbe() : startButton_(GPIO_BUTTON_START),
modeButton_(GPIO_BUTTON_MODE) {}
void SignalProbe::begin() {
Serial.begin(SERIAL_BAUD);
#if ARDUINO_USB_CDC_ON_BOOT
Serial.setTxTimeoutMs(SERIAL_TX_TIMEOUT_MS);
#endif
setCpuFrequencyMhz(160);
startButton_.begin();
modeButton_.begin();
pwm_.begin();
pwm_.configureActiveLight(true);
display_.begin();
receiverInitialized_ = receiver_.begin();
rxReady_ = receiverInitialized_ && captureStart();
applyPwm();
Serial.printf("Signal probe: MODE short=frequency, MODE long=pulse, START short=reset RX minimum, START long=PWM on/off, hold both=RX active level; RX=%s\n",
rxActiveHigh_ ? "HIGH" : "LOW");
show();
}
bool SignalProbe::captureStart() {
if (!receiver_.startRaw()) {
Serial.println("RX capture start failed");
return false;
}
havePulseStart_ = false;
havePulseEnd_ = false;
extraEdgeInPeriod_ = false;
return true;
}
void SignalProbe::resetMinimum() {
if (rxReady_) receiver_.stop();
rxReady_ = receiverInitialized_ && captureStart();
minTicks_ = UINT64_MAX;
pulseCount_ = 0;
edgeCount_ = 0;
rejectedPeriods_ = 0;
displayDirty_ = true;
Serial.println("RX minimum reset");
}
void SignalProbe::updateCapture() {
if (!rxReady_) return;
CaptureEvent edges[64];
for (uint8_t batch = 0; batch < 8; ++batch) {
const size_t count = receiver_.readRawEdges(edges, countOf(edges));
if (!count) break;
uint64_t batchMinimum = minTicks_;
uint64_t batchPulses = 0;
uint64_t batchRejected = 0;
const bool activeRising = rxActiveHigh_;
const uint32_t expectedHz = PWM_FREQUENCY_OPTIONS_HZ[frequencyIndex_];
const uint64_t expectedPeriod = receiver_.tickHz() / expectedHz;
for (size_t i = 0; i < count; ++i) {
if (edges[i].rising == activeRising) {
if (havePulseStart_) {
const uint64_t period = edges[i].tick - pulseStartTick_;
const uint64_t width = havePulseEnd_
? pulseEndTick_ - pulseStartTick_ : 0;
const uint64_t error = period > expectedPeriod
? period - expectedPeriod : expectedPeriod - period;
if (havePulseEnd_ && !extraEdgeInPeriod_ && period && width && width < period &&
error * 100U <= expectedPeriod * PERIOD_TOLERANCE_PCT) {
if (width < batchMinimum) batchMinimum = width;
++batchPulses;
} else {
++batchRejected;
}
}
pulseStartTick_ = edges[i].tick;
havePulseStart_ = true;
havePulseEnd_ = false;
extraEdgeInPeriod_ = false;
} else if (havePulseStart_ && !havePulseEnd_ &&
edges[i].tick > pulseStartTick_) {
pulseEndTick_ = edges[i].tick;
havePulseEnd_ = true;
} else if (havePulseStart_) {
extraEdgeInPeriod_ = true;
}
}
const uint32_t dropped = receiver_.takeDroppedItems();
if (dropped) {
Serial.printf("RX capture overflow: %lu edges lost; restarting capture\n", dropped);
receiver_.stop();
rxReady_ = captureStart();
displayDirty_ = true;
return;
}
edgeCount_ += count;
pulseCount_ += batchPulses;
rejectedPeriods_ += batchRejected;
displayDirty_ = true;
if (batchMinimum < minTicks_) {
minTicks_ = batchMinimum;
displayDirty_ = true;
}
}
}
void SignalProbe::applyPwm() {
pwm_.stop();
if (!pwmEnabled_) {
Serial.println("PWM off");
displayDirty_ = true;
return;
}
const uint32_t frequency = PWM_FREQUENCY_OPTIONS_HZ[frequencyIndex_];
const uint32_t pulse = MAX_PULSE_OPTIONS_NS[pulseIndex_];
if (!pwm_.start(frequency, pulse, actual_)) {
Serial.printf("PWM start failed: %lu Hz, %lu ns\n", frequency, pulse);
pwmEnabled_ = false;
} else {
Serial.printf("PWM GPIO=%u requested=%luHz/%luns actual=%luHz/%luns\n",
GPIO_PWM, frequency, pulse, actual_.actualHz, actual_.actualPulseNs);
}
displayDirty_ = true;
}
void SignalProbe::advanceFrequency() {
const uint8_t count = static_cast<uint8_t>(countOf(PWM_FREQUENCY_OPTIONS_HZ));
for (uint8_t step = 0; step < count; ++step) {
frequencyIndex_ = static_cast<uint8_t>((frequencyIndex_ + 1U) % count);
if (pwmPointAvailable(PWM_FREQUENCY_OPTIONS_HZ[frequencyIndex_],
MAX_PULSE_OPTIONS_NS[pulseIndex_])) break;
}
applyPwm();
resetMinimum();
}
void SignalProbe::advancePulse() {
const uint8_t count = static_cast<uint8_t>(countOf(MAX_PULSE_OPTIONS_NS));
for (uint8_t step = 0; step < count; ++step) {
pulseIndex_ = static_cast<uint8_t>((pulseIndex_ + 1U) % count);
if (pwmPointAvailable(PWM_FREQUENCY_OPTIONS_HZ[frequencyIndex_],
MAX_PULSE_OPTIONS_NS[pulseIndex_])) break;
}
applyPwm();
resetMinimum();
}
void SignalProbe::show() {
char frequency[16], pulse[16], first[64], second[64];
const uint32_t shownFrequency = pwm_.running() ? actual_.actualHz
: PWM_FREQUENCY_OPTIONS_HZ[frequencyIndex_];
const uint32_t shownPulse = pwm_.running() ? actual_.actualPulseNs
: MAX_PULSE_OPTIONS_NS[pulseIndex_];
Display::formatPwmFrequency(shownFrequency,
frequency, sizeof(frequency));
Display::formatPulse(shownPulse, pulse, sizeof(pulse));
snprintf(first, sizeof(first), "PWM%s %s %s", pwmEnabled_ ? "" : " OFF",
frequency, pulse);
if (!rxReady_) {
snprintf(second, sizeof(second), "RX: ERROR");
} else if (minTicks_ == UINT64_MAX) {
snprintf(second, sizeof(second), "RX E:%llu BAD:%llu", edgeCount_, rejectedPeriods_);
} else {
char width[24], count[12];
const uint64_t nanoseconds =
(minTicks_ * 1000000000ULL + receiver_.tickHz() / 2U) / receiver_.tickHz();
formatWidth(nanoseconds, width, sizeof(width));
formatPulseCount(pulseCount_, count, sizeof(count));
snprintf(second, sizeof(second), "MIN:%s N:%s", width, count);
Serial.printf("RX minimum=%lluns, periods=%llu, rejected=%llu, edges=%llu\n",
nanoseconds, pulseCount_, rejectedPeriods_, edgeCount_);
}
display_.show(first, second, 0, 0, rxActiveHigh_ ? "H" : "L");
lastDisplayMs_ = millis();
displayDirty_ = false;
}
void SignalProbe::update() {
const uint32_t now = millis();
const ButtonEvent start = startButton_.update(now);
const ButtonEvent mode = modeButton_.update(now);
if (startButton_.pressed() && modeButton_.pressed()) {
if (!bothHeld_) {
bothHeld_ = true;
bothHeldSinceMs_ = now;
startButton_.suppressUntilRelease();
modeButton_.suppressUntilRelease();
}
if (!bothHeldHandled_ && now - bothHeldSinceMs_ >= BUTTON_LONG_PRESS_MS) {
rxActiveHigh_ = !rxActiveHigh_;
bothHeldHandled_ = true;
resetMinimum();
Serial.printf("RX active level=%s\n", rxActiveHigh_ ? "HIGH" : "LOW");
}
} else if (bothHeld_) {
if (!startButton_.pressed() && !modeButton_.pressed()) {
bothHeld_ = false;
bothHeldHandled_ = false;
}
} else {
if (mode == ButtonEvent::SHORT) advanceFrequency();
else if (mode == ButtonEvent::LONG) advancePulse();
if (start == ButtonEvent::SHORT) resetMinimum();
else if (start == ButtonEvent::LONG) {
pwmEnabled_ = !pwmEnabled_;
applyPwm();
}
}
updateCapture();
if (displayDirty_ && now - lastDisplayMs_ >= DISPLAY_INTERVAL_MS) show();
}

View File

@@ -0,0 +1,49 @@
#pragma once
#include "Config.h"
#include "Buttons.h"
#include "Display.h"
#include "Pwm.h"
#include "Receiver.h"
class SignalProbe {
public:
SignalProbe();
void begin();
void update();
private:
bool captureStart();
void resetMinimum();
void updateCapture();
void advanceFrequency();
void advancePulse();
void applyPwm();
void show();
Button startButton_, modeButton_;
Display display_;
PwmGenerator pwm_;
PulseReceiver receiver_;
ActualPwm actual_ = {};
uint8_t frequencyIndex_ = 2;
uint8_t pulseIndex_ = 0;
bool pwmEnabled_ = true;
bool rxActiveHigh_ = RX_LIGHT_ON_GPIO_LEVEL == HIGH;
bool receiverInitialized_ = false;
bool rxReady_ = false;
bool havePulseStart_ = false;
bool havePulseEnd_ = false;
bool extraEdgeInPeriod_ = false;
bool displayDirty_ = true;
uint64_t pulseStartTick_ = 0;
uint64_t pulseEndTick_ = 0;
uint64_t minTicks_ = UINT64_MAX;
uint64_t pulseCount_ = 0;
uint64_t edgeCount_ = 0;
uint64_t rejectedPeriods_ = 0;
uint32_t lastDisplayMs_ = 0;
uint32_t bothHeldSinceMs_ = 0;
bool bothHeld_ = false;
bool bothHeldHandled_ = false;
};

BIN
PCB/Libs/MSK12C02.PcbLib Normal file

Binary file not shown.

BIN
PCB/Libs/MSK12C02.SchLib Normal file

Binary file not shown.

5352
PCB/Libs/MSK12C02.step Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -38,23 +38,6 @@ PrefsVaultGUID=
PrefsRevisionGUID=
[Document1]
DocumentPath=..\..\..\..\SSSAlDataBaseLib\SssAccesDatbase.DbLib
AnnotationEnabled=1
AnnotateStartValue=1
AnnotationIndexControlEnabled=0
AnnotateSuffix=
AnnotateScope=All
AnnotateOrder=-1
DoLibraryUpdate=1
DoDatabaseUpdate=1
ClassGenCCAutoEnabled=1
ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document2]
DocumentPath=Libs\Sensor Light.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -71,7 +54,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=XHSRCRCV
[Document3]
[Document2]
DocumentPath=Libs\ESP32-C3-SuperMini.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -86,9 +69,9 @@ ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=MKGCXBOF
DocumentUniqueId=URAFKFNP
[Document4]
[Document3]
DocumentPath=Libs\ESP32-S3-SuperMini.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -103,9 +86,9 @@ ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=XJEJLSFH
DocumentUniqueId=KNRSSPNM
[Document5]
[Document4]
DocumentPath=Libs\HFBR-1528Z_HFBR-2528Z.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -122,7 +105,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document6]
[Document5]
DocumentPath=OptoTest.PcbDoc
AnnotationEnabled=1
AnnotateStartValue=1
@@ -139,7 +122,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=VJUIGDUR
[Document7]
[Document6]
DocumentPath=OptoTest.SchDoc
AnnotationEnabled=1
AnnotateStartValue=1
@@ -156,7 +139,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=OSZVBCBN
[Document8]
[Document7]
DocumentPath=Libs\ESP32-C3-SuperMini.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -173,7 +156,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=SBGUKPNI
[Document9]
[Document8]
DocumentPath=Libs\ESP32-S3-SuperMini.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -190,7 +173,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=BAPDEFTM
[Document10]
[Document9]
DocumentPath=Libs\Switch Push Botton.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -207,7 +190,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document11]
[Document10]
DocumentPath=Libs\Switch Push Botton.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -224,7 +207,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=ITMPIRQI
[Document12]
[Document11]
DocumentPath=Libs\MOD_OLED_0.91_128x32.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -241,7 +224,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document13]
[Document12]
DocumentPath=Libs\MOD_OLED_0.91_128x32.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -258,7 +241,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=UNSXUFGW
[Document14]
[Document13]
DocumentPath=Libs\SN75451BP.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -273,9 +256,9 @@ ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=LJKXCWYK
DocumentUniqueId=A8G5624N
[Document15]
[Document14]
DocumentPath=Libs\SN75451BP.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -292,7 +275,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document16]
[Document15]
DocumentPath=Libs\J_ARK2.Schlib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -307,9 +290,9 @@ ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=KHNXINHC
DocumentUniqueId=HIEGOULK
[Document17]
[Document16]
DocumentPath=Libs\J_ARK2_2.54.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -326,7 +309,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document18]
[Document17]
DocumentPath=Libs\Sensor.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -343,7 +326,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=SCOMYVDB
[Document19]
[Document18]
DocumentPath=Libs\BPW34.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -360,7 +343,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=DEJBNXAE
[Document20]
[Document19]
DocumentPath=Libs\OPA380.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -377,7 +360,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=TPLFYPML
[Document21]
[Document20]
DocumentPath=Libs\OPA380.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -392,9 +375,9 @@ ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=A8G5624N
DocumentUniqueId=MBMSOHVF
[Document22]
[Document21]
DocumentPath=Libs\J_ARK3_2.54.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -411,7 +394,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document23]
[Document22]
DocumentPath=Libs\J_ARK3.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -426,9 +409,9 @@ ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=HIEGOULK
DocumentUniqueId=GMSJVYGO
[Document24]
[Document23]
DocumentPath=Libs\POT.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -445,7 +428,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=JKPGHLQK
[Document25]
[Document24]
DocumentPath=Libs\POT_RK09D1130C2P.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -462,7 +445,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document26]
[Document25]
DocumentPath=Libs\P_HEADER_1x5.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -479,7 +462,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=KQQWVKPH
[Document27]
[Document26]
DocumentPath=Libs\P_HEADER_1x5_2.54_ANGLE.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -496,7 +479,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document28]
[Document27]
DocumentPath=Libs\1208YD.PcbLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -513,7 +496,7 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document29]
[Document28]
DocumentPath=Libs\1208YD.SchLib
AnnotationEnabled=1
AnnotateStartValue=1
@@ -530,66 +513,6 @@ DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=GVWJKGKK
[GeneratedDocument1]
DocumentPath=Project Outputs for OptoTest\OptoTest.DRR
DItemRevisionGUID=
[GeneratedDocument2]
DocumentPath=Project Outputs for OptoTest\OptoTest.EXTREP
DItemRevisionGUID=
[GeneratedDocument3]
DocumentPath=Project Outputs for OptoTest\OptoTest.GBL
DItemRevisionGUID=
[GeneratedDocument4]
DocumentPath=Project Outputs for OptoTest\OptoTest.GBO
DItemRevisionGUID=
[GeneratedDocument5]
DocumentPath=Project Outputs for OptoTest\OptoTest.GBP
DItemRevisionGUID=
[GeneratedDocument6]
DocumentPath=Project Outputs for OptoTest\OptoTest.GBS
DItemRevisionGUID=
[GeneratedDocument7]
DocumentPath=Project Outputs for OptoTest\OptoTest.GKO
DItemRevisionGUID=
[GeneratedDocument8]
DocumentPath=Project Outputs for OptoTest\OptoTest.GTL
DItemRevisionGUID=
[GeneratedDocument9]
DocumentPath=Project Outputs for OptoTest\OptoTest.GTO
DItemRevisionGUID=
[GeneratedDocument10]
DocumentPath=Project Outputs for OptoTest\OptoTest.GTP
DItemRevisionGUID=
[GeneratedDocument11]
DocumentPath=Project Outputs for OptoTest\OptoTest.GTS
DItemRevisionGUID=
[GeneratedDocument12]
DocumentPath=Project Outputs for OptoTest\OptoTest.LDP
DItemRevisionGUID=
[GeneratedDocument13]
DocumentPath=Project Outputs for OptoTest\OptoTest.REP
DItemRevisionGUID=
[GeneratedDocument14]
DocumentPath=Project Outputs for OptoTest\OptoTest.RUL
DItemRevisionGUID=
[GeneratedDocument15]
DocumentPath=Project Outputs for OptoTest\OptoTest.TXT
DItemRevisionGUID=
[Configuration1]
Name=Sources
ParameterCount=0
@@ -709,7 +632,7 @@ OutputDefault20=0
[OutputGroup2]
Name=Simulator Outputs
Description=
TargetPrinter=Microsoft Print to PDF
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
[OutputGroup3]

Binary file not shown.

1
PCB_Charger Submodule

Submodule PCB_Charger added at adbb733cfb

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,1096 @@
[Design]
Version=1.0
HierarchyMode=0
ChannelRoomNamingStyle=0
ReleasesFolder=
ChannelDesignatorFormatString=$Component_$RoomName
ChannelRoomLevelSeperator=_
OpenOutputs=1
ArchiveProject=0
TimestampOutput=0
SeparateFolders=0
TemplateLocationPath=
PinSwapBy_Netlabel=1
PinSwapBy_Pin=1
AllowPortNetNames=0
AllowSheetEntryNetNames=1
AppendSheetNumberToLocalNets=0
NetlistSinglePinNets=0
DefaultConfiguration=Default - All Constraints
UserID=0xFFFFFFFF
DefaultPcbProtel=1
DefaultPcbPcad=0
ReorderDocumentsOnCompile=1
NameNetsHierarchically=0
PowerPortNamesTakePriority=0
PushECOToAnnotationFile=1
DItemRevisionGUID=
ReportSuppressedErrorsInMessages=0
FSMCodingStyle=eFMSDropDownList_OneProcess
FSMEncodingStyle=eFMSDropDownList_OneHot
OutputPath=
LogFolderPath=
ManagedProjectGUID=
IncludeDesignInRelease=0
[Preferences]
PrefsVaultGUID=
PrefsRevisionGUID=
[Document1]
DocumentPath=OptoTest.MbaDoc
AnnotationEnabled=1
AnnotateStartValue=1
AnnotationIndexControlEnabled=0
AnnotateSuffix=
AnnotateScope=All
AnnotateOrder=-1
DoLibraryUpdate=1
DoDatabaseUpdate=1
ClassGenCCAutoEnabled=1
ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=d82442d4-bc50-4074-9a5f-ab3433238eee
[Document2]
DocumentPath=OptoTest.MbsDoc
AnnotationEnabled=1
AnnotateStartValue=1
AnnotationIndexControlEnabled=0
AnnotateSuffix=
AnnotateScope=All
AnnotateOrder=-1
DoLibraryUpdate=1
DoDatabaseUpdate=1
ClassGenCCAutoEnabled=1
ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=8534167a-ea05-4508-a2d2-705219d53200
[Document3]
DocumentPath=..\PCB\OptoTest.PrjPcb
AnnotationEnabled=1
AnnotateStartValue=1
AnnotationIndexControlEnabled=0
AnnotateSuffix=
AnnotateScope=All
AnnotateOrder=-1
DoLibraryUpdate=1
DoDatabaseUpdate=1
ClassGenCCAutoEnabled=1
ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[Document4]
DocumentPath=..\PCB_Charger\J5019_HW357.PrjPcb
AnnotationEnabled=1
AnnotateStartValue=1
AnnotationIndexControlEnabled=0
AnnotateSuffix=
AnnotateScope=All
AnnotateOrder=-1
DoLibraryUpdate=1
DoDatabaseUpdate=1
ClassGenCCAutoEnabled=1
ClassGenCCAutoRoomEnabled=1
ClassGenNCAutoScope=None
DItemRevisionGUID=
GenerateClassCluster=0
DocumentUniqueId=
[OutputGroup1]
Name=Netlist Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=CadnetixNetlist
OutputName1=Cadnetix Netlist
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
OutputType2=CalayNetlist
OutputName2=Calay Netlist
OutputDocumentPath2=
OutputVariantName2=
OutputDefault2=0
OutputType3=EDIF
OutputName3=EDIF for PCB
OutputDocumentPath3=
OutputVariantName3=
OutputDefault3=0
OutputType4=EESofNetlist
OutputName4=EESof Netlist
OutputDocumentPath4=
OutputVariantName4=
OutputDefault4=0
OutputType5=IntergraphNetlist
OutputName5=Intergraph Netlist
OutputDocumentPath5=
OutputVariantName5=
OutputDefault5=0
OutputType6=MentorBoardStationNetlist
OutputName6=Mentor BoardStation Netlist
OutputDocumentPath6=
OutputVariantName6=
OutputDefault6=0
OutputType7=MultiWire
OutputName7=MultiWire
OutputDocumentPath7=
OutputVariantName7=
OutputDefault7=0
OutputType8=OrCadPCB2Netlist
OutputName8=Orcad/PCB2 Netlist
OutputDocumentPath8=
OutputVariantName8=
OutputDefault8=0
OutputType9=PADSNetlist
OutputName9=PADS ASCII Netlist
OutputDocumentPath9=
OutputVariantName9=
OutputDefault9=0
OutputType10=Pcad
OutputName10=Pcad for PCB
OutputDocumentPath10=
OutputVariantName10=
OutputDefault10=0
OutputType11=PCADNetlist
OutputName11=PCAD Netlist
OutputDocumentPath11=
OutputVariantName11=
OutputDefault11=0
OutputType12=PCADnltNetlist
OutputName12=PCADnlt Netlist
OutputDocumentPath12=
OutputVariantName12=
OutputDefault12=0
OutputType13=Protel2Netlist
OutputName13=Protel2 Netlist
OutputDocumentPath13=
OutputVariantName13=
OutputDefault13=0
OutputType14=ProtelNetlist
OutputName14=Protel
OutputDocumentPath14=
OutputVariantName14=
OutputDefault14=0
OutputType15=RacalNetlist
OutputName15=Racal Netlist
OutputDocumentPath15=
OutputVariantName15=
OutputDefault15=0
OutputType16=RINFNetlist
OutputName16=RINF Netlist
OutputDocumentPath16=
OutputVariantName16=
OutputDefault16=0
OutputType17=SciCardsNetlist
OutputName17=SciCards Netlist
OutputDocumentPath17=
OutputVariantName17=
OutputDefault17=0
OutputType18=TangoNetlist
OutputName18=Tango Netlist
OutputDocumentPath18=
OutputVariantName18=
OutputDefault18=0
OutputType19=TelesisNetlist
OutputName19=Telesis Netlist
OutputDocumentPath19=
OutputVariantName19=
OutputDefault19=0
OutputType20=WireListNetlist
OutputName20=WireList Netlist
OutputDocumentPath20=
OutputVariantName20=
OutputDefault20=0
[OutputGroup2]
Name=Simulator Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
[OutputGroup3]
Name=Documentation Outputs
Description=
TargetPrinter=Virtual Printer
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=Composite
OutputName1=Composite Drawing
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType2=PCB 3D Print
OutputName2=PCB 3D Print
OutputDocumentPath2=
OutputVariantName2=[No Variations]
OutputDefault2=0
PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType3=PCB 3D Video
OutputName3=PCB 3D Video
OutputDocumentPath3=
OutputVariantName3=[No Variations]
OutputDefault3=0
PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType4=PCB Print
OutputName4=PCB Prints
OutputDocumentPath4=
OutputVariantName4=
OutputDefault4=0
PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType5=PCBDrawing
OutputName5=Draftsman
OutputDocumentPath5=
OutputVariantName5=[No Variations]
OutputDefault5=0
PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType6=PCBLIB Print
OutputName6=PCBLIB Prints
OutputDocumentPath6=
OutputVariantName6=
OutputDefault6=0
PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType7=PDF3D
OutputName7=PDF3D
OutputDocumentPath7=
OutputVariantName7=[No Variations]
OutputDefault7=0
PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType8=Report Print
OutputName8=Report Prints
OutputDocumentPath8=
OutputVariantName8=
OutputDefault8=0
PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType9=Schematic Print
OutputName9=Schematic Prints
OutputDocumentPath9=
OutputVariantName9=
OutputDefault9=0
PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType10=SimView Print
OutputName10=SimView Prints
OutputDocumentPath10=
OutputVariantName10=
OutputDefault10=0
PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
[OutputGroup4]
Name=Assembly Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=Assembly
OutputName1=Assembly Drawings
OutputDocumentPath1=
OutputVariantName1=[No Variations]
OutputDefault1=0
PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType2=Pick Place
OutputName2=Generates pick and place files
OutputDocumentPath2=
OutputVariantName2=[No Variations]
OutputDefault2=0
OutputType3=Test Points For Assembly
OutputName3=Test Point Report
OutputDocumentPath3=
OutputVariantName3=[No Variations]
OutputDefault3=0
[OutputGroup5]
Name=Fabrication Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=Board Stack Report
OutputName1=Report Board Stack
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType2=CompositeDrill
OutputName2=Composite Drill Drawing
OutputDocumentPath2=
OutputVariantName2=
OutputDefault2=0
PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType3=Drill
OutputName3=Drill Drawing/Guides
OutputDocumentPath3=
OutputVariantName3=
OutputDefault3=0
PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType4=Final
OutputName4=Final Artwork Prints
OutputDocumentPath4=
OutputVariantName4=[No Variations]
OutputDefault4=0
PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType5=Gerber
OutputName5=Gerber Files
OutputDocumentPath5=
OutputVariantName5=[No Variations]
OutputDefault5=0
OutputType6=Gerber X2
OutputName6=Gerber X2 Files
OutputDocumentPath6=
OutputVariantName6=
OutputDefault6=0
OutputType7=IPC2581
OutputName7=IPC-2581 Files
OutputDocumentPath7=
OutputVariantName7=
OutputDefault7=0
OutputType8=Mask
OutputName8=Solder/Paste Mask Prints
OutputDocumentPath8=
OutputVariantName8=
OutputDefault8=0
PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType9=NC Drill
OutputName9=NC Drill Files
OutputDocumentPath9=
OutputVariantName9=
OutputDefault9=0
OutputType10=ODB
OutputName10=ODB++ Files
OutputDocumentPath10=
OutputVariantName10=[No Variations]
OutputDefault10=0
OutputType11=Plane
OutputName11=Power-Plane Prints
OutputDocumentPath11=
OutputVariantName11=
OutputDefault11=0
PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType12=Test Points
OutputName12=Test Point Report
OutputDocumentPath12=
OutputVariantName12=
OutputDefault12=0
[OutputGroup6]
Name=Report Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=BOM_PartType
OutputName1=Bill of Materials
OutputDocumentPath1=
OutputVariantName1=[No Variations]
OutputDefault1=0
PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType2=ComponentCrossReference
OutputName2=Component Cross Reference Report
OutputDocumentPath2=
OutputVariantName2=[No Variations]
OutputDefault2=0
OutputType3=ReportHierarchy
OutputName3=Report Project Hierarchy
OutputDocumentPath3=
OutputVariantName3=[No Variations]
OutputDefault3=0
OutputType4=Script
OutputName4=Script Output
OutputDocumentPath4=
OutputVariantName4=[No Variations]
OutputDefault4=0
OutputType5=SimpleBOM
OutputName5=Simple BOM
OutputDocumentPath5=
OutputVariantName5=[No Variations]
OutputDefault5=0
OutputType6=SinglePinNetReporter
OutputName6=Report Single Pin Nets
OutputDocumentPath6=
OutputVariantName6=[No Variations]
OutputDefault6=0
[OutputGroup7]
Name=Other Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=Text Print
OutputName1=Text Print
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType2=Text Print
OutputName2=Text Print
OutputDocumentPath2=
OutputVariantName2=
OutputDefault2=0
PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType3=Text Print
OutputName3=Text Print
OutputDocumentPath3=
OutputVariantName3=
OutputDefault3=0
PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType4=Text Print
OutputName4=Text Print
OutputDocumentPath4=
OutputVariantName4=
OutputDefault4=0
PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType5=Text Print
OutputName5=Text Print
OutputDocumentPath5=
OutputVariantName5=
OutputDefault5=0
PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType6=Text Print
OutputName6=Text Print
OutputDocumentPath6=
OutputVariantName6=
OutputDefault6=0
PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType7=Text Print
OutputName7=Text Print
OutputDocumentPath7=
OutputVariantName7=
OutputDefault7=0
PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType8=Text Print
OutputName8=Text Print
OutputDocumentPath8=
OutputVariantName8=
OutputDefault8=0
PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType9=Text Print
OutputName9=Text Print
OutputDocumentPath9=
OutputVariantName9=
OutputDefault9=0
PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType10=Text Print
OutputName10=Text Print
OutputDocumentPath10=
OutputVariantName10=
OutputDefault10=0
PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType11=Text Print
OutputName11=Text Print
OutputDocumentPath11=
OutputVariantName11=
OutputDefault11=0
PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType12=Text Print
OutputName12=Text Print
OutputDocumentPath12=
OutputVariantName12=
OutputDefault12=0
PageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType13=Text Print
OutputName13=Text Print
OutputDocumentPath13=
OutputVariantName13=
OutputDefault13=0
PageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType14=Text Print
OutputName14=Text Print
OutputDocumentPath14=
OutputVariantName14=
OutputDefault14=0
PageOptions14=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType15=Text Print
OutputName15=Text Print
OutputDocumentPath15=
OutputVariantName15=
OutputDefault15=0
PageOptions15=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType16=Text Print
OutputName16=Text Print
OutputDocumentPath16=
OutputVariantName16=
OutputDefault16=0
PageOptions16=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType17=Text Print
OutputName17=Text Print
OutputDocumentPath17=
OutputVariantName17=
OutputDefault17=0
PageOptions17=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType18=Text Print
OutputName18=Text Print
OutputDocumentPath18=
OutputVariantName18=
OutputDefault18=0
PageOptions18=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType19=Text Print
OutputName19=Text Print
OutputDocumentPath19=
OutputVariantName19=
OutputDefault19=0
PageOptions19=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType20=Text Print
OutputName20=Text Print
OutputDocumentPath20=
OutputVariantName20=
OutputDefault20=0
PageOptions20=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType21=Text Print
OutputName21=Text Print
OutputDocumentPath21=
OutputVariantName21=
OutputDefault21=0
PageOptions21=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType22=Text Print
OutputName22=Text Print
OutputDocumentPath22=
OutputVariantName22=
OutputDefault22=0
PageOptions22=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType23=Text Print
OutputName23=Text Print
OutputDocumentPath23=
OutputVariantName23=
OutputDefault23=0
PageOptions23=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType24=Text Print
OutputName24=Text Print
OutputDocumentPath24=
OutputVariantName24=
OutputDefault24=0
PageOptions24=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType25=Text Print
OutputName25=Text Print
OutputDocumentPath25=
OutputVariantName25=
OutputDefault25=0
PageOptions25=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType26=Text Print
OutputName26=Text Print
OutputDocumentPath26=
OutputVariantName26=
OutputDefault26=0
PageOptions26=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType27=Text Print
OutputName27=Text Print
OutputDocumentPath27=
OutputVariantName27=
OutputDefault27=0
PageOptions27=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType28=Text Print
OutputName28=Text Print
OutputDocumentPath28=
OutputVariantName28=
OutputDefault28=0
PageOptions28=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType29=Text Print
OutputName29=Text Print
OutputDocumentPath29=
OutputVariantName29=
OutputDefault29=0
PageOptions29=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
[OutputGroup8]
Name=Validation Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=BOM_Violations
OutputName1=BOM Checks Report
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
OutputType2=Component states check
OutputName2=Server's components states check
OutputDocumentPath2=
OutputVariantName2=
OutputDefault2=0
OutputType3=Configuration compliance
OutputName3=Environment configuration compliance check
OutputDocumentPath3=
OutputVariantName3=
OutputDefault3=0
OutputType4=Design Rules Check
OutputName4=Design Rules Check
OutputDocumentPath4=
OutputVariantName4=
OutputDefault4=0
PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType5=Differences Report
OutputName5=Differences Report
OutputDocumentPath5=
OutputVariantName5=
OutputDefault5=0
PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType6=Electrical Rules Check
OutputName6=Electrical Rules Check
OutputDocumentPath6=
OutputVariantName6=
OutputDefault6=0
PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9
OutputType7=Footprint Comparison Report
OutputName7=Footprint Comparison Report
OutputDocumentPath7=
OutputVariantName7=
OutputDefault7=0
[OutputGroup9]
Name=Export Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=AutoCAD dwg/dxf PCB
OutputName1=AutoCAD dwg/dxf File PCB
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
OutputType2=AutoCAD dwg/dxf Schematic
OutputName2=AutoCAD dwg/dxf File Schematic
OutputDocumentPath2=
OutputVariantName2=
OutputDefault2=0
OutputType3=ExportIDF
OutputName3=Export IDF
OutputDocumentPath3=
OutputVariantName3=
OutputDefault3=0
OutputType4=ExportPARASOLID
OutputName4=Export PARASOLID
OutputDocumentPath4=
OutputVariantName4=[No Variations]
OutputDefault4=0
OutputType5=ExportSTEP
OutputName5=Export STEP
OutputDocumentPath5=
OutputVariantName5=[No Variations]
OutputDefault5=0
OutputType6=ExportVRML
OutputName6=Export VRML
OutputDocumentPath6=
OutputVariantName6=[No Variations]
OutputDefault6=0
OutputType7=MBAExportPARASOLID
OutputName7=Export PARASOLID
OutputDocumentPath7=
OutputVariantName7=
OutputDefault7=0
OutputType8=MBAExportSTEP
OutputName8=Export STEP
OutputDocumentPath8=
OutputVariantName8=
OutputDefault8=0
OutputType9=Save As/Export PCB
OutputName9=Save As/Export PCB
OutputDocumentPath9=
OutputVariantName9=
OutputDefault9=0
OutputType10=Save As/Export Schematic
OutputName10=Save As/Export Schematic
OutputDocumentPath10=
OutputVariantName10=
OutputDefault10=0
OutputType11=Specctra Design PCB
OutputName11=Specctra Design PCB
OutputDocumentPath11=
OutputVariantName11=
OutputDefault11=0
[OutputGroup10]
Name=PostProcess Outputs
Description=
TargetPrinter=Adobe PDF
PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1
OutputType1=Copy Files
OutputName1=Copy Files
OutputDocumentPath1=
OutputVariantName1=
OutputDefault1=0
[Modification Levels]
Type1=1
Type2=1
Type3=1
Type4=1
Type5=1
Type6=1
Type7=1
Type8=1
Type9=1
Type10=1
Type11=1
Type12=1
Type13=1
Type14=1
Type15=1
Type16=1
Type17=1
Type18=1
Type19=1
Type20=1
Type21=1
Type22=1
Type23=1
Type24=1
Type25=1
Type26=1
Type27=1
Type28=1
Type29=1
Type30=1
Type31=1
Type32=1
Type33=1
Type34=1
Type35=1
Type36=1
Type37=1
Type38=1
Type39=1
Type40=1
Type41=1
Type42=1
Type43=1
Type44=1
Type45=1
Type46=1
Type47=1
Type48=1
Type49=1
Type50=1
Type51=1
Type52=1
Type53=1
Type54=1
Type55=1
Type56=1
Type57=1
Type58=1
Type59=1
Type60=1
Type61=1
Type62=1
Type63=1
Type64=1
Type65=1
Type66=1
Type67=1
Type68=1
Type69=1
Type70=1
Type71=1
Type72=1
Type73=1
Type74=1
Type75=1
Type76=1
Type77=1
Type78=1
Type79=1
Type80=1
Type81=1
Type82=1
Type83=1
Type84=1
Type85=1
Type86=1
Type87=1
Type88=1
Type89=1
Type90=1
Type91=1
Type92=1
Type93=1
Type94=1
Type95=1
Type96=1
Type97=1
Type98=1
Type99=1
Type100=1
Type101=1
Type102=1
Type103=1
Type104=1
Type105=1
Type106=1
Type107=1
Type108=1
Type109=1
Type110=1
Type111=1
Type112=1
Type113=1
Type114=1
Type115=1
Type116=1
Type117=1
[Difference Levels]
Type1=1
Type2=1
Type3=1
Type4=1
Type5=1
Type6=1
Type7=1
Type8=1
Type9=1
Type10=1
Type11=1
Type12=1
Type13=1
Type14=1
Type15=1
Type16=1
Type17=1
Type18=1
Type19=1
Type20=1
Type21=1
Type22=1
Type23=1
Type24=1
Type25=1
Type26=1
Type27=1
Type28=1
Type29=1
Type30=1
Type31=1
Type32=1
Type33=1
Type34=1
Type35=1
Type36=1
Type37=1
Type38=1
Type39=1
Type40=1
Type41=1
Type42=1
Type43=1
Type44=1
Type45=1
Type46=1
Type47=1
Type48=1
Type49=1
Type50=1
Type51=1
Type52=1
Type53=1
Type54=1
Type55=1
Type56=1
Type57=1
Type58=1
Type59=1
Type60=1
Type61=1
Type62=1
Type63=1
Type64=1
Type65=1
Type66=1
[Electrical Rules Check]
Type1=1
Type2=1
Type3=2
Type4=1
Type5=2
Type6=2
Type7=1
Type8=1
Type9=1
Type10=1
Type11=2
Type12=2
Type13=2
Type14=1
Type15=1
Type16=1
Type17=1
Type18=1
Type19=1
Type20=1
Type21=1
Type22=1
Type23=1
Type24=1
Type25=2
Type26=2
Type27=2
Type28=1
Type29=1
Type30=1
Type31=1
Type32=2
Type33=2
Type34=2
Type35=1
Type36=2
Type37=1
Type38=2
Type39=2
Type40=2
Type41=0
Type42=2
Type43=1
Type44=1
Type45=2
Type46=1
Type47=2
Type48=2
Type49=1
Type50=2
Type51=1
Type52=1
Type53=1
Type54=1
Type55=1
Type56=2
Type57=1
Type58=1
Type59=2
Type60=1
Type61=2
Type62=2
Type63=1
Type64=0
Type65=2
Type66=3
Type67=2
Type68=2
Type69=2
Type70=2
Type71=2
Type72=2
Type73=2
Type74=1
Type75=2
Type76=1
Type77=1
Type78=1
Type79=1
Type80=2
Type81=3
Type82=3
Type83=3
Type84=3
Type85=3
Type86=2
Type87=2
Type88=2
Type89=1
Type90=1
Type91=3
Type92=3
Type93=2
Type94=2
Type95=2
Type96=2
Type97=2
Type98=0
Type99=1
Type100=2
Type101=1
Type102=2
Type103=2
Type104=1
Type105=2
Type106=2
Type107=2
Type108=2
Type109=1
Type110=1
Type111=1
Type112=1
Type113=1
Type114=2
Type115=2
Type116=2
Type117=3
Type118=3
Type119=3
MultiChannelAlternate=2
AlternateItemFail=3
Type122=2
[ERC Connection Matrix]
L1=NNNNNNNNNNNWNNNWW
L2=NNWNNNNWWWNWNWNWN
L3=NWEENEEEENEWNEEWN
L4=NNENNNWEENNWNENWN
L5=NNNNNNNNNNNNNNNNN
L6=NNENNNNEENNWNENWN
L7=NNEWNNWEENNWNENWN
L8=NWEENEENEEENNEENN
L9=NWEENEEEENEWNEEWW
L10=NWNNNNNENNEWNNEWN
L11=NNENNNNEEENWNENWN
L12=WWWWNWWNWWWNWWWNN
L13=NNNNNNNNNNNWNNNWW
L14=NWEENEEEENEWNEEWW
L15=NNENNNNEEENWNENWW
L16=WWWWNWWNWWWNWWWNW
L17=WNNNNNNNWNNNWWWWN
[Annotate]
SortOrder=3
SortLocation=0
MatchParameter1=Comment
MatchStrictly1=1
MatchParameter2=Library Reference
MatchStrictly2=1
PhysicalNamingFormat=$Component_$RoomName
GlobalIndexSortOrder=3
GlobalIndexSortLocation=0
[PrjClassGen]
CompClassManualEnabled=0
CompClassManualRoomEnabled=0
NetClassAutoBusEnabled=1
NetClassAutoCompEnabled=0
NetClassAutoNamedHarnessEnabled=0
NetClassManualEnabled=1
NetClassSeparateForBusSections=0
[LibraryUpdateOptions]
SelectedOnly=0
UpdateVariants=1
PartTypes=0
FullReplace=1
UpdateDesignatorLock=1
UpdatePartIDLock=1
PreserveParameterLocations=1
PreserveParameterVisibility=1
DoGraphics=1
DoParameters=1
DoModels=1
AddParameters=0
RemoveParameters=0
AddModels=1
RemoveModels=1
UpdateCurrentModels=1
[DatabaseUpdateOptions]
SelectedOnly=0
UpdateVariants=1
PartTypes=0
[Comparison Options]
ComparisonOptions0=Kind=Net|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0
ComparisonOptions1=Kind=Net Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0
ComparisonOptions2=Kind=Component Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0
ComparisonOptions3=Kind=Rule|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0
ComparisonOptions4=Kind=Differential Pair|MinPercent=50|MinMatch=1|ShowMatch=0|Confirm=0|UseName=0|InclAllRules=0
ComparisonOptions5=Kind=Structure Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0
[SmartPDF]
PageOptions=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=A4|PaperIndex=9

View File

@@ -0,0 +1,4 @@
Record=DiagramHierarchy|SourceDocument=OptoTest.MbsDoc|Kind=Multi-board Schematic Module|Designator=1|Source=..\PCB\OptoTest.PrjPcb
Record=SubProject|SourceDocument=OptoTest.MbsDoc|ProjectPath=..\PCB\OptoTest.PrjPcb
Record=DiagramHierarchy|SourceDocument=OptoTest.MbsDoc|Kind=Multi-board Schematic Module|Designator=2|Source=..\PCB_Charger\J5019_HW357.PrjPcb
Record=SubProject|SourceDocument=OptoTest.MbsDoc|ProjectPath=..\PCB_Charger\J5019_HW357.PrjPcb

View File

@@ -6,8 +6,8 @@
- неблокирующий конечный автомат без `pulseIn()` и длинных `delay()`;
- общие для оптического и драйверного тестов частота PWM и диапазон импульсов;
- четыре рабочих режима: `SOLO OPTICAL`, `SOLO DRIVER` (только S3),
`MASTER OPTICAL`, `SLAVE OPTICAL`;
- пять рабочих режимов: `SOLO OPTICAL`, `SOLO DRIVER` (только S3),
`SOLO PWM`, `MASTER OPTICAL`, `SLAVE OPTICAL`;
- настраиваемый для теста драйвера код `HH`, `HL`, `LH`, `LL`; в тесте
оптики полярность входного сигнала определяется автоматически;
- аппаратные LEDC (C3) и MCPWM (S3) с расчётом реально получившихся частоты и длительности импульса;
@@ -40,7 +40,8 @@ Arduino sketch находится в каталоге `OpticalChannelTester`:
- `Receiver.*` — MCPWM Capture на S3 / совместимый GPIO fallback;
- `Measurement.*` — строгая проверка периодов;
- `Protocol.*`, `Radio.*` — ESP-NOW;
- `App.*` — общий конечный автомат SOLO/MASTER/SLAVE.
- `App.*` — общий конечный автомат SOLO/MASTER/SLAVE;
- `SignalProbe.*` — тестовый вариант прошивки PWM/Rx.
## Требования Arduino IDE
@@ -187,11 +188,17 @@ MASTER <~~~~ ESP-NOW Wi-Fi channel 6 ~~~~> SLAVE
В ожидании в группе `ОПТИКА` на S3:
- MODE short: `SOLO ОПТИКА → SOLO ДРАЙВЕР → MASTER ОПТИКА → SLAVE ОПТИКА`;
- MODE short: `SOLO ОПТИКА → SOLO ДРАЙВЕР → SOLO ШИМ → MASTER ОПТИКА → SLAVE ОПТИКА`;
- MODE long: открыть настройки;
- START short: начать тест;
- START long во время теста: ABORT, PWM немедленно выключается.
На C3 режим `SOLO ДРАЙВЕР` пропускается. В `SOLO ШИМ` выход непрерывно выдаёт
выбранную частоту и длительность импульса без проверки Rx. Частота задаётся
пунктом `ЧАСТОТА ШИМ`, длительность — пунктом `ИМПУЛЬС ШИМ` (общим с
`МАКС. ИМПУЛЬС` остальных режимов). Удержание START или команда `stop` в
Serial выключает выход.
В ожидании в группе `ПЛАТА`:
- MODE short для аналоговой платы: `АЦП ↔ ШИМ ВЫХОД`;
@@ -256,6 +263,36 @@ START и MODE будят устройство. Первое, пробуждаю
5. время выборки.
6. код света `HH`, `HL`, `LH`, `LL` — только для теста драйвера.
В `SOLO ШИМ` меню показывает только частоту и длительность одного импульса.
### Тестовая прошивка PWM/Rx
Для отдельной проверки сигнала раскомментируйте `#define SIGNAL_PROBE_FIRMWARE`
в `OpticalChannelTester/Config.h` и загрузите тот же скетч. Эта прошивка
при включённом выходе выдаёт выбранный PWM на `GPIO_PWM` и независимо измеряет на
`GPIO_RX` минимальную длительность активного импульса и число пойманных
импульсов. Начальный активный уровень входа задаёт `RX_LIGHT_ON_GPIO_LEVEL`.
Результат показывается на OLED и в Serial
115200; при отсутствии OLED достаточно Serial.
- MODE коротко: следующая частота из `PWM_FREQUENCY_OPTIONS_HZ`;
- MODE удержать: следующая длительность из `MAX_PULSE_OPTIONS_NS`;
- START коротко: сбросить найденный минимум и начать измерение заново;
- START удержать: выключить или включить PWM;
- START и MODE удержать вместе: переключить активный уровень Rx между HIGH и
LOW и сбросить накопленные измерения.
Верхняя строка OLED показывает частоту и длительность импульса PWM; `OFF`
означает выключенный выход. Буква `H` или `L` справа показывает текущий
активный уровень Rx. Нижняя строка показывает минимум и число пойманных
импульсов.
Значения, при которых импульс не помещается в период, пропускаются. В статистику
Rx попадают только полные периоды выбранной частоты; число фронтов и отброшенных
периодов видно на экране, пока подходящие импульсы не найдены. Изменение PWM
сбрасывает накопленные измерения. Для возврата к обычному тестеру закомментируйте
`SIGNAL_PROBE_FIRMWARE` и загрузите скетч снова.
Экран активного уровня:
```text