Files

113 lines
4.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 => "{\"HH:mm:ss dd.MM.yyyy\", 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 if (value != null && value != "")
{
for (var i = 0; i < 3; i++)
{
try
{
var dt = DateTime.Parse(value);
DeviceWriters.SetTime(device, dt);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
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);
}
}
}