public static void Main() { int min = 0; // watchdog enable with 5 second timeout GHI.Processor.Watchdog.Enable(5 * 1000); // PWM PWMControl.InitModule(); // state machine //StateM(); // num. battery (serial) battIdx = 0; // init thread ThreadShowParam = new Thread(Program.ShowValues); //ledThread.Start(); // init Timer (http://blog.mark-stevens.co.uk/2013/01/netmf-timers/) tmrCallBack = new TimerCallback(TimerIRQ); autoEvent = new AutoResetEvent(false); ledTimer = new Timer(tmrCallBack, null, 0, 1000); //ledTimer = new Timer(tmrCallBack, autoEvent,Timeout.Infinite, 1000); // init LCD Bitmap LCD = new Bitmap(SystemMetrics.ScreenWidth, SystemMetrics.ScreenHeight); Font font = Resources.GetFont(Resources.FontResources.NinaB); // debug Debug.Print("Program Started"); // clear display LCD.Clear(); LCD.Flush(); // init state machine ctrl StateM.Set(StateM.STATE.CHECK_ERR); // loop while (true) { // reset watchdog GHI.Processor.Watchdog.ResetCounter(); // param read MeasureBattery(); switch (StateM.Get()) { // vbatt < 1V case StateM.STATE.CHECK_ERR: if (vBatt[battIdx] < VBATT_MIN) { LCD.DrawText("ERROR BATTERY n° " + (battIdx + 1), font, Colors.White, 10, 50); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 80); LCD.Flush(); PWMControl.SetDuty(0); StateM.Set(StateM.STATE.ERROR_CHARGE); break; } StateM.Set(StateM.STATE.CHECK_ALREADYCHG); break; // vbatt > 4.6V case StateM.STATE.CHECK_ALREADYCHG: // battery charged if (vBatt[battIdx] > VBATT_ALM) { LCD.Clear(); LCD.DrawText("BATTERY n° " + (battIdx + 1) + " CHARGED!", font, Colors.White, 10, 50); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 80); LCD.Flush(); PWMControl.SetDuty(0); ledTimer.Change(Timeout.Infinite, 1000); StateM.Set(StateM.STATE.FINISH); break; } StateM.Set(StateM.STATE.PRE_CHARGE); break; // vbatt < 3V ==> precharge 65mA case StateM.STATE.PRE_CHARGE: if (vBatt[battIdx] < VBATT_PRECHG) { if (StateM.stsflg) { LCD.Clear(); LCD.DrawText("BATTERY PRE-CHARGE...", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.Flush(); ledTimer.Change(0, 1000); PWMControl.SetDuty(0); StateM.stsflg = false; } PWMControl.IncDirDuty(iBatt[battIdx] < PRECURR); break; } StateM.Set(StateM.STATE.FAST_CHARGE); break; // CONSTANT CURRENT: vbatt > 3V && vbatt < 4.2V ==> charge 350mA case StateM.STATE.FAST_CHARGE: if (vBatt[battIdx] < VBATT_NOM || iBatt[battIdx] < (3 * CHGCURR) / 4) { if (StateM.stsflg) { LCD.Clear(); LCD.DrawText("BATTERY FAST CHARGING: CONST. CURRENT", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.Flush(); ledTimer.Change(0, 500); StateM.stsflg = false; } if (iBatt[battIdx] < (CHGCURR - OFFSCURR)) { if (PWMControl.IncrDuty()) { break; } } else if (iBatt[battIdx] > (CHGCURR + OFFSCURR)) { if (PWMControl.DecrDuty()) { break; } } LCD.Clear(); LCD.DrawText("BATTERY FAST CHARGING: CONST. CURRENT", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80); LCD.DrawText(PWMControl.GetDCString(), font, Colors.White, 10, 110); LCD.Flush(); Thread.Sleep(500); break; } StateM.Set(StateM.STATE.MANT1); break; // CONSTANT VOLTAGE: vbatt >= 4.2 && Ibatt >= 50mA ==> cont. voltage charging vout=4.2V case StateM.STATE.MANT1: if (StateM.stsflg) { LCD.Clear(); LCD.DrawText("BATTERY MANT1: CONST. VOLTAGE", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.Flush(); ledTimer.Change(0, 100); StateM.stsflg = false; } if (iBatt[battIdx] > MANTCURR) { if (vBatt[battIdx] < (VBATT_NOM - OFFSVOLT)) { if (PWMControl.IncrDuty()) { break; } } else if (vBatt[battIdx] > (VBATT_NOM + OFFSVOLT)) { if (PWMControl.DecrDuty()) { break; } } LCD.Clear(); LCD.DrawText("BATTERY MANT1: CONST. VOLTAGE", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80); LCD.DrawText(PWMControl.GetDCString(), font, Colors.White, 10, 110); LCD.Flush(); Thread.Sleep(500); break; } //StateM.Set(StateM.STATE.MANT2); StateM.Set(StateM.STATE.FINISH); break; // vbatt >= 4.2 && Ibatt < 50mA ==> set vout=4.2V for 50min. case StateM.STATE.MANT2: if (vBatt[battIdx] >= VBATT_NOM) { if (StateM.stsflg) { LCD.Clear(); LCD.DrawText("BATTERY MANT2... wait 50min", font, Colors.White, 10, 20); LCD.Flush(); min = 50 * 60 * 2; StateM.stsflg = false; } PWMControl.IncDirDuty(iBatt[battIdx] <= MANTCURR); LCD.Clear(); LCD.DrawText("BATTERY MANT2", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80); LCD.DrawText(PWMControl.GetDCString(), font, Colors.White, 10, 110); LCD.DrawText("Minutes... " + (min / 120), font, Colors.White, 10, 110); LCD.Flush(); min--; Thread.Sleep(500); break; } StateM.Set(StateM.STATE.FINISH); break; // charge complete case StateM.STATE.FINISH: if (battIdx == 0) { if (StateM.stsflg) { LCD.Clear(); LCD.DrawText("BATTERY 1 CHARGED!", font, Colors.White, 10, 20); LCD.Flush(); StateM.stsflg = false; } RELE.Write(true); LED1.Write(true); StateM.Set(StateM.STATE.CHECK_ERR); battIdx = 1; } else { if (StateM.stsflg) { LCD.Clear(); LCD.DrawText("BATTERY FULL CHARGED!!!", font, Colors.White, 10, 20); LCD.DrawText("Vbatt[" + battIdx + "]= " + vBatt[battIdx] + "mV", font, Colors.White, 10, 50); LCD.DrawText("Ibatt[" + battIdx + "]= " + iBatt[battIdx] + "mA", font, Colors.White, 10, 80); LCD.Flush(); RELE.Write(false); LED2.Write(true); StateM.stsflg = false; } Thread.Sleep(2000); } break; default: break; } } // Sleep forever //Thread.Sleep(Timeout.Infinite); //Debug.Print(Resources.GetString(Resources.StringResources.String1)); }
public void ChangeState(StateM newState) { currentState.Exit(this); currentState = newState; currentState.Enter(this); }