initial commit

This commit is contained in:
2026-06-25 12:19:29 +03:00
commit 1160477945
19 changed files with 898 additions and 0 deletions
+98
View File
@@ -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);
}
}
}