Дополнено выводом времени на LED screen.

****** Распиновка ******

=== Интерфейсы I/O ===
- PA11/12 - USB
- PA9(Tx), PA10(Rx) - USART1 - консоль отладки / прокси RMC-сообщений GPS (опт. - bluetooth).
- PA2(Tx), PA3(Rx) - USART2 - подключение GPS-приемника.
- PB10(Tx), PB11(Rx) - USART3 - подключение лидара или другой консоли.

=== Остальные порты ===
- PA1  - PPS сигнал от GPS; сюда можно подключать любой дополнительный высокоомный вход напрямую.
- PB0  - TRIG0 - (замыкать на землю).
- PB1  - TRIG1 - подключен к 12В.
- PB3  - TRIG2 - (замыкать на землю).
- PA15 - подтяжка USB.
- PA8  - (не реализовано) - bluetooth "state"
- PB8, PB9 - индикаторные светодиоды (LED1, LED0 соответственно).
- PC13 - пищалка.

=== Светодиоды ===
- LED0 - при отсутствии сигнала PPS просто горит, если PPS появляется - мигает (затухает на 0.25с на каждый сигнал).
- LED1 - индикатор GPS: не горит, если приемник не обнаружен; горит постоянно, если неуверенный прием времени
(буква "V" во второй позиции RMC-сообщения); мигает при уверенном приеме (буква "A" во второй позиции).
Начинать работу можно сразу, как только замигает LED0.


****** Триггеры ******
К TRIG0/TRIG2 подключается кнопка, педаль, иной створ, замыкающий контакты. Никакого внешнего напряжения здесь быть не должно! При необходимости можно использовать ключ на полевом транзисторе или опторазвязке, замыкающий сигнальный контакт на землю.
К TRIG1 нужно подключать 12-вольтный сигнал, ток не меньше 10мА. Если створ имеет открытый коллектор, то выход створа подключается к минусу TRIG2, а к плюсу подключается 12В с источника питания.
В случае ложных срабатываний рекомендуется заземлить катод источника питания хронометра. 

При подключении внешней кнопки желательно, чтобы она имела нормально замкнутые контакты - это предотвратит ложные срабатывания из-за электромагнитных помех.


****** Подключение ******
Хронометр эмулирует "китайский" преобразователь PL2303.

К выходам PA9/PA10 можно подключить преобразователь USART<>USB, накинуть их напрямую на ноги Rx/Tx "малинки" (PA9(Tx) соединить с Rx, PA10(Rx) - с Tx) или подключить к bluetooth-модулю. Этот USART может использоваться (в зависимости от настроек) как дополнительный управляющий терминал или прокси RMC-сообщений GPS-приемника (уже после обработки микроконтроллером, поэтому если МК выключен, а приемник включен, сигнала все равно не будет).

К разъему LIDAR можно подключить лидар, либо настроить его на еще один управляющий терминал. Скорость обоих настраивается в конфигурации.

Для подключения PPS сигнала к "малинке" выведен соответствующий разъем (там используется эмиттерный повторитель, поэтому уровень логической единицы на его выходе около 2.6В, при необходимости можно использовать буфер, согласующий уровни).

Разъемы I2C и SPI используются для подключения к светодиодной панели.
"SPI":
- MOSI - к пину DATA (12)
- SCK - к пину CLK (10)
- MISO - к пинам SCLK (10) и ENABLE (1)
"I2C":
- SCL - к пину A (2)
- SDA - к пину B (4)
- соединить земли панели и хронометра.

Нежелательно подключать пины напрямую, лучше использовать буфер для развязки, иначе есть шанс сжеть микроконтроллер, если прибор будет включен без подачи питания на панель.


****** Конфигурация ******
Хронометр конфигурируется через любой активный управляющий терминал (USB, USART1-Bluetooth, USART3-LIDAR). При наборе команд с клавиатуры в USB-терминале можно использовать клавишу Backspace для удаления неправильно введенных символов.
Чтобы увидеть подсказку, достаточно отправить любую строку, начинающуюся с вопросительного знака. Появится справка:

btnstate - show triggers state
buzzerS - turn buzzer ON/OFF
cls - turn LED display off
curdist - show current LIDAR distance
deletelogs - delete logs from flash memory
distmin - min distance threshold (cm)
distmax - max distance threshold (cm)
dumpN - dump 20 last stored events (no x), all (x<1) or x
evtlenN - duration of the trigger event display (ms)
flash - FLASH info
gateS - check/not check triggers (1/0)
gpsproxyS - GPS proxy over USART1 on/off
gpsrestart - send Full Cold Restart to GPS
gpsstat - get GPS status
gpsstring - current GPS data string
ledsS - turn leds on/off (1/0)
lidarS - switch between LIDAR (1) or command TTY (0)
lidspdN - set LIDAR speed to N
mcutemp - MCU temperature
mesg str - show 'str' at display (no more than 7 chars)
ndumpN - dump Nth log & show on screen (-N - Nth from last)
nfree - warn when free logs space less than this number (0 - not warn)
reset - reset MCU
seS - save/don't save (1/0) trigger events into flash
showconf - show current configuration
showshutterS - show/not show trigger events
showtime - show current time
stautoX - auto start every X minutes (0 or absent - cancel, +/- - increase/decrease by 1min)
stonceX - delayed start after X minutes (like auto)
store - store new configuration in flash
stortest - add test trigger event record into flash
strendC - string ends with \n (C=n) or \r\n (C=r)
time - print current time
triglevelNS - working trigger N level S
trigpauseNP - pause (P, ms) after trigger N shots
trigtimeN - show last trigger N time
usartspdN - set USART1 speed to N
usbreset - reset USB connectioin
vdd - Vdd value


Подробнее (S после команды означает 1 или 0, БЕЗ ПРОБЕЛА! N - число, пробел можно ставить): 
- btnstate - отображение состояния триггеров и уровня PPS, например:
	BTN0=0, BTN1=0, BTN2=0, PPS=0
	означает, что на всех входах сигнала нет. Можно применять эту команду для анализа срабатывания створов, если пищалка выключена.
	
- buzzer - buzzer1 разрешает пищать встроенной пищалке, buzzer0 - запрещает. После команды появляется ответ вроде
	BUZZER=ON
	
- cls - выключить экран.

- curdist - текущее расстояние, измеряемое лидаром.

- deletelogs - очистить из флеш-памяти все записи о времени срабатывания створов.

- distmin, distmax - пределы обнаружения для лидара.

- dump - вывести на терминале дамп последних 20 событий (без параметра N), последних N событий (N>0) или всех.

- evtlen - время (в миллисекундах, по умолчанию 5000), в течение которого на экране будет отображаться время пересечения створа или дампа.

- flash - информация о флеш-памяти, например:
	FLASHSIZE=128kB    	- общий объем памяти
	FLASH_BASE=0x08000000	- базовый адрес хранения прошивки
	Flash_Data=0x08007000	- адрес, с которого начинается хранилище настроек
	varslen=2048		- размер (в байтах) флеш-памяти, выделяемой под хранение конфигурации
	CONFsize=28		- размер (в байтах) одной "ячейки" с конфигурационными данными
	Nconf_records=72	- количество "ячеек" конфигурации, которые можно сохранить, не стирая флеш
	logsstart=0x08007800	- адрес, с которого начинается область хранения логов (дамп событий)
	LOGsize=16		- размер одной "ячейки" лога
	Nlogs_records=6271	- максимальный размер логов

- gate - реагировать на события створов (параметра нет, либо параметр != '0') или нет.

- gpsproxy - проксировать все сообщения GPS на USART1 (разъем Bluetooth), либо не проксировать (если параметр == '0').

- gpsrestart - перезапуск GPS, делает "холодный" рестарт.

- gpsstat - состояние GPS: "not found", если не обнаружено никаких приемников GPS; "waiting" во время поиска спутников; "no satellites" в случае потери спутников (GPRMC имеет статус "not valid"); "valid time", если все хорошо.

- gpsstring - вывод очередного сообщения от GPS. Если все нормально, то появится строка RMC вроде
	$GPRMC,124001.000,A,4340.9369,N,04127.5034,E,0.00,33.26,150819,,,A*5C
	для внешнего GPS появится первая попавшаяся строка.

- leds - включить/выключить диагностические светодиоды (валидны только параметры 1 или 0).

- lidar - настройка порта USART3 (LIDAR): если параметр отсутствует или не равен '0', то порт работает с лидаром, иначе USART3 используется как дополнительный диагностический порт. Если на этом порту ничего нет, выбор режима никак не сказывается на быстродействии.

- lidspd - установка скорости порта USART3 (LIDAR).

- mcutemp - условная температура микроконтроллера (degrC).

- mesg - отобразить на светодиодной панели короткое (максимум 7-8 символов) сообщение. Если до вызова этой команды экран отображал время, то он выходит из режима отображения времени и постоянно показывает сообщение. Для возвращения в режим отображения времени нужно ввести команду showtime. Для вывода сообщений кириллицей терминал должен иметь кодировку КОИ8-Р.

- ndump - отобразить N-ю запись в логе событий (если N<0, то отсчет идет от конца лога: N==-1 - последняя запись, N==-2 - предпоследняя и так далее), при N вне диапазона отображается сообщение об ошибке. Если светодиодная панель находится в режиме showtime, данное время отобразится и на ней в течение eventlen миллисекунд.

- nfree - позволяет установить количество записей до окончания флеша, когда хронометр станет выдавать в консоль предупреждения при каждом сохранении события створа. В случае, если свободной памяти во флеше не останется, попытки сохранения событий будут завершаться сообщениями об ошибке. Автоматической очистки флеша не происходит, необходимо вручну вызвать команду deletelogs.

- reset - перезагрузка микроконтроллера.

- se - с параметром '0' запрещает сохранение событий створов во флеш-память, без параметра или с любым параметром разрешает это.

- showconf - отображение текущей конфигурации, например:
	DISTMIN=50
	DISTMAX=1000
	TRIGLVL=0
	TRIGPAUSE={400, 400, 400, 300}
	USART1SPD=115200
	LIDARSPD=115200
	NFREE=100
	STREND=N
	SAVE_EVENTS=0
	GPSPROXY=0
	LIDAR=1
	EVTLEN=5000
	
	Пункты конфигурации DISTMIN/DISTMAX относятся к лидару.
	TRIGLVL - конфигурация уровней срабатывания, каждый бит, начиная с младшего (всего три младших бита), равен нулю, если для соответствующего триггера срабатывание при переходе 1->0; равен единице, если при переходе 0->1.
	TRIGPAUSE - пауза между срабатываниями створа: если после срабатывания произойдет следующее событие за интервал, меньший заданного, это событие учитываться не будет.
	USART1SPD, LIDARSPD - скорости в бодах соответствующих портов (разъемы "Bluetooth" и "LIDAR").
	NFREE - количество свободных ячеек флеш-памяти, начиная с которого будут выдаваться предупреждения в терминал при сохранении событий створа.
	STREND - окончание строки: N - "\n", RN - "\r\n".
	SAVE_EVENTS - сохранять ли события створов во флеш-памяти микроконтроллера.
	GPSPROXY - проксировать ли сообщения GPS на USART1.
	LIDAR - что находится на разъеме "LIDAR": лидар (1) или управляющий терминал (0).
	EVTLEN - сколько миллисекунд отображается время срабатывания створа на экране.

	При изменении определенных параметров конфигурации команда showconf позволяет убедиться, что все прошло нормально.
	Все изменения, кроме скорости портов, вступают в силу немедленно. Для изменения скорости портов необходимо сохранить конфигурацию во флеш-памяти при помощи команды store, а затем выполнить перезагрузку микроконтроллера. Перезагрузка не отражается на состоянии GPS: если он уже поймал спутники, то точная синхронизация МК будет длиться не более 11-12 секунд, а время с погрешностью в 1-2мс будет установлено через 2-3 секунды после включения.

- showshutter - при вызове команды с параметром '0' события створа не отображаются на светодиодной панели, если же параметр имеет другое значение или опущен, события отображаются.

- showtime - перевести светодиодную панель в режим отображения времени (т.е. отображается текущее время, события створов, обратный отсчет перед стартом). По умолчанию при включении экран показывает сообщение "Chrono", которое можно изменить при помощи команды mesg, отключить экран при помощи команды cls, либо перейти в режим отображения времени этой командой.

- stauto - перейти в режим отложенного автостарта с интервалом в N минут. В режиме активации автостарта параметр N должен иметь значение от 1 до 5. Если же хронометр уже находится в режиме автостарта, можно изменять общий интервал, задавая другое значение N, либо выполнять его инкремент/декремент, вызывая эту команду с N == '+' или '-'. Если текущее значение паузы составляет 1 минуту и вызвана команда stauto-, режим автостарта отключается. Аналогично отключить автостарт можно, вызвав stauto с любым другим параметром, кроме +/- или 1..5. В терминал после вызова команды выдаются соответствующие сообщения. Изменение периода автостарта не сказывается на времени до ближайшего отложенного старта, для его изменения необходимо вызывать команду stonce. 

- stonce - перейти в режим одиночного отложенного старта через N минут. Декремент минут до отложенного старта выполняется на 28 секунде каждой минуты. Если при декременте время до старта становится равным нулю, на 29 секунде запускается обратный отсчет (начиная с 30 секунд), а на 59 секунде отображается сообщение "СТАРТ!". Оба режима - автоматический и одиночный отложенный старт - индицируются на табло отображения времени в крайнем правом столбце: в нижней половине указывается время (в минутах) до старта, в верхней - буква "A" для автостарта и "O" для одиночного старта.

- store - сохранить новую конфигурацию во флеш-памяти МК. Если ничего в конфигурации не менялось, команда пройдет без отклика. Если же были изменения, то в случае успешного сохранения появится сообщение "Success!", иначе будет сообщение об ошибке "Error: can't save data!".

- stortest - сохранить во флеш-памяти тестовую запись с текущим временем.

- strend - выбор окончания строки: "\r\n" (с параметром R или r) или "\n" (с параметром N или n).

- time - отображает текущее время так, как оно бы отобразилось при срабатывании створа, например, 55725.961 (15:28:45). ВРЕМЯ В UTC!!! Первое число - количество секунд и миллисекунд с начала суток по UTC, в скобках указывается человекочитаемое время.

- triglevel - рабочий уровень триггера. Здесь N - номер створа (0..2), S - уровень (0/1). Скажем, чтобы триггер 0 срабатывал при перепаде 1->0, нужно написать команду
	triglevel00
а чтобы триггер 2 срабатывал при перепаде 0->1,
	triglevel21
	
- trigpause - задать паузу для триггера N, пауза в миллисекундах. Если написать 0, паузы не будет, и каждое срабатывание будет вызывать соответствующее сообщение. Эта пауза нужна для защиты от "звона" и нескольких срабатываний на "дырках" в объекте. Меньше 50мс лучше не делать.

- trigtimeN - отображение последнего времени срабатывания триггера N, например, на запрос trigtime0, может быть выведено:
	TRIG0=45212.930 (12:33:32)
Если срабатываний с момента включения не было, выведутся нули:
	TRIG2=0.000 (00:00:00)
	
- usartspd - установить скорость порта USART1 ("Bluetooth").

- usbreset - реинициировать соединение по USB (подтяжка DP к +3.3В отключается и включается снова).

- vdd - напряжение питания микроконтроллера и GPS (3.3В).


****** Режимы ******

Сразу после включения хронометр отображает на экране сообщение "Chrono", реагирует на события створа (в терминале отображается время и длительность, все время активности створа пищит buzzer). Сохранение событий во внутренней флеш-памяти зависит от конфигурации (SAVE_EVENTS). Скорости портов UART1 и UART3 определяются настройками (USART1SPD и LIDARSPD). Уровень срабатывания створов (1->0 или 0->1) тоже определяется настройками (TRIGLVL). 

Обратите внимание на то, что переменная TRIGLVL (так же, как и USART1SPD и LIDARSPD) влияет на конфигурацию устройства лишь при загрузке, поэтому при изменении параметров необходимо сохранить настройки командой store и перезагрузить микроконтроллер командой reset или переподключением питания. 

Прочие параметры конфигурации вступают в силу сразу после сохранения, т.е. их можно менять "на лету". 

Для переключения в режим отображения времени необходимо задать команду "showtime". Только после этого будет возможно отображение текущего времени, времени срабатывания створа, обратного отсчета перед отложенным стартом.

Параметры отложенного старта задаются командами "stonce" и "stauto". В этих режимах отображение времени сопровождается указанием режима работы и временем в минутах до следующего старта. За 30 секунд до старта начинается обратный отсчет, завершающийся отображением в течение 1 секунды сообщения "СТАРТ!".
Автостарт отличается от одиночного старта тем, что после сообщения "СТАРТ!" выполняется обновление счетчика "stonce", в одиночном же режиме после старта прибор входит в простой режим отображения времени.

Команда "showshutter" позволяет разрешать/запрещать отображение времени срабатывания створа на панели. Команда "gate" дает возможность включить или отключить реакцию на створы. Сохранять события створов во флеш-памяти или нет, решает команда "se".

На время бездействия можно отключить экран командой "cls", либо отобразить короткое (7-8 символов) сообщение командой "mesg".

При необходимости просмотреть лог событий створов можно при помощи команд "dump"  (отображает N последних записей) или "ndump" (отображает N-ю запись, если N<0 - отображает |N|-ю запись с конца лога). Команда "ndump" также отображает время на светодиодной панели (если включен режим "showtime").
