public static void ShowFishOnLine2(LcdConsole console, ref int _fishCount, ref bool _revers, ref int _positionCount) { string tmp = ((char)_fishCount).ToString(); for (int i = 0; i < _positionCount; i++) { tmp = " " + tmp; } console.ReplaceLine(1, tmp); if (_fishCount == 5) { _revers = true; } if (_fishCount == 0) { _revers = false; } if (!_revers) { _fishCount++; } else { _fishCount--; } if (_positionCount < 15) { _positionCount++; } else { _positionCount = 0; } }
/// <summary> /// Write stuff to the display. /// </summary> /// <param name="lcd">The display driver</param> public static void WriteTest(ICharacterLcd lcd) { LcdConsole console = new LcdConsole(lcd, "A00", false); console.LineFeedMode = LineWrapMode.Truncate; Console.WriteLine("Nowrap test:"); console.Write("This is a long text that should not wrap and just extend beyond the display"); console.WriteLine("This has CRLF\r\nin it and should \r\n wrap."); console.Write("This goes to the last line of the display"); console.WriteLine("This isn't printed, because it's off the screen"); Console.ReadLine(); Console.WriteLine("Autoscroll test:"); console.LineFeedMode = LineWrapMode.Wrap; console.WriteLine(); console.WriteLine("Now the display should move up."); console.WriteLine("And more up."); for (int i = 0; i < 20; i++) { console.WriteLine($"This is line {i + 1}/{20}, but longer than the screen"); Thread.Sleep(10); } console.LineFeedMode = LineWrapMode.Wrap; console.WriteLine("Same again, this time with full wrapping."); for (int i = 0; i < 20; i++) { console.Write($"This is string {i + 1}/{20} longer than the screen"); Thread.Sleep(10); } Console.ReadLine(); Console.WriteLine("Intelligent wrapping test"); console.LineFeedMode = LineWrapMode.WordWrap; console.WriteLine("Now intelligent wrapping should wrap this long sentence at word borders and ommit spaces at the start of lines."); Console.WriteLine("Not wrappable test"); Console.ReadLine(); console.WriteLine("NowThisIsOneSentenceInOneWordThatCannotBeWrapped"); Console.ReadLine(); Console.WriteLine("Individual line test"); console.Clear(); console.LineFeedMode = LineWrapMode.Truncate; console.ReplaceLine(0, "This is all garbage that will be replaced"); console.ReplaceLine(0, "Running clock test"); int left = console.Size.Width; Task?alertTask = null; // Let the current time move trought the display on line 1 while (!Console.KeyAvailable) { DateTime now = DateTime.Now; String time = String.Format(CultureInfo.CurrentCulture, "{0}", now.ToLongTimeString()); string printTime = time; if (left > 0) { printTime = new string(' ', left) + time; } else if (left < 0) { printTime = time.Substring(-left); } console.ReplaceLine(1, printTime); left--; // Each full minute, blink the display (but continue writing the time) if (now.Second == 0 && alertTask == null) { alertTask = console.BlinkDisplayAsync(3); } if (alertTask != null && alertTask.IsCompleted) { // Ensure we catch any exceptions (there shouldn't be any...) alertTask.Wait(); alertTask = null; } Thread.Sleep(500); // Restart when the time string has left the display if (left < -time.Length) { left = console.Size.Width; } } alertTask?.Wait(); Console.ReadKey(); Console.WriteLine("Culture Info Test"); LcdCharacterEncoding encoding = LcdConsole.CreateEncoding(CultureInfo.CreateSpecificCulture("de-CH"), "A00", '?', 8); console.LoadEncoding(encoding); console.Clear(); console.ScrollUpDelay = TimeSpan.FromSeconds(1); console.LineFeedMode = LineWrapMode.WordWrap; console.WriteLine(@"Die Ratten im Gemäuer, englischer Originaltitel ""The Rats in the Walls"" " + "ist eine phantastische Kurzgeschichte des amerikanischen Schriftstellers H. P. Lovecraft. Das etwa " + "8000 Wörter umfassende Werk wurde zwischen August und September 1923 verfasst und erschien erstmals " + "im März 1924 im Pulp-Magazin Weird Tales. Der Titel bezieht sich auf das Rascheln von Ratten in den " + "Gemäuern des Familienanwesens, das der Erzähler Delapore nach 300 Jahren auf den Ruinen des Stammsitzes " + "seiner Vorfahren neu errichtet hat. Im Verlauf der Erzählung führen die Ratten Delapore zur Entdeckung " + "des grausigen Geheimnisses der Gruft seines Anwesens und der finsteren Vergangenheit seiner Familie. " + "Nach Lovecraft entstand die Grundidee für die Geschichte, als eines späten Abends seine Tapete zu knistern begann. " + "(von https://de.wikipedia.org/wiki/Die_Ratten_im_Gem%C3%A4uer, CC-BY-SA 3.0)"); console.WriteLine("From A00 default map: "); console.WriteLine("Code: [{|}]^_\\"); console.WriteLine("Greek: Ωαβεπθμ"); console.WriteLine("Others: @ñ¢"); console.WriteLine("Math stuff: ∑÷×∞"); console.WriteLine("German code page"); console.WriteLine("Umlauts: äöüßÄÜÖ"); console.WriteLine("Äußerst ölige, überflüssige Ölfässer im Großhandel von Ützhausen."); console.WriteLine("Currency: ¥€£$"); encoding = LcdConsole.CreateEncoding(CultureInfo.CreateSpecificCulture("fr-fr"), "A00", '?', 8); console.LoadEncoding(encoding); console.Clear(); console.WriteLine("Le français est une langue indo-européenne de la famille des langues romanes. " + "Le français s'est formé en France. Le français est déclaré langue officielle en France en 1539. " + "Après avoir été sous l'Ancien Régime la langue des cours royales et princières, " + "des tsars de Russie aux rois d'Espagne et d'Angleterre en passant par les princes de l'Allemagne, " + "il demeure une langue importante de la diplomatie internationale aux côtés de l'anglais. "); encoding = LcdConsole.CreateEncoding(CultureInfo.CreateSpecificCulture("da-da"), "A00", '?', 8); console.LoadEncoding(encoding); console.Clear(); console.WriteLine("Dansk er et nordgermansk sprog af den østnordiske (kontinentale) gruppe, " + "der tales af ca. seks millioner mennesker. Det er stærkt påvirket af plattysk. Dansk tales " + "også i Sydslesvig (i Flensborg ca. 20 %) samt PÅ FÆRØER OG GRØNLAND."); Console.ReadLine(); Console.WriteLine("Japanese test"); encoding = LcdConsole.CreateEncoding(CultureInfo.CreateSpecificCulture("ja-ja"), "A00", '?', 8); console.LoadEncoding(encoding); console.WriteLine("What about some japanese?"); console.WriteLine("イロハニホヘト"); console.WriteLine("チリヌルヲ"); console.WriteLine("ワカヨタレソ"); console.WriteLine("ツネナラム"); console.WriteLine("ウヰノオクヤマ"); console.WriteLine("ケフコエテ"); console.WriteLine("アサキユメミシ"); console.WriteLine("ヱヒモセス"); console.Clear(); console.Write("Test finished"); console.Dispose(); }
static void Main(string[] args) { Heater heater = null; ConsoleEx.WriteLineWithDate("AquariumController is running"); ConsoleEx.WriteLineWithDate("Setting up I2C..."); I2cConnectionSettings settings = new I2cConnectionSettings(BUSID, I2CADDRESS); I2cDevice device = I2cDevice.Create(settings); ConsoleEx.WriteLineWithDate("Setting up UFire EC Probe..."); Iot.Device.UFire.UFire_pH uFire_pH = new Iot.Device.UFire.UFire_pH(device); uFire_pH.UseTemperatureCompensation(true); ConsoleEx.WriteLineWithDate("Setting up MySql db...."); MySqlConnection conn = new MySqlConnection(ConfigurationManager.AppSettings.Get("ConnectionString")); conn.Open(); ConsoleEx.WriteLineWithDate("Setting up Heater...."); heater = new Heater(conn); Timer saveTemperturTimer = Settings.SetupSaveInterval(conn, "TemperatureSaveInterval", Tempertur.SaveTempertur); Timer savePhTimer = Settings.SetupSaveInterval(conn, "PHSaveInterval", Ph.SavePh); //read setting every 5 minute. AutoResetEvent saveTemperturAutoResetEvent = new AutoResetEvent(false); Timer readSetupTimer = new Timer(Settings.ReadSetup, saveTemperturAutoResetEvent, 0, 5 * 60 * 1000); ConsoleEx.WriteLineWithDate("Setting up GpioController...."); _Controller = new GpioController(); _Controller.OpenPin(AIRPUMPPIN, PinMode.Output); ConsoleEx.WriteLineWithDate("Setting up Lcd1602...."); using (Lcd1602 lcd = new Lcd1602(registerSelectPin: LCDRSPIN, enablePin: LCDENABLEPIN, dataPins: LCDDATA, shouldDispose: true)) { LcdConsole console = new LcdConsole(lcd, "A00", false) { LineFeedMode = LineWrapMode.Wrap, ScrollUpDelay = new TimeSpan(0, 0, 1) }; SetCharacters.FishCharacters(lcd); SetCharacters.TemperatureCharacters(lcd); lcd.SetCursorPosition(0, 0); int _fishCount = 0; bool _revers = false; int _positionCount = 0; while (!Console.KeyAvailable) { try { Tempertur.TemperturValue = Convert.ToDouble(uFire_pH.MeasureTemp()) + Tempertur.TemperturCalibrateOffSet; Ph.PH = Math.Round(uFire_pH.MeasurepH(), 1); string tempterturText = Math.Round(Tempertur.TemperturValue, 1, MidpointRounding.AwayFromZero).ToString() + (char)SetCharacters.TemperatureCharactersNumber; string pHText = Ph.PH + "pH"; console.ReplaceLine(0, tempterturText + " " + pHText); Animation.ShowFishOnLine2(console, ref _fishCount, ref _revers, ref _positionCount); Heater.SetHeaterControlOnOff(conn, Tempertur.TemperturValue); heater.HeaterOnOff(conn); //Blink display if tempertur is over max tempertur if (Tempertur.TemperturValue > Tempertur.TemperatureMax) { console.BlinkDisplay(1); } AirPump.AirPumpOnOff(conn, _Controller, AIRPUMPPIN); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) { ConsoleEx.WriteLineWithDate("Got an error: " + ex.Message + "StackTrace: " + ex.StackTrace); if (ex.InnerException != null) { ConsoleEx.WriteLineWithDate("Error InnerException: " + ex.InnerException.Message); } } finally { Thread.Sleep(1000); } #pragma warning restore CA1031 // Do not catch general exception types } console.Dispose(); } saveTemperturTimer.Dispose(); savePhTimer.Dispose(); readSetupTimer.Dispose(); conn.Close(); conn.Dispose(); _Controller.Dispose(); }