initial commit
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
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 = DateTime.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user