lapkoshka / rts Goto Github PK
View Code? Open in Web Editor NEWRace Timing System
Race Timing System
Определить разрыв соединения с ридерами и корректно обработать его.
При регистрации сходить в races и посмотреть есть ли записи, если есть, то добавить в попап чекбокс - восстановить историю гонок, если галочка снята и произошел сабмит - историю затереть (предупредить вы уверены?)
Второе окно с Текущим участником, Историей и Итого для просмотра участниками на большом экране
Для того чтобы наполнять таблицу участников из редактирования мероприятия или в принципе при регистрации участника связывать его с текущим мероприятием, нужно переделать существующую схему и метод добавления участника в БД
добавить таблицу на бекенде для хранения связей id мероприятия -> id участника
написать методы в БД по удалению и созданию таких связей
переписать логику регистрации так что несколько меток могут быть привязаны к одному пользователю. Т.е когда всплывает окно, то там появляется возможность привязать новую метку к существующему пользователю (придется разверстать попап реги или даже переписать его с antd).
если всплывает окно реги при обнаружении метки, то в ней стоит галочка по-умолчанию (привязать к текущему мероприятию) и участник связывается с текущим мероприятием
список участников должен управляться следующим образом, есть список в который можно добавить уже из зарегистрированных либо удалить с помощью управляющих кнопок. Нужно теперь связать управление на вьюхе с методами в БД
таблица Участники на вьюхе теперь показывает только тех участников которые связаны с текущим мероприятием
Опционально:
добавить где-нибудь возможность просмотра и управления ВСЕХ зарегистрированных участников
Добавить возможность удалить пользователя из списка участников контеста.
Сейчас реализовать затруднительно, т.к в списке нет данных о том какая именно метка из всех меток пользователя привязана к конкретному контесту. А на руках из данных только contest_id и user.id
Задача: научиться находить по user_id и contest_id ту запись в tag_contest которую нужно удалить. Либо рефакторнуть схему БД чтобы упросить задачу.
Не забыть: Запретить удаление из мероприятия если оно закончено
Выпилить antd в связи с переездом на blueprint
Сейчас приложение главного ридера ищет его в сети среди прочих устройств, возвращает ip, затем подключается по нему.
Это не всегда удобно, хотелось бы подключить ридер напрямую к компьютеру и получить соединение.
На смартбаннере добавить поля для значений констант
Сохранять в настройки при изменении, подгружать чтобы не вводить постоянно руками
Адаптировать index.ts под перезагрузку окна. Неудобно каждый раз закрывать приложение
и пересобирать. Удобно обновляя клиентский код жать CTRL+R и получать тот же результат
что при перезагрузке приложения
Включить в этот процесс Webpack
Поле пустое при добавлении новой записи
Не понял как воспроизвести. Бывает так что в списке активных гонок два одинаковых пользователя.
Понять, подойдет ли эта RFID антенна к этому приёмнику, если да то заказать
http://www.chafon.com/productdetails.aspx?pid=555
Это общая задача призванная декомпозировать, объединить и упорядочить список работ необходимых для правильного отображения результатов.
Все происходит в PR: #70
-------------------------------------------------
Второй экран с результатами
-----------------
Столбец "отставание" на табло
В общих результатах гонки где участники отсортированы от лучшего результата к худшему можно добавить еще один столбец который будет показывать отставание от предыдущей позиции или от лидера (поискать как это обычно делают)
Выводить метки и их RSSI на график так как это было на старой вьюхе (или попизже)
Посмотреть как это было на старой
.env
OLD_VIEW=true
fakePortableTag('666');
fakeMainTag('666', 80);
// подожди пока гонка начнется и тогда закончи ее
fakeMainTag('666', 80);
// симуляция меток
const sleep = timeout => new Promise(resolve => setTimeout(resolve, timeout));
const rnd = (min, max) => Math.round(Math.random() * (max - min) + min);
(async () => {
for (let i = 0; i < 1000; i++) {
await sleep(rnd(50, 150));
const rssi = rnd(50, 80);
fakeMainTag('666', rssi);
}
})()
Справочно:
#10 - еще тасочка с проблемами графика на старой вьюхе
Сейчас на каждый тег происходит полная перерисовка графика методом Plotly.newPlot.
Необходимо найти способ оптимизировать перерисовку, в документации к API Plotly есть методы react и тд для подобных случаев.
Не работает + из за разделения интерфейсов надо теперь отдельно как-то брать данные о пользаках, закомментил в настройках этот функционал
В связи с тем что вся база изменилась, необходимо актуализировать методы в БД связанные с хранением данных гонок
Опционально:
Организовать возможность просмотра кругов при клике на гонку
Воспроизвести:
Увидеть в БД в таблицах users, tags, tag_contest что у пользователя 2 метки и они обе в одном мероприятии
Задача: определять такую ситуацию и не позволять ей происходить
Вероятно стоит перенести текущую логику users.js в results.js, а в users будет только список зарегистрированных пользователей. Из которого и можно будет удалить пользователя.
При попытке подключиться к устройству из под Windows 10 запущенной на виртуальной машине Mac → Parallels получаем ошибку Reader is not found, несмотря на то что устройство доступно, пингуется, веб-морда устройства доступна из браузера.
На первый взгляд причина кроется в том что виртуальная машина находится в своей локальной подсети по маске и шлюзу отличающейся от той в которой находится мастер-хост (хз как еще назвать). Т.е запрос не распространяется за пределы этой подсети.
Возможные решения:
Как воспроизвести:
Подключиться к ридеру нажатием соответствующей клавиши в смартбаннере. Когда статус станет wait и желтым → получить ошибку.
Как починить:
Либо не давать кликать до подключения, либо уничтожать промис с подключением.
Добавить в поле История и Итого еще одну колонку которая будет показывать общее время гонки, а не каждого круга как сейчас. Т.е будет выглядеть следующий образом:
N | Имя | Количество кругов | Общее время | Лучший круг | Удаление
Текущая логика подключения к главному приёмнику такова: в приложении приёмника осуществляется запрос на предмет нахождения устройства в сети, если устройство находится, то происходит возврат найденного IP и по нему осуществляется подключение.
Есть ситуации, в которых приложение не находит устройство, однако оно доступно и его адрес известен. Необходимо дать возможность подключиться к устройству по конкретному IP минуя операцию поиска.
Сейчас это работает так
участник проезжает стартовую черту, его определяет, начинается отсчет, далее он проезжает еще раз и отсчет заканчивается, фиксируется время круга.
Для того чтобы пошло время следующего круга, надо проехать лишний круг и вернуться на стартовую линию.
Нужно добавить возможность отсчитывать след круг сразу после пересечения черты, для того чтобы участник мог кататься подряд (сделать эту возможность настройкой)
Поискать метки EPC (вроде бы) которые было бы удобно клеить на байк, закладываясь на то что у нас будет RFID ковёр (клеить на низ рамы, одноразовые)
В первую очередь:
- addPageListener(type, (_, data)) - пофиксить на удобный формат
- Ipc.send<TYPE> - допилить где нет
- при закрытии приложения экстренно выкидывает ошибку SQL BLABLA API
- папку controllers сделать плоской, race-scenario вытащить в отдельный каталог
- изменение структуры каталогов на server согласно readme файликам
- вытаскиваем создание экземпляров ридеров на уровень контроллеров
- избавление race-scenario от связи с БД
- try catch вокруг dbMorda внутри контроллеров и представления не должно быть, методы базы должны быть изолированы в объект представляющий данный, а ошибки обработаны внутри
- разделение интерфейсов согласно принципу (по всему приложению + тесты) и hydrate данных из базы (все интерфейсы и типы данных взятых из хранилища собираются там же)
- вынос всей логики приложения из сервиса базы
- смена структуры бд методов (лучше наверное перевести в class)
- кажется что viewUpdater должен иметь приватные методы которые дергают обновление конкретных участков клиента и публичные, которые вызываются и называеются характерно для мест вызова (под вопросом), просто очень неудобно следить за вызовами, приходится делать несколько вызовов и читать чтобы не потерять ПРОПУСК
- интерфейс для viewUpdater
- поле id для таблицы tags ПРОПУСК
Во вторую очередь:
- кэширование запросов в БД там где это нужно
- юнит тест на метод getTotalTime() ПРОПУСК
- Кнопка отменить в попап с контестами, а то выход только на Esc
- В попапе редактирования пользователя, если выбрать привязку к существующему пользователю, то следует блокировать поля имя-фамилия для ввода (потому что update не будет)
- добавить на критичных кнопках с модификацией данных попап "Вы уверены?" ПРОПУСК
ХЗ:
В которой можно увидеть в каком статусе находится ридер, если ошибка, то увидеть причину и описание.
Собрать приложение в .exe
TotalInfo
Реализовать показ общих результатов по текущему мероприятию
Привести таблицу "текущая гонка" к общему виду
сейчас она свёрстана на blueprint нативной таблицей и отличается по дизайну от остальных таблиц, задача на переделку таблиц
Грохнуть кнопку удаления в "текущей гонке" на втором экране
Компонент показывающий результаты гонок в главном и второстепенном окне одинаковый, однако из первого окна можно управлять данными (удалять их), а из второго нет. Нужно это исправить.
Не показывать лучший круг если максимальное количество кругов 1
В таблицах есть столбец лучший круг, если в мероприятие настроено на 1 круг, то столбец не нужен.
Столбец "отставание" на табло
В общих результатах гонки где участники отсортированы от лучшего результата к худшему можно добавить еще один столбец который будет показывать отставание от предыдущей позиции или от лидера (поискать как это обычно делают)
Сокращать имя участника до И. Иванов
Нет необходимости писать имя целиком
Это значит что при удалении события в UI не следует удалять его из базы, а лишь не показывать на вьюхе. Это нужно для того что если какой нибудь придурок по ошибке удалит, была бы возможность восстановить данные.
Для лучшего понимания и улучшения процессов отладки следует провести замеры соотношения rssi-сигнала и удаления метки от антенны, для того чтобы определить на каком расстоянии от антенны находится метка.
Какие могут быть сложности:
Нужна форма на которой будет в хронологическом порядке логгироваться гонки и время.
Есть моменты когда rssi-trace timeout недостаточно точно настроен и если гонщик едет довольно медленно, его может поймать и начать следующий круг либо сразу же завершить текущий.
Нужно определять такие моменты по коротким временным интервалам и предотвращать их.
При нажатии на кнопку завершить событие закрывается и более уже не может пополнятся данными. При этом показываем итоговую таблицу результатов
Опционально:
Красиво форматированный список с топ-участниками
У каждого пользователя в БД должен быть уникальный автоинкрементальный ID, который выступает целочисленными уникальным идентификатором. Поиск и агрегацию данных следует осуществлять по нему, т.к. поиск по длинному текстовому uid - дорогая операция.
Уникальной единицей должен быть id пользователя, а не uid метки, а к пользователю может быть привязано уже несколько меток в свою очередь.
Для того чтобы определять в какой момент считать гонку начатой для участника, следует взять трейс меток, например по таймауту и определить метку с наивысшим RSSI. Именно она будет точкой отсчета начала и завершения круга.
опционально:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.