Телескопы покупают здесь


A A A A Автор Тема: SatTime - синхронизация времени на компьютере через GPS/ГЛОНАСС/Galileo  (Прочитано 24107 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Не так давно понадобилась мне прогамма для выставления точного времени на компьютере без доступа к интернету, вопрос особенно остро встал при выездах за город с телескопом и использовании компьютера в качестве планетария. Решением мне виделось использование в качестве источника времени GPS-приемник, тем более, в роли его может выступать как обычный коммуникатор (под Android, Windows Mobile и скорее всего под другие мобильные ОС тоже есть софт виртуального GPS COM-порта), подключенный по Bluetooth, Wi-Fi или шнурок, так и специализированное устройство. Поискав в интернете, ничего рабочего найти не удалось, в и тоге на досуге была написана небольшая программка, которая выполняла данную задачу. Надеюсь она еще кому-нибудь пригодится. ;)
Обо всех недочетах и багах по возможности прошу отписываться мне.
Проверена на Windows XP 32bit, Windows 7 32/64bit, Windows 8 32/64bit. При использовании на Windows 7( 8 ) необходимы права Администратора, программа сама их запрашивает при запуске.
Требуется .NET Framework 4 (Client Profile)

Наконец-то дошли руки дописать измененную версию. Теперь на C# осталась только графика, все операции по работе с приемником и выставлении времени написаны на чистом WinAPI.
Из нового функционала:
1. Автостарт синхронизации с помощью параметра -s (SatTime.exe -s), либо опции Sync on run
2. Сохранение настроек
3. Поддержка Galileo
4. Исправлены ошибки
5. Повышена точность времени
6. Новый интерфейс
7. Возможность просмотра и сохранения лога данных
8. Выбор строк NMEA, которые будут использоваться для получения времени
9. Автоматическая синхронизация через заданные интервалы
10. Возможность коррекции ошибки времени
11. Звуковое оповещение наступления новой секунды для ручного выставления времени (новый звук)
12. Сворачивание в трей


При использовании параметра -s обязательно нужно, чтобы родительское приложение обладало правами Администратора, т.е., например, для ярлыка в свойствах необходимо указать "Выполнять эту программу от имени Администратора", если через cmd.exe, то его изначально нужно запустить тоже с администраторскими правами.
Работоспособность новых билдов могу проверить пока только на приемнике с u-blox 5 и Android смартфоне с  GPS/ГЛОНАСС через Bluetooth (кстати, работает точнее). Буду очень признателен сообщениям о проблемах с запуском, работе программы и особенностях поведения с Вашим приемником.
Новая версия (1.2): https://drive.google.com/folderview?id=0B3or78bCO2OHUWd4TWw5MnpuWjg&usp=sharing (скачать с Google Диска, для этого перейдите по ссылке, выберете zip архив, либо SFX (exe), и справа снизу нажмите на стрелку вниз)
Зеркало: https://5223344.ru/pub/sattime/
Изменения от 14.08.2014
« Последнее редактирование: 30 Ноя 2016 [13:37:58] от CEBEP »

Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
С инкапсуляцией внутри NMEAForm явные проблемы...

Вместо
public ListBox NMEAText;
следовало бы сделать
private ListBox NMEAText;

public void AddLog(String data);

Далее, бросаются в глаза очень частые косяки с приведениями типов:
this.NMEADataForm.NMEAText.Items.Add((object) str3);
Application.Run((Form) new MainForm());
Вы по всей видимости недостаточно уверенно представляете себе систему типов в .NET-е и C#: приведение вверх по иерархии для ссылочных типов является операцией неявной, то есть не обязательно указывать приведения явно.

Со списками в ComboBox, ListBox и т.п. есть более эффективные и масштабируемые решения чем те, которые Вы реализуете.
Приведу один пример:

       switch (this.ParityList.Text)
        {
          case "None":
            this.OpenedPort.Parity = Parity.None;
            break;
          case "Even":
            this.OpenedPort.Parity = Parity.Even;
            break;
          case "Mark":
            this.OpenedPort.Parity = Parity.Mark;
            break;
          case "Odd":
            this.OpenedPort.Parity = Parity.Odd;
            break;
          case "Space":
            this.OpenedPort.Parity = Parity.Space;
            break;
          default:
            this.OpenedPort.Parity = Parity.None;
            break;
        }
        // ...
        switch (this.StopBitsList.Text)
        {
          case "1":
            this.OpenedPort.StopBits = StopBits.One;
            break;
          case "1.5":
            this.OpenedPort.StopBits = StopBits.OnePointFive;
            break;
          case "2":
            this.OpenedPort.StopBits = StopBits.Two;
            break;
          default:
            this.OpenedPort.StopBits = StopBits.One;
            break;
        }
Вот два практически идентичных фрагмента.
Введём вспомогательный класс:

internal sealed class DataItem<T>
{
   public String Title {get; private set; }
   public T Data {get; private set; }

  public DataItem(String title, T data)
  {
    this.Title = title;
    this.Data = data;
  }

  public DataItem(T data)
    : this(Convert.ToString(data), data)
  {
  }

  public override String ToString()
  {
    return Title;
  }
}
Теперь заполним ComboBox ParityList и StopBitsList:
foreach (Parity par in Enum.GetValues(typeof(Parity))
{
  ParityList.Items.Add(new DataItem<Parity>(par));
}

StopBitsList.Items.Add(new DataItem<StopBits>("1", StopBits.One));
StopBitsList.Items.Add(new DataItem<StopBits>("1.5", StopBits.OnePointFive));
StopBitsList.Items.Add(new DataItem<StopBits>("2", StopBits.Two));

Теперь использование этих классов будет предельно простым:
this.OpenedPort.StopBits = ((DataItem<StopBits>)this.StopBitsList.SelectedItem).Data;
this.OpenedPort.Parity= ((DataItem<Parity>)this.ParityList.SelectedItem).Data;
Аналогично можно сделать для скорости и количества информационных битов.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
Данный код уже реализован, права администратора и так запрашиваются, при отказе их предоставить программа просто не будет запускаться.
Я этот код вытащил декомпиляцией сборки. Программа просто молча не будет запускаться, без сообщений, а это плохо.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Я этот код вытащил декомпиляцией сборки. Программа просто молча не будет запускаться, без сообщений, а это плохо.

Ну вроде все приложения, которые я встречал, например инсталлеры, при отказе предоставления админских прав просто не запускаются.
Что касается указанных выше замечаний, то за это отдельное спасибо, я еще раз повторюсь, что программирование для меня теперь больше хобби и C# для меня новый язык, так по программерской части мне ближе более низкоуровневые C/Asm и вообще работа с микроконтроллерами :)
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
Ну знаете, сказать причину отказа для программы - это святое.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Далее, бросаются в глаза очень частые косяки с приведениями типов:
this.NMEADataForm.NMEAText.Items.Add((object) str3);
Application.Run((Form) new MainForm());
Вы по всей видимости недостаточно уверенно представляете себе систему типов в .NET-е и C#: приведение вверх по иерархии для ссылочных типов является операцией неявной, то есть не обязательно указывать приведения явно.
Да в исходном коде и нет намека на преобразование типов:
NMEADataForm.NMEAText.Items.Add(InLine);
Application.Run(new MainForm());
или я чего-то недопонимаю?
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
Значит декомпилятор наврал, лишнее влепил. Беру свои слова назад и приношу извинения.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Значит декомпилятор наврал, лишнее влепил. Беру свои слова назад и приношу извинения.
Да нет, большое спасибо за замечания и что не лень было смотреть код ;)
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
Ну и ещё пара замечаний по части производительности.
Строки в .NET являются неизменяемыми объектами. Когда порождается новая строка в результате конкатенации или других действий, они создаются заново, регистрируются в специальном кэше строк и только тогда становятся доступными. Операция конкатенации нескольких строк - достаточно дорогая операция по части работы с памятью, особенно если речь идёт о коротких строках, что ведёт к достаточно серьёзной деградации производительности. Интенсивная работа с мелкими строками, где создаётся много промежуточных строк, увеличивает нагрузку на сборщик мусора, который может достаточно долго заниматься сбором мусора и дефрагментацией памяти малых объектов. Весьма рекомендую почитать про класс StringBuilder. Может быть здесь это и не так актуально, но на будущее будет полезным.
Далее, если хотите отформатировать одну переменную, не следует это делать в виде String.Format("{0:format}", arg), лучше сделать arg.ToString("format").
Второй вопрос касается производительности операции упаковки (boxing). Если Вы используете String.Format с большим количеством аргументов структурных, то стоит подумать о явном форматировании аргументов (если с производительностью действительно не всё хорошо).

А ещё могу посоветовать очень хорошую книгу по C# :)
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Ну и ещё пара замечаний по части производительности.
Строки в .NET являются неизменяемыми объектами. Когда порождается новая строка в результате конкатенации или других действий, они создаются заново, регистрируются в специальном кэше строк и только тогда становятся доступными. Операция конкатенации нескольких строк - достаточно дорогая операция по части работы с памятью, особенно если речь идёт о коротких строках, что ведёт к достаточно серьёзной деградации производительности. Интенсивная работа с мелкими строками, где создаётся много промежуточных строк, увеличивает нагрузку на сборщик мусора, который может достаточно долго заниматься сбором мусора и дефрагментацией памяти малых объектов. Весьма рекомендую почитать про класс StringBuilder. Может быть здесь это и не так актуально, но на будущее будет полезным.
Далее, если хотите отформатировать одну переменную, не следует это делать в виде String.Format("{0:format}", arg), лучше сделать arg.ToString("format").
Второй вопрос касается производительности операции упаковки (boxing). Если Вы используете String.Format с большим количеством аргументов структурных, то стоит подумать о явном форматировании аргументов (если с производительностью действительно не всё хорошо).

А ещё могу посоветовать очень хорошую книгу по C# :)

Давайте, что за книга?
В рамках данного проекта думаю все что указано вами будет перенесено на C++, т.к. обработку строк тоже планирую засунуть в поток и в дллку
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн Shandrik

  • *****
  • Сообщений: 21 721
  • Благодарностей: 929
  • Счастье для всех даром!..
    • Сообщения от Shandrik
А ещё могу посоветовать очень хорошую книгу по C# :)
Посоветуйте  :)
"Иметь, а не быть" - главнейший тезис гниения! (с) Юдин

Где сойдутся воедино Человек и то, чем был он...

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
Книжку вот эту рекомендую:
http://www.proklondike.com/books/dotnet/tray_nash_csharp_kurs_profi.html
После этого курева я свой уровень в разы поднял, правда трава там действительно сильная :)

А ещё есть библиотека TinyGPS, которая разрабатывалась для проекта Arduino, однако великолепно работает и отдельно. Она предоставляет конечный автомат для разбора строк NMEA, Open source.
« Последнее редактирование: 13 Дек 2012 [14:03:44] от Deimos »
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн 1212Lupus

  • *****
  • Сообщений: 3 084
  • Благодарностей: 193
  • Мне стал не очень нравиться этот форум...
    • Сообщения от 1212Lupus
    • http://belastro.net
по программерской части мне ближе более низкоуровневые C/Asm и вообще работа с микроконтроллерами :)
Ой, зря вы это написали -- у меня сразу такие виды на вас нарисовались! В приложении того же тайминга, только хардового.  ;)
Подробности в личке.
Радиоастрономы-любители -- объединяемся!


Если утро наступает в три -
Через два часа уже зажгут фонари.
Уже кончился день, а я только встал,
А я только что встал и уже устал.
(с) НОЛЬ

Оффлайн 1212Lupus

  • *****
  • Сообщений: 3 084
  • Благодарностей: 193
  • Мне стал не очень нравиться этот форум...
    • Сообщения от 1212Lupus
    • http://belastro.net
Сергей, попробовал вашу программку -- чего-то не завелось...  :(

Использовал GPS-приёмник "Garmin 35HVS" с COM-портом. Софтина VisualGPS видит приёмник отлично -- см. первую картинку. А ваша -- только системное время показывает и число спутников... Может это связано с тем, что мой GPS передаёт на порт расширенный список параметров (см. третью картинку)? Какие из них отключить (я могу переконфигурировать GPS)?

Система: Windows XP En SP3.

P.S. Траблы с кнопками, наверно, из-за моей видеокарты.
Радиоастрономы-любители -- объединяемся!


Если утро наступает в три -
Через два часа уже зажгут фонари.
Уже кончился день, а я только встал,
А я только что встал и уже устал.
(с) НОЛЬ

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
Что-то мне подсказывает, что версия 5.0 не за горами ::)
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Сергей, попробовал вашу программку -- чего-то не завелось...  :(

Использовал GPS-приёмник "Garmin 35HVS" с COM-портом. Софтина VisualGPS видит приёмник отлично -- см. первую картинку. А ваша -- только системное время показывает и число спутников... Может это связано с тем, что мой GPS передаёт на порт расширенный список параметров (см. третью картинку)? Какие из них отключить (я могу переконфигурировать GPS)?

Система: Windows XP En SP3.

P.S. Траблы с кнопками, наверно, из-за моей видеокарты.

Вижу в чем проблема, формат времени, выдаваемый приемником без дробной части (миллисекунд), не знал, что такое тоже может быть. Учту. Спасибо!
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
По мелочи сделал следующие изменения:
- поддержку формата времени без миллисекундной части, 1212Lupus, если не сложно, проверте, теперь работает с вашим приемником?
- уведомление при отказе предоставления Администраторских прав
- мелкие исправления

На реальном железе не проверял
« Последнее редактирование: 14 Дек 2012 [12:17:23] от CEBEP »
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн Deimos

  • Модератор
  • *****
  • Сообщений: 17 555
  • Благодарностей: 338
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от Deimos
    • Белорусская любительская астрономическая сеть
А файл где? Обновление приложения в первом сообщении?
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
А файл где? Обновление приложения в первом сообщении?

Да
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3

Оффлайн 1212Lupus

  • *****
  • Сообщений: 3 084
  • Благодарностей: 193
  • Мне стал не очень нравиться этот форум...
    • Сообщения от 1212Lupus
    • http://belastro.net
Провёл тесты с новой версией. Есть следующие проблемы:

1). Всё отображает нормально, но даже при нескольких последовательных нажатиях кнопки "Synch" синхронизация системых часов и GPS-приёмника не достигается -- остаётся разность в ~1 с. См. рис.

2). Сравнение с синхрогизацией системных часов по NTP-серверам тоже не радужное. При переключении между разными серверами и последующей синхронизации (используя "Dimension 4") системные часы "прыгают" на 20-50 мс. Если сделать синхронизацию вашей программой, а потом  сделать синхронизацию с NTP-сервером при помощи "Dimension 4", то появляется сдвиг времени +1/+1,5 с. :(
3). За корректность синхронизации по NTP-серверу говорят и часы другого GPS-приёмника -- расхождение в 0,5-1 с визуально было бы видно сразу. А её нет.

Сергей, попробуйте сравнить синхронизацию своей программой с синхронизацией по NTP-серверу (сначала нажимаем "Synch" в SatTime'е, а потом кнопку "OK" в "Dimension 4" -- она напишет, какую коррекцию провела после синхронизации. Подробнее про настройку "Dimension 4" см. на нашем сайте в известной вам статье).

Какие могут быть причины таких багов? Варианты:

а). Траблы с GPS-приёмником. Завтра постараюсь сделать длинный COM-кабель для другого GPS -- "Garmin eTrex H" -- и повторить эксперимент с ним (GPS приходится выносить в форточку на двухметровой мачте, чтобы ловил нормально сигнал). Заодно проконтролирую по сигналам РВМ.

б). Слабый комп не справляется: тестировал на стареньком AMD Athlon XP 1700+ (1.47 GHz, 768 MB RAM).

в). Баги в самой программе.
Радиоастрономы-любители -- объединяемся!


Если утро наступает в три -
Через два часа уже зажгут фонари.
Уже кончился день, а я только встал,
А я только что встал и уже устал.
(с) НОЛЬ

Оффлайн CEBEPАвтор темы

  • ***
  • Сообщений: 134
  • Благодарностей: 9
  • UB4RAG
    • Сообщения от CEBEP
Провёл тесты с новой версией. Есть следующие проблемы:

1). Всё отображает нормально, но даже при нескольких последовательных нажатиях кнопки "Synch" синхронизация системых часов и GPS-приёмника не достигается -- остаётся разность в ~1 с. См. рис.

2). Сравнение с синхрогизацией системных часов по NTP-серверам тоже не радужное. При переключении между разными серверами и последующей синхронизации (используя "Dimension 4") системные часы "прыгают" на 20-50 мс. Если сделать синхронизацию вашей программой, а потом  сделать синхронизацию с NTP-сервером при помощи "Dimension 4", то появляется сдвиг времени +1/+1,5 с. :(
3). За корректность синхронизации по NTP-серверу говорят и часы другого GPS-приёмника -- расхождение в 0,5-1 с визуально было бы видно сразу. А её нет.

Сергей, попробуйте сравнить синхронизацию своей программой с синхронизацией по NTP-серверу (сначала нажимаем "Synch" в SatTime'е, а потом кнопку "OK" в "Dimension 4" -- она напишет, какую коррекцию провела после синхронизации. Подробнее про настройку "Dimension 4" см. на нашем сайте в известной вам статье).

Какие могут быть причины таких багов? Варианты:

а). Траблы с GPS-приёмником. Завтра постараюсь сделать длинный COM-кабель для другого GPS -- "Garmin eTrex H" -- и повторить эксперимент с ним (GPS приходится выносить в форточку на двухметровой мачте, чтобы ловил нормально сигнал). Заодно проконтролирую по сигналам РВМ.

б). Слабый комп не справляется: тестировал на стареньком AMD Athlon XP 1700+ (1.47 GHz, 768 MB RAM).

в). Баги в самой программе.

Думаю это все-таки вариант "в" :), в последний раз я подправил код, отвечающий как раз за эту процедуру, видимо зря. Будем исправлять
Orion 203mm f/4.9 + HEQ5 Pro + искатель 8х50x90* + гид Deepsky 8x50 в кольцах
Canon 60D + QHY5
БПЦ 7X50 + Турист-3