98 lines
3.6 KiB
C#
98 lines
3.6 KiB
C#
using System.Runtime.InteropServices.ComTypes;
|
||
using RTCSync.Models;
|
||
using RTCSync.Services;
|
||
using RTCSync.Utils;
|
||
using static RTCSync.Utils.BinaryUtils;
|
||
|
||
namespace RTCSync.Options;
|
||
|
||
public class SetTimeOption : IOption
|
||
{
|
||
public string Description =>
|
||
"Установка времени как в системе, на часах реального времени. Часы будут хранить локальное время (не UTC!). Можно сбросить время до минимального значения используя опцию \"0\".";
|
||
|
||
public List<string> OptionNames => ["-s", "--set-time"];
|
||
|
||
public string OptionValues => "[0]";
|
||
|
||
|
||
public void Execute(OptionArgs args)
|
||
{
|
||
// Console.WriteLine("Вы уверены, что хотите перенастроить время на модуле реального времени? (Д/н)\n");
|
||
// var isConfirmed = false;
|
||
// while (!isConfirmed)
|
||
// {
|
||
// var proof = Console.ReadLine();
|
||
// switch (proof)
|
||
// {
|
||
// case "Н" or "н" or "N" or "n":
|
||
// return;
|
||
// case "Д" or "д" or "Y" or "y":
|
||
// isConfirmed = true;
|
||
// break;
|
||
// }
|
||
// }
|
||
|
||
var device = DeviceDispatcher.SetUpDevice();
|
||
if (device == null)
|
||
return;
|
||
|
||
// ставим текущее время в RTC модуль. Записывается не с первого раза, поэтому хак
|
||
// важно каждый раз пытаться забить актуальное время
|
||
// TODO: убрать хак
|
||
if (args.OptionValues.TryGetValue("unnamed", out var value) && value is "0")
|
||
{
|
||
for (var i = 0; i < 3; i++)
|
||
{
|
||
var dt = DateTime.MinValue;
|
||
DeviceWriters.SetTime(device, dt);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (var i = 0; i < 3; i++)
|
||
{
|
||
// FIXME: вызывает падение на windows 7
|
||
var dt = WindowsTimeUtils.Now();
|
||
DeviceWriters.SetTime(device, dt);
|
||
}
|
||
}
|
||
|
||
Console.WriteLine("Время установлено");
|
||
|
||
|
||
// читаем статус
|
||
var status = DeviceReaders.GetStatusRegister(device);
|
||
DeviceReaders.PrintStatusValues(status);
|
||
|
||
// Сбрасываем OSF (Oscillator Stop Flags) бит 7 регистра 0x0F
|
||
// Иначе часы будут считаться ненадёжными
|
||
Console.WriteLine("Сбрасываем OSF");
|
||
DeviceWriters.ResetOSF(device, status);
|
||
|
||
// заново выводим статус для визуального контроля
|
||
DeviceReaders.PrintStatusValues(device);
|
||
|
||
|
||
// читаем данные контроля
|
||
var control = DeviceReaders.GetControlRegister(device);
|
||
DeviceReaders.PrintControlValues(control);
|
||
|
||
// если осциллятор не включен, то включаем
|
||
if ((control[0] & 0x80) != 0)
|
||
{
|
||
Console.WriteLine("Включаем осциллятор");
|
||
DeviceWriters.EnableEOSC(device, control);
|
||
// заново выводим данные контроля для визуального контроля
|
||
DeviceReaders.PrintControlValues(device);
|
||
}
|
||
|
||
|
||
// все сделали - выводим время
|
||
while (true)
|
||
{
|
||
DeviceReaders.PrintTimeRTC(device);
|
||
Thread.Sleep(500);
|
||
}
|
||
}
|
||
} |