//*****************************************
//******** PC Configurator V1.00 **********
//*** (C) - 2001 B.Bowling/A. Grippo ******
//** All derivatives from this software ***
//**  are required to keep this header ****
//*****************************************

static char *rcsId() { return "$Id$"; }

#include "stdafx.h"
#include "megatune.h"
#include "msDatabase.h"
#include "Denrichments.h"
#include "veconst.h"

#ifdef _DEBUG
#  define new DEBUG_NEW
#  undef THIS_FILE
   static char THIS_FILE[] = __FILE__;
#endif

extern msDatabase mdb;

//------------------------------------------------------------------------------
// Denrichments dialog

Denrichments::Denrichments(CWnd * pParent /*=NULL*/ )
 : CDialog(Denrichments::IDD, pParent)
{
   //{{AFX_DATA_INIT(Denrichments)
   //}}AFX_DATA_INIT
}

//------------------------------------------------------------------------------

void Denrichments::DoDataExchange(CDataExchange *pDX)
{
   CDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(Denrichments)
	DDX_Control(pDX, IDC_WWU9_L, m_wwu9L);
	DDX_Control(pDX, IDC_WWU8_L, m_wwu8L);
	DDX_Control(pDX, IDC_WWU7_L, m_wwu7L);
	DDX_Control(pDX, IDC_WWU6_L, m_wwu6L);
	DDX_Control(pDX, IDC_WWU5_L, m_wwu5L);
	DDX_Control(pDX, IDC_WWU4_L, m_wwu4L);
	DDX_Control(pDX, IDC_WWU3_L, m_wwu3L);
	DDX_Control(pDX, IDC_WWU2_L, m_wwu2L);
	DDX_Control(pDX, IDC_WWU1_L, m_wwu1L);
	DDX_Control(pDX, IDC_WWU0_L, m_wwu0L);
	DDX_Control(pDX, IDC_COOLANT_LABEL, m_coolantLabel);
	DDX_Control(pDX, IDC_PW2_LABEL, m_pw2Label);
	DDX_Control(pDX, IDC_PW1_LABEL, m_pw1Label);
	DDX_Control(pDX, IDC_EGOTYPE, m_egoType);
	//}}AFX_DATA_MAP
}

//------------------------------------------------------------------------------

BEGIN_MESSAGE_MAP(Denrichments, CDialog)
   //{{AFX_MSG_MAP(Denrichments)
      ON_BN_CLICKED(IDC_UPE,   OnUpe)
      ON_BN_CLICKED(IDC_DOWNE, OnDowne)

      ON_EN_KILLFOCUS(IDC_CWU,         dbFromFields)
      ON_EN_KILLFOCUS(IDC_CWH ,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_AWEV,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_AWC ,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU0,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU1,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU2,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU3,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU4,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU5,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU6,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU7,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU8,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_WWU9,        dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSTHRESH,   dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSCLKCMP,   dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSAQ0,      dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSAQ1,      dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSAQ2,      dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSAQ3,      dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSDQ,       dbFromFields)
      ON_EN_KILLFOCUS(IDC_EGOTEMP,     dbFromFields)
      ON_EN_KILLFOCUS(IDC_EGOCOUNTCMP, dbFromFields)
      ON_EN_KILLFOCUS(IDC_EGODELTA,    dbFromFields)
      ON_EN_KILLFOCUS(IDC_EGOLIMIT,    dbFromFields)
      ON_EN_KILLFOCUS(IDC_ASYNCACCEL,  dbFromFields)
      ON_EN_KILLFOCUS(IDC_TPSCOLDMULT, dbFromFields)
      ON_EN_KILLFOCUS(IDC_PRIMEP,      dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPMOXLIMIT,  dbFromFields)
      ON_EN_KILLFOCUS(IDC_EGOSWITCHV,  dbFromFields)
      ON_CBN_SELCHANGE(IDC_EGOTYPE,    dbFromFields)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

//------------------------------------------------------------------------------
// Denrichments message handlers

void Denrichments::OnUpe()
{
   mdb.getConst();
   fieldsFromDb();
}

//------------------------------------------------------------------------------

void Denrichments::OnDowne()
{
   dbFromFields();

   mdb.putConstByte(Dprimep);
   mdb.putConstByte(Dcwu);
   mdb.putConstByte(Dcwh);
   mdb.putConstByte(Dawev);
   mdb.putConstByte(Dawc);

   for (int iWE = 0; iWE < 10; iWE++) {
      mdb.putConstByte(Dwwu+iWE);
   }

   mdb.putConstByte(Dtpsthresh);
   mdb.putConstByte(Dtpsaclkcmp);

   for (int iAE = 0; iAE < 4; iAE++) {
      mdb.putConstByte(Dtpsaq+iAE);
   }

   mdb.putConstByte(Dtpsdq);
   mdb.putConstByte(Degotemp);
   mdb.putConstByte(Degocountcmp);
   mdb.putConstByte(Degodelta);
   mdb.putConstByte(Degolimit);
   mdb.putConstByte(Degoswitchv);
   mdb.putConstByte(Dtpsacold);
   mdb.putConstByte(Dtpscoldmult);
   mdb.putConstByte(Drpmoxlimit);

   mdb.burnConst();
}

//------------------------------------------------------------------------------
void logSize(CWnd *w, char *title);

BOOL Denrichments::OnInitDialog()
{
   CDialog::OnInitDialog();

   logSize(this, "enrich");

   boxen[ 0] = static_cast<CEdit *>(GetDlgItem(IDC_CWU ));
   boxen[ 1] = static_cast<CEdit *>(GetDlgItem(IDC_CWH ));
   boxen[ 2] = static_cast<CEdit *>(GetDlgItem(IDC_AWEV));
   boxen[ 3] = static_cast<CEdit *>(GetDlgItem(IDC_AWC ));
   boxen[ 4] = static_cast<CEdit *>(GetDlgItem(IDC_WWU0));
   boxen[ 5] = static_cast<CEdit *>(GetDlgItem(IDC_WWU1));
   boxen[ 6] = static_cast<CEdit *>(GetDlgItem(IDC_WWU2));
   boxen[ 7] = static_cast<CEdit *>(GetDlgItem(IDC_WWU3));
   boxen[ 8] = static_cast<CEdit *>(GetDlgItem(IDC_WWU4));
   boxen[ 9] = static_cast<CEdit *>(GetDlgItem(IDC_WWU5));
   boxen[10] = static_cast<CEdit *>(GetDlgItem(IDC_WWU6));
   boxen[11] = static_cast<CEdit *>(GetDlgItem(IDC_WWU7));
   boxen[12] = static_cast<CEdit *>(GetDlgItem(IDC_WWU8));
   boxen[13] = static_cast<CEdit *>(GetDlgItem(IDC_WWU9));
   boxen[14] = static_cast<CEdit *>(GetDlgItem(IDC_TPSTHRESH));
   boxen[15] = static_cast<CEdit *>(GetDlgItem(IDC_TPSCLKCMP));
   boxen[16] = static_cast<CEdit *>(GetDlgItem(IDC_TPSAQ0));
   boxen[17] = static_cast<CEdit *>(GetDlgItem(IDC_TPSAQ1));
   boxen[18] = static_cast<CEdit *>(GetDlgItem(IDC_TPSAQ2));
   boxen[19] = static_cast<CEdit *>(GetDlgItem(IDC_TPSAQ3));
   boxen[20] = static_cast<CEdit *>(GetDlgItem(IDC_TPSDQ));
   boxen[21] = static_cast<CEdit *>(GetDlgItem(IDC_EGOTEMP));
   boxen[22] = static_cast<CEdit *>(GetDlgItem(IDC_EGOCOUNTCMP));
   boxen[23] = static_cast<CEdit *>(GetDlgItem(IDC_EGODELTA));
   boxen[24] = static_cast<CEdit *>(GetDlgItem(IDC_EGOLIMIT));
   boxen[25] = static_cast<CEdit *>(GetDlgItem(IDC_ASYNCACCEL));
   boxen[26] = static_cast<CEdit *>(GetDlgItem(IDC_TPSCOLDMULT));
   boxen[27] = static_cast<CEdit *>(GetDlgItem(IDC_PRIMEP));
   boxen[28] = static_cast<CEdit *>(GetDlgItem(IDC_RPMOXLIMIT));
   boxen[29] = static_cast<CEdit *>(GetDlgItem(IDC_EGOSWITCHV));

   if (mdb.controllerVersion < 2.0) {
      // Disable the stuff that doesn't work in 1.0.
      boxen[26]->EnableWindow(false);
      boxen[27]->EnableWindow(false);
      boxen[28]->EnableWindow(false);
      m_egoType.EnableWindow(false);
   }

   mdb.fixThermoLabel(m_pw1Label, "Pulsewidth at % 3.0f° F", -40.0);
   mdb.fixThermoLabel(m_pw2Label, "Pulsewidth at % 3.0f° F", 170.0);

   mdb.fixThermoLabel(m_coolantLabel);

   mdb.fixThermoLabel(m_wwu0L, "% 3.0f° ", -40.0);
   mdb.fixThermoLabel(m_wwu1L, "% 3.0f° ", -20.0);
   mdb.fixThermoLabel(m_wwu2L, "% 3.0f° ",   0.0);
   mdb.fixThermoLabel(m_wwu3L, "% 3.0f° ",  20.0);
   mdb.fixThermoLabel(m_wwu4L, "% 3.0f° ",  40.0);
   mdb.fixThermoLabel(m_wwu5L, "% 3.0f° ",  60.0);
   mdb.fixThermoLabel(m_wwu6L, "% 3.0f° ",  80.0);
   mdb.fixThermoLabel(m_wwu7L, "% 3.0f° ", 100.0);
   mdb.fixThermoLabel(m_wwu8L, "% 3.0f° ", 130.0);
   mdb.fixThermoLabel(m_wwu9L, "% 3.0f° ", 160.0);

   if (!mdb.loaded()) mdb.getConst();
   fieldsFromDb();

   return TRUE;
}

//------------------------------------------------------------------------------

BEGIN_EVENTSINK_MAP(Denrichments, CDialog)
   //{{AFX_EVENTSINK_MAP(Denrichments)
   //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

//------------------------------------------------------------------------------

static inline void setFld(CEdit *c, double d, int w=1) { char s[11]; sprintf(s, "%.*f", w, d); c->SetWindowText(s); }
static inline void setFld(CEdit *c, int    i) { char s[11]; sprintf(s, "%d",   i); c->SetWindowText(s); }

void Denrichments::fieldsFromDb()
{
   setFld(boxen[ 0], double(mdb.Const(Dcwu        )) / 10.0);
   setFld(boxen[ 1], double(mdb.Const(Dcwh        )) / 10.0);
   setFld(boxen[ 2], double(mdb.Const(Dawev       )));
   setFld(boxen[ 3],        mdb.Const(Dawc        ));
   setFld(boxen[ 4],        mdb.Const(Dwwu        ));
   setFld(boxen[ 5],        mdb.Const(Dwwu+1      ));
   setFld(boxen[ 6],        mdb.Const(Dwwu+2      ));
   setFld(boxen[ 7],        mdb.Const(Dwwu+3      ));
   setFld(boxen[ 8],        mdb.Const(Dwwu+4      ));
   setFld(boxen[ 9],        mdb.Const(Dwwu+5      ));
   setFld(boxen[10],        mdb.Const(Dwwu+6      ));
   setFld(boxen[11],        mdb.Const(Dwwu+7      ));
   setFld(boxen[12],        mdb.Const(Dwwu+8      ));
   setFld(boxen[13],        mdb.Const(Dwwu+9      ));
   setFld(boxen[14], double(mdb.Const(Dtpsthresh  )) / 5.12, 2);
   setFld(boxen[15], double(mdb.Const(Dtpsaclkcmp )) / 10.0);
   setFld(boxen[16], double(mdb.Const(Dtpsaq      )) / 10.0);
   setFld(boxen[17], double(mdb.Const(Dtpsaq+1    )) / 10.0);
   setFld(boxen[18], double(mdb.Const(Dtpsaq+2    )) / 10.0);
   setFld(boxen[19], double(mdb.Const(Dtpsaq+3    )) / 10.0);
   setFld(boxen[20],        mdb.Const(Dtpsdq      ));
   setFld(boxen[21], mdb.tempFromDb(mdb.Const(Degotemp) - 40));
   setFld(boxen[22],        mdb.Const(Degocountcmp));
   setFld(boxen[23],        mdb.Const(Degodelta   ));
   setFld(boxen[24],        mdb.Const(Degolimit   ));
   setFld(boxen[25], double(mdb.Const(Dtpsacold   )) / 10.0);
   setFld(boxen[26],        mdb.Const(Dtpscoldmult));
   setFld(boxen[27], double(mdb.Const(Dprimep     )) / 10.0);
   setFld(boxen[28],        mdb.Const(Drpmoxlimit )  * 100);
   setFld(boxen[29], double(mdb.Const(Degoswitchv) / 255.0 * 5.0+0.005), 3);
   m_egoType.SetCurSel(mdb.egoType());
}

//------------------------------------------------------------------------------

int Denrichments::getFld(CEdit *fld, double lo, double hi, char *label, double scale, int trans)
{
   char   pp[20];
   char   msg[100];
   double dtt;
   int    itt;
   int    fldWid = scale <= 1.0 ? 0 : 1;

   fld->GetWindowText(pp, 20);
   sscanf(pp, "%lf", &dtt);
   if (trans != 0) dtt = mdb.dbFromTemp(dtt);
   itt = int(dtt * scale) + trans;

   if (dtt < lo) {
      itt = int(lo * scale) + trans;
      sprintf(msg, "%.*f", fldWid, double(itt/scale)-trans);
      fld->SetWindowText(msg);
      fld->SetFocus();
      sprintf(msg, "ERROR: %s values must be >= %.*f, entry is %.*f (set to %.*f)", label, fldWid, lo, fldWid, dtt, fldWid, lo);
      if (mdb.loaded()) MessageBox(msg);
   }

   if (dtt > hi) {
      itt = int(hi * scale) + trans;
      sprintf(msg, "%.*f", fldWid, double(itt/scale)-trans);
      fld->SetWindowText(msg);
      fld->SetFocus();
      sprintf(msg, "ERROR: %s values must be <= %.*f, entry is %.*f (set to %.*f)", label, fldWid, hi, fldWid, dtt, fldWid, hi);
      if (mdb.loaded()) MessageBox(msg);
   }

   return itt;
}

//------------------------------------------------------------------------------

void Denrichments::dbFromFields()
{
   mdb.putConstByte(Dprimep,       getFld(boxen[27], 0.0,   25.5, "Priming Pulse",            10.0));
   mdb.putConstByte(Dcwu,          getFld(boxen[0],  0.1,   25.5, "Cold Cranking Pulsewidth", 10.0));
   mdb.putConstByte(Dcwh,          getFld(boxen[1],  0.1,   25.5, "Hot Cranking Pulsewidth",  10.0));
   mdb.putConstByte(Dawev,         getFld(boxen[2],  1.0,  255.0, "Afterstart Enrichment Percent"));
   mdb.putConstByte(Dawc,          getFld(boxen[3],  1.0,  255.0, "Afterstart Ignition Cycles"));

   for (int iWE = 0; iWE < 10; iWE++) {
      mdb.putConstByte(Dwwu+iWE,   getFld(boxen[iWE+4], 1, 255, "Warmup Enrichment Value"));
   }
   if (mdb.Const(Dwwu+9) != 100) {
      boxen[13]->SetWindowText("100");
      boxen[13]->SetFocus();
      if (mdb.loaded()) MessageBox("Warning: Warmup Enrichment value at 160 degrees\nshould be set to 100%.");
   }

   mdb.putConstByte(Dtpsthresh,    getFld(boxen[14], 1/5.12, 255/5.12, "TPS Threshold", 5.12));
   mdb.putConstByte(Dtpsaclkcmp,   getFld(boxen[15], 0.1,        25.5, "Acceleration Enrichment Time", 10.0));

   for (int iAE = 0; iAE < 4; iAE++) {
      mdb.putConstByte(Dtpsaq+iAE, getFld(boxen[iAE+16], 0.1, 25.5, "Acceleration Enrichment Values", 10.0));
   }

   mdb.putConstByte(Dtpsdq,        getFld(boxen[20],   0,   200, "Deceleration Enrichment"));
   mdb.putConstByte(Degotemp,      getFld(boxen[21], -40,   215, "EGO Coolant Threshold", 1.0, 40));
   mdb.putConstByte(Degocountcmp,  getFld(boxen[22],   1,   255, "EGO Timer Value"));
   mdb.putConstByte(Degodelta,     getFld(boxen[23],   0,   100, "EGO Step Percentage"));
   mdb.putConstByte(Degolimit,     getFld(boxen[24],   1,   100, "EGO Limit Percentage"));
   mdb.putConstByte(Drpmoxlimit,   getFld(boxen[28], 100, 25500, "EGO Activation RPM", 0.01));
   mdb.putConstByte(Dtpsacold,     getFld(boxen[25], 0.0,  25.5, "Cold Acceleration Enrichment", 10.0));
   mdb.putConstByte(Dtpscoldmult,  getFld(boxen[26],   0,   255, "Cold Acceleration Multiplier"));
   mdb.putConstByte(Degoswitchv,   getFld(boxen[29], 0.0,   5.0, "EGO Switch Point", 255.0/5.0));
   mdb.egoType(m_egoType.GetCurSel());
   mdb.putConstByte(Dconfig13);
}

//------------------------------------------------------------------------------

