You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

465 lines
16 KiB

#define _MENU_C
#include <GenericTypeDefs.h>
#include <stdlib.h>
#include "typedefs.h"
#include "mcu.h"
#include "pars.h"
#include "main.h"
#include "isr.h"
#include "pid.h"
#include "OLED.h"
#include "pars.h"
#include "iron.h"
#include "EEP.h"
#include "usb/usb.h"
#include "usb/usb_driver.h"
#include "usb/usb_function_hid.h"
#define intshr(a,b) ((a < 0) ? (-((-a) >> b)) : (a >> b))
static int TempBeep;
static int LISRTicks;
static int CTicks;
static int CSeconds=0;
static int CMSeconds=0;
static int CMinutes=0;
static int CMode;
static int OldMode;
static int CRstTemp;
static int TopPar;
static int CPar;
static int ModeTicks;
static int DoExit;
static int DispTemp;
static int CalRes;
static union {
UINT32 DW;
struct { __PACKED
int Header :1;
int Footer :1;
int BigTemp :1;
int Message :1;
int Set:1;
int Pars:1;
int SetPars:1;
int Cal:1;
}f;
}OLEDFlags;
int OLEDTemp;
int OLEDPower;
const char * OLEDMsg1;
const char * OLEDMsg2;
//static SUINT16 LDispTime;
static struct{
int o;
int n;
int d;
}BTicks[3];
void MenuInit(){
int i,p;
CRstTemp=1;
CPar=0;
TopPar=0;
CTicks=0;
BeepTicks=0;
InvertTicks=0;
for(i=0;i<3;i++){
BTicks[i].o=0;
BTicks[i].n=0;
BTicks[i].d=0;
}
CTTemp=TTemp;
mainFlags.HolderPresent=0;
TempBeep=1;
DispTemp=0;
CMode=1;
ModeTicks=20;
}
void OLEDTasks(){
int i;
//UINT8 b;
t_PIDVars * PV1;
t_PIDVars * PV2;
PV1 = (t_PIDVars *)&PIDVars[0];
PV2 = PV1;
if(IronPars.Config[1].Type) PV2 = (t_PIDVars *)&PIDVars[1];
OLEDFlags.DW=0;
if(mainFlags.PowerLost){
OLEDFlags.f.Message = 1;
OLEDMsg1 = " POWER LOST";
OLEDMsg2 = "";
}
else{
do{
DoExit=1;
switch(CMode){
case 0: //default mode - display temperature and do nothing
if(CTTemp < 75){
CMode = 0xFF;
ModeTicks = 255;
DoExit = 0;
break;
}
if(BTicks[0].n | BTicks[2].n)CMode=1;
if(BTicks[1].o && (BTicks[1].o<100) && (BTicks[1].n==0))CMode=2;
if(CMode != 0){
DoExit = 0;
break;
}
if((BTicks[1].o <= 100) && (BTicks[1].n > 100)){ //goto set parameters menu
CMode=3;
ModeTicks=250;
BeepTicks=2;
}
OLEDFlags.f.Header = 1;
OLEDFlags.f.Footer = 1;
if(IronPars.Config[0].Type == 255){
}
else if(PV1->ShortCircuit || PV2->ShortCircuit){
OLEDFlags.f.Message=1;
OLEDMsg1=" HEATER";
OLEDMsg2=" SHORTCIRCUIT";
}
else if(PV1->NoHeater || PV2->NoHeater){
OLEDFlags.f.Message=1;
OLEDMsg1=" HEATER";
OLEDMsg2=" OPEN";
}
else if(PV1->NoSensor || PV2->NoSensor){
OLEDFlags.f.Message = 1;
OLEDMsg1=" SENSOR";
OLEDMsg2=" OPEN";
}
else{
OLEDFlags.f.BigTemp = 1;
if((LISRTicks & 15) == 1)OLEDTemp = DispTemp >> 3;
}
break;
case 1: //set temperature mode
if(BTicks[1].n > 100)CMode = 0;
if(BTicks[1].o && (BTicks[1].n == 0))CMode = 2; //goto reset temperature mode
if(CMode != 1){
DoExit = 0;
break;
}
if(BTicks[0].n | BTicks[2].n){ //Temp inc/dec
ModeTicks = 100;
i = TTemp;
if(BTicks[0].d)TTemp += (BTicks[0].n>>6) + 1;
if(BTicks[2].d)TTemp -= (BTicks[2].n>>6) + 1;
if(TTemp < 75)TTemp = 75;
if(TTemp > 225)TTemp = 225;
if(i != TTemp)TempBeep = 1;
}
OLEDFlags.f.Header = 1;
OLEDFlags.f.Footer = 1;
OLEDFlags.f.BigTemp = 1;
OLEDFlags.f.Set = 1;
OLEDTemp = TTemp << 2;
break;
case 2: //reset temperature mode
if(BTicks[1].n > 100)CMode = 0;
if(BTicks[0].n | BTicks[2].n)CMode = 1;
if(CMode != 2){
DoExit = 0;
break;
}
if(BTicks[1].o && (BTicks[1].n == 0)){
ModeTicks = 75;
if(OldMode == CMode){
CRstTemp++;
if(CRstTemp > 2)CRstTemp = 0;
}
for(i = 0; i < 3; i++){
if(pars.RTemp[CRstTemp]){
if(TTemp != pars.RTemp[CRstTemp]){
TTemp = pars.RTemp[CRstTemp];
TempBeep = 1;
}
break;
}
CRstTemp++;
if(CRstTemp > 2)CRstTemp=0;
}
if(TTemp < 75)TTemp = 75;
if(TTemp > 225)TTemp = 225;
}
OLEDFlags.f.Header = 1;
OLEDFlags.f.Footer = 1;
OLEDFlags.f.BigTemp = 1;
OLEDFlags.f.Set = 1;
OLEDTemp = TTemp << 2;
break;
case 3:
if(BTicks[0].n | BTicks[1].n | BTicks[2].n){
if((BTicks[1].o <= 100) && (BTicks[1].n > 100)){
CMode = 0;
break;
}
ModeTicks = 250;
if(BTicks[0].n == 1)CPar++;
if(BTicks[2].n == 1)CPar--;
if(CPar < 0)CPar = 0;
if(CPar > ((sizeof(ParDef) / sizeof(ParDef[0])) - 1))CPar = (sizeof(ParDef) / sizeof(ParDef[0])) - 1;
if(TopPar > CPar)TopPar = CPar;
if((CPar - TopPar) > 3)TopPar = CPar - 3;
}
if(BTicks[1].o &&(BTicks[1].o < 100) && (BTicks[1].n == 0)){
CMode = (CPar == ((sizeof(ParDef) / sizeof(ParDef[0])) - 1)) ? 5 : 4;
//CMode=4;
}
OLEDFlags.f.Pars = 1;
//DisplayData(parText[CPar]);
break;
case 4:
if(BTicks[0].n | BTicks[1].n | BTicks[2].n) ModeTicks = 250;
if(BTicks[1].o && (BTicks[1].n == 0))CMode = 3;
OLEDFlags.f.Pars = 1;
if(BTicks[0].d && (pars.b[CPar] < ParDef[CPar].Max))pars.b[CPar] += 1;
if(BTicks[2].d && (pars.b[CPar] > ParDef[CPar].Min))pars.b[CPar] -= 1;
break;
case 5: //Calibration
ModeTicks = 250;
if(BTicks[1].o &&(BTicks[1].o<100) && (BTicks[1].n == 0)){
mainFlags.Calibration = 0;
CMode = 0;
break;
}
mainFlags.Calibration = 1;
OLEDFlags.f.Cal = 1;
if(BTicks[0].d && (IronPars.Config[0].CurrentA < 256)) IronPars.Config[0].CurrentA++;
if(BTicks[2].d && (IronPars.Config[0].CurrentA > 0)) IronPars.Config[0].CurrentA--;
break;
case 0xFF: //stand-by
//OLEDFlags.f.Header = 1;
//OLEDFlags.f.Footer = 1;
//OLEDFlags.f.BigTemp = 1;
//if((LISRTicks & 15) == 1)OLEDTemp = DispTemp >> 3;
OLEDFlags.f.Message=1;
OLEDMsg1=" ZZZ.. . .";
OLEDMsg2="";
break;
}
}while(!DoExit);
}
OLEDFill(0, 128,0 ,8 ,0);
if(OLEDFlags.f.BigTemp){
OLEDPrintNum3248(12, 1, pars.Deg ? ((OLEDTemp * 461) >> 9) + 32 : OLEDTemp >> 1);
OLEDPrintCF1648(108, 1, pars.Deg ? 1 : 0);
//OLEDPrint68(104, 6, "/", 1);
//OLEDPrintNum68(110, 6, 3, CTTemp);
}
if(OLEDFlags.f.Set){
OLEDPrint68(3, 3, "S", 1);
OLEDPrint68(3, 4, "E", 1);
OLEDPrint68(3, 5, "T", 1);
}
if(OLEDFlags.f.Message){
OLEDPrint68(0, 3, OLEDMsg1, 21);
OLEDPrint68(0, 4, OLEDMsg2, 21);
}
if(OLEDFlags.f.Header){
//OLEDPrintNum68(0,0,8,PIDVars[0].CPolyX * 10.0);
//OLEDPrintNum68(64,0,8,PIDVars[0].PrbFCTemp1);
OLEDPrint68(0,0,(const char *)&IronPars.Name, 21);
}
if(OLEDFlags.f.Footer){
UINT8 b;
int p,
df = PIDVars[0].PIDDutyFull,
AVG = ADCAVG;
//OLEDPrintNum88(0, 6, 8, PIDVars[0].Stub);
//OLEDPrintNum88(0, 7, 5, ((PIDVars[0].HVAvg >> ADCAVG) * 840) >> 10);
//OLEDPrintNum88(48, 7, 5, ((PIDVars[0].HIAvg >> ADCAVG) * 241) >> 10);
//OLEDPrintNum88(96, 7, 3, PIDVars[0].HPAvg >> ADCAVG);
OLEDPrint68(0, 7, mainFlags.ACPower ? "AC" : "DC", 2);
if(IronPars.Config[1].Type) AVG--;
p = ((PIDVars[0].PIDDuty + 0x7FL) >> 8) * (PIDVars[0].HPAvg >> AVG);
if(IronPars.Config[1].Type){
df += PIDVars[1].PIDDutyFull;
p += ((PIDVars[1].PIDDuty + 0x7FL) >> 8) * (PIDVars[1].HPAvg >> AVG);
}
else{
df += df;
}
df >>= 19;
p += 0x7FFFL;
p >>= 16;
for(i = 0; i <= 64; i++){
b = 0;
if((i & 1)==0)b += 16;
if((i & 15)==0)b += 40;
if((i & 31)==0)b += 68;
if((i & 63)==0)b += 130;
if(i && df){
df--;
b =~ b;
}
b &= 254;
OLEDBUFF.B[7][i + 31] = b;
}
if((LISRTicks & 15) == 1)OLEDPower = p;
OLEDPrintNum68(100, 7, 3, OLEDPower);
OLEDPrint68(118, 7, "W", 1);
if(HEATER)OLEDWrite(21, 8, 7, font8x8[4], 8);
}
if(OLEDFlags.f.Pars){
i = 4;
while(i--){
OLEDPrint816(0, i * 2, ParDef[TopPar + i].Name, 11);
if(ParDef[TopPar + i].OLEDDispFunc)(*ParDef[TopPar + i].OLEDDispFunc)(88, i * 2, pars.b[TopPar + i]);
if((TopPar + i) == CPar){
if(CMode == 3){
OLEDInvert(0, 128 - 44, i * 2, 2);
}
if(CMode == 4){
OLEDInvert(128 - 44, 44, i * 2, 2);
}
}
}
}
if(OLEDFlags.f.Cal){
UINT32 dw = (INT32)IronPars.Config[0].CurrentA * (INT32)IronPars.Config[0].Gain;
if(dw){
CalRes -= CalRes >> 3;
CalRes += ((INT32)PIDVars[0].ADCTemp[0] * (INT32)33437L) / dw;
}
else{
CalRes = 0;
}
OLEDPrint68(0,0,"CALIBRATION",0);
OLEDPrint68(0,2,"IRON ID:",0);
OLEDPrint68(0,3,"CURRENT:",0);
OLEDPrint68(0,4,"ADC:",0);
OLEDPrint68(0,5,"R:",0);
OLEDPrint68(0,6,"ROOM:",0);
OLEDPrintNum68(64,2,2,IronID >> 8);
OLEDPrintNum68(80,2,2,IronID & 255);
if(IronPars.Config[1].Type==0 || (LISRTicks % 200) <100){
OLEDPrintNum68(64,3,1,0);
OLEDPrintNum68(80,3,3,IronPars.Config[0].CurrentA);
OLEDPrintNum68(32,4,4,PIDVars[0].ADCTemp[0]);
}
else{
OLEDPrintNum68(64,3,1,1);
OLEDPrintNum68(80,3,3,IronPars.Config[1].CurrentB);
OLEDPrintNum68(32,4,4,PIDVars[1].ADCTemp[0]);
}
OLEDPrintNum68(16,5,4,CalRes >> 3);
OLEDPrintNum68(40,6,3,CRTemp >> 1);
}
if(InvertTicks) OLEDInvert(0, 128, 0, 8);
OLEDUpdate();
}
void MenuTasks(){
int i;
if(mainFlags.PowerLost){
OLEDTasks();
}else{
if(LISRTicks != ISRTicks){
LISRTicks = ISRTicks;
if((LISRTicks & 1) || mainFlags.PowerLost){
for(i = 0; i < 3; i++){
BTicks[i].o = BTicks[i].n;
if(BTicks[i].n < 240)BTicks[i].n++;
BTicks[i].d = (BTicks[i].n == 1) || ((BTicks[i].n > 25) && ((LISRTicks & 3) == 1));
}
if(!B1){BTicks[0].n = 0;BTicks[0].d = 0;}
if(!B2){BTicks[1].n = 0;BTicks[1].d = 0;}
if(!B3){BTicks[2].n = 0;BTicks[2].d = 0;}
DispTemp -= DispTemp >> 3;
i = PIDVars[0].CTemp[0];
if(IronPars.Config[1].Type) i = (i + PIDVars[1].CTemp[0]) >> 1;
DispTemp += i;
//i <<= 3;
//if(abs(DispTemp-i)>320)DispTemp=i;
OldMode = CMode;
OLEDTasks();
if(BeepTicks){
BeepTicks--;
SPKON;
}
else
{
SPKOFF;
}
if(InvertTicks)InvertTicks--;
if(ModeTicks){
ModeTicks--;
}
else{
CMode = 0;
}
if(CMode == 0xFF){
ModeTicks = 255;
CTTemp = 0;
}
else{
if((CTicks++) >= 50){
CTicks -= 50;
if(CSeconds < 255)CSeconds++;
if((CMSeconds++) >= 60){
CMSeconds -= 60;
if(CMinutes < 255)CMinutes++;
}
}
if(B1 || B2 || B3 || (((pars.Holder == 1) || ((pars.Holder == 2) && mainFlags.HolderPresent)) && NAP)){
CTicks = 0;
CSeconds = 0;
CMSeconds = 0;
CMinutes = 0;
}
i = TTemp;
if(!NAP){
mainFlags.HolderPresent = 1;
if(i > pars.HTemp) i = pars.HTemp;
}
if(pars.SlTime && (i > pars.SlTemp)){
if((pars.Holder == 1) || ((pars.Holder == 2) && mainFlags.HolderPresent)){
if(CSeconds >= pars.SlTime) i = pars.SlTemp;
}
else{
if(CMinutes >= pars.SlTime) i = pars.SlTemp;
}
}
if(pars.STBTime && (CMinutes >= pars.STBTime)) i = 0;
CTTemp = i;
if(TempBeep && (CTTemp == TTemp) && (CTTemp == (DispTemp >> 5))){
BeepTicks = 2;
TempBeep = 0;
}
}
}
}
}
}
#undef _MENU_C