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 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); } } }