//*****************************************
//******** 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 "Dvetable.h"
#include "veconst.h"
#include "Dconplot.h"
#include "scaleVE.h"

#ifdef _DEBUG
#  define new DEBUG_NEW
#  undef THIS_FILE
   static char THIS_FILE[] = __FILE__;
#endif

//------------------------------------------------------------------------------

extern msDatabase mdb;

//------------------------------------------------------------------------------
// Dvetable dialog

Dvetable::Dvetable(CWnd * pParent /*=NULL*/ )
 : CDialog(Dvetable::IDD, pParent)
{
   //{{AFX_DATA_INIT(Dvetable)
   //}}AFX_DATA_INIT
}

//------------------------------------------------------------------------------

void Dvetable::DoDataExchange(CDataExchange * pDX)
{
   CDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(Dvetable)
	DDX_Control(pDX, IDC_LOAD_BIN, m_loadBin);
	//}}AFX_DATA_MAP
}

//------------------------------------------------------------------------------

BEGIN_MESSAGE_MAP(Dvetable, CDialog)
   //{{AFX_MSG_MAP(Dvetable)
      ON_BN_CLICKED(IDC_RETRIEVEVE, OnRetrieveve)
      ON_BN_CLICKED(IDC_DOWNLOADVE, OnDownloadve)
      ON_BN_CLICKED(IDC_PLOTVE,     OnPlotve)
      ON_WM_TIMER()
      ON_EN_KILLFOCUS(IDC_VE11, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE12, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE13, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE14, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE15, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE16, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE17, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE18, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE19, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE20, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE21, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE22, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE23, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE24, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE25, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE26, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE27, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE28, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE29, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE30, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE31, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE32, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE33, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE34, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE35, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE36, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE37, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE38, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE39, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE40, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE41, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE42, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE43, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE44, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE45, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE46, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE47, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE48, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE49, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE50, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE51, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE52, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE53, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE54, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE55, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE56, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE57, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE58, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE59, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE60, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE61, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE62, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE63, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE64, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE65, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE66, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE67, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE68, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE69, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE70, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE71, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE72, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE73, dbFromFields)
      ON_EN_KILLFOCUS(IDC_VE74, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA11, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA12, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA13, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA14, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA15, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA16, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA17, dbFromFields)
      ON_EN_KILLFOCUS(IDC_KPA18, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM11, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM12, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM13, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM14, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM15, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM16, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM17, dbFromFields)
      ON_EN_KILLFOCUS(IDC_RPM18, dbFromFields)
	ON_BN_CLICKED(IDC_SCALE_VE, OnScaleVe)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//------------------------------------------------------------------------------
// Dvetable message handlers

BEGIN_EVENTSINK_MAP(Dvetable, CDialog)
   //{{AFX_EVENTSINK_MAP(Dvetable)
   //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

//------------------------------------------------------------------------------

BOOL Dvetable::OnInitDialog()
{
   CDialog::OnInitDialog();

   veboxes[ 0] = static_cast<CEdit *>(GetDlgItem(IDC_VE11));
   veboxes[ 1] = static_cast<CEdit *>(GetDlgItem(IDC_VE12));
   veboxes[ 2] = static_cast<CEdit *>(GetDlgItem(IDC_VE13));
   veboxes[ 3] = static_cast<CEdit *>(GetDlgItem(IDC_VE14));
   veboxes[ 4] = static_cast<CEdit *>(GetDlgItem(IDC_VE15));
   veboxes[ 5] = static_cast<CEdit *>(GetDlgItem(IDC_VE16));
   veboxes[ 6] = static_cast<CEdit *>(GetDlgItem(IDC_VE17));
   veboxes[ 7] = static_cast<CEdit *>(GetDlgItem(IDC_VE18));

   veboxes[ 8] = static_cast<CEdit *>(GetDlgItem(IDC_VE19));
   veboxes[ 9] = static_cast<CEdit *>(GetDlgItem(IDC_VE20));
   veboxes[10] = static_cast<CEdit *>(GetDlgItem(IDC_VE21));
   veboxes[11] = static_cast<CEdit *>(GetDlgItem(IDC_VE22));
   veboxes[12] = static_cast<CEdit *>(GetDlgItem(IDC_VE23));
   veboxes[13] = static_cast<CEdit *>(GetDlgItem(IDC_VE24));
   veboxes[14] = static_cast<CEdit *>(GetDlgItem(IDC_VE25));
   veboxes[15] = static_cast<CEdit *>(GetDlgItem(IDC_VE26));

   veboxes[16] = static_cast<CEdit *>(GetDlgItem(IDC_VE27));
   veboxes[17] = static_cast<CEdit *>(GetDlgItem(IDC_VE28));
   veboxes[18] = static_cast<CEdit *>(GetDlgItem(IDC_VE29));
   veboxes[19] = static_cast<CEdit *>(GetDlgItem(IDC_VE30));
   veboxes[20] = static_cast<CEdit *>(GetDlgItem(IDC_VE31));
   veboxes[21] = static_cast<CEdit *>(GetDlgItem(IDC_VE32));
   veboxes[22] = static_cast<CEdit *>(GetDlgItem(IDC_VE33));
   veboxes[23] = static_cast<CEdit *>(GetDlgItem(IDC_VE34));

   veboxes[24] = static_cast<CEdit *>(GetDlgItem(IDC_VE35));
   veboxes[25] = static_cast<CEdit *>(GetDlgItem(IDC_VE36));
   veboxes[26] = static_cast<CEdit *>(GetDlgItem(IDC_VE37));
   veboxes[27] = static_cast<CEdit *>(GetDlgItem(IDC_VE38));
   veboxes[28] = static_cast<CEdit *>(GetDlgItem(IDC_VE39));
   veboxes[29] = static_cast<CEdit *>(GetDlgItem(IDC_VE40));
   veboxes[30] = static_cast<CEdit *>(GetDlgItem(IDC_VE41));
   veboxes[31] = static_cast<CEdit *>(GetDlgItem(IDC_VE42));

   veboxes[32] = static_cast<CEdit *>(GetDlgItem(IDC_VE43));
   veboxes[33] = static_cast<CEdit *>(GetDlgItem(IDC_VE44));
   veboxes[34] = static_cast<CEdit *>(GetDlgItem(IDC_VE45));
   veboxes[35] = static_cast<CEdit *>(GetDlgItem(IDC_VE46));
   veboxes[36] = static_cast<CEdit *>(GetDlgItem(IDC_VE47));
   veboxes[37] = static_cast<CEdit *>(GetDlgItem(IDC_VE48));
   veboxes[38] = static_cast<CEdit *>(GetDlgItem(IDC_VE49));
   veboxes[39] = static_cast<CEdit *>(GetDlgItem(IDC_VE50));

   veboxes[40] = static_cast<CEdit *>(GetDlgItem(IDC_VE51));
   veboxes[41] = static_cast<CEdit *>(GetDlgItem(IDC_VE52));
   veboxes[42] = static_cast<CEdit *>(GetDlgItem(IDC_VE53));
   veboxes[43] = static_cast<CEdit *>(GetDlgItem(IDC_VE54));
   veboxes[44] = static_cast<CEdit *>(GetDlgItem(IDC_VE55));
   veboxes[45] = static_cast<CEdit *>(GetDlgItem(IDC_VE56));
   veboxes[46] = static_cast<CEdit *>(GetDlgItem(IDC_VE57));
   veboxes[47] = static_cast<CEdit *>(GetDlgItem(IDC_VE58));

   veboxes[48] = static_cast<CEdit *>(GetDlgItem(IDC_VE59));
   veboxes[49] = static_cast<CEdit *>(GetDlgItem(IDC_VE60));
   veboxes[50] = static_cast<CEdit *>(GetDlgItem(IDC_VE61));
   veboxes[51] = static_cast<CEdit *>(GetDlgItem(IDC_VE62));
   veboxes[52] = static_cast<CEdit *>(GetDlgItem(IDC_VE63));
   veboxes[53] = static_cast<CEdit *>(GetDlgItem(IDC_VE64));
   veboxes[54] = static_cast<CEdit *>(GetDlgItem(IDC_VE65));
   veboxes[55] = static_cast<CEdit *>(GetDlgItem(IDC_VE66));

   veboxes[56] = static_cast<CEdit *>(GetDlgItem(IDC_VE67));
   veboxes[57] = static_cast<CEdit *>(GetDlgItem(IDC_VE68));
   veboxes[58] = static_cast<CEdit *>(GetDlgItem(IDC_VE69));
   veboxes[59] = static_cast<CEdit *>(GetDlgItem(IDC_VE70));
   veboxes[60] = static_cast<CEdit *>(GetDlgItem(IDC_VE71));
   veboxes[61] = static_cast<CEdit *>(GetDlgItem(IDC_VE72));
   veboxes[62] = static_cast<CEdit *>(GetDlgItem(IDC_VE73));
   veboxes[63] = static_cast<CEdit *>(GetDlgItem(IDC_VE74));

   kpaboxes[0] = static_cast<CEdit *>(GetDlgItem(IDC_KPA11));
   kpaboxes[1] = static_cast<CEdit *>(GetDlgItem(IDC_KPA12));
   kpaboxes[2] = static_cast<CEdit *>(GetDlgItem(IDC_KPA13));
   kpaboxes[3] = static_cast<CEdit *>(GetDlgItem(IDC_KPA14));
   kpaboxes[4] = static_cast<CEdit *>(GetDlgItem(IDC_KPA15));
   kpaboxes[5] = static_cast<CEdit *>(GetDlgItem(IDC_KPA16));
   kpaboxes[6] = static_cast<CEdit *>(GetDlgItem(IDC_KPA17));
   kpaboxes[7] = static_cast<CEdit *>(GetDlgItem(IDC_KPA18));

   rpmboxes[0] = static_cast<CEdit *>(GetDlgItem(IDC_RPM11));
   rpmboxes[1] = static_cast<CEdit *>(GetDlgItem(IDC_RPM12));
   rpmboxes[2] = static_cast<CEdit *>(GetDlgItem(IDC_RPM13));
   rpmboxes[3] = static_cast<CEdit *>(GetDlgItem(IDC_RPM14));
   rpmboxes[4] = static_cast<CEdit *>(GetDlgItem(IDC_RPM15));
   rpmboxes[5] = static_cast<CEdit *>(GetDlgItem(IDC_RPM16));
   rpmboxes[6] = static_cast<CEdit *>(GetDlgItem(IDC_RPM17));
   rpmboxes[7] = static_cast<CEdit *>(GetDlgItem(IDC_RPM18));

   //---------------------------------------------------------------------------

   if (!mdb.loaded()) mdb.getConst();
   fieldsFromDb();

   if (mdb.alphaN()) m_loadBin.SetWindowText("TP% bins");

   return TRUE;
}

//------------------------------------------------------------------------------

void Dvetable::fieldsFromDb()
{
   int  ikt;
   char cbuf[100];

   for (ikt = 0; ikt < 64; ikt++) {
      sprintf(cbuf, "%d", mdb.Const(Dve+ikt));
      veboxes[ikt]->SetWindowText(cbuf);
   }

   for (ikt = 0; ikt < 8; ikt++) {
      sprintf(cbuf, "%d", 100 * mdb.Const(Drpmrangeve+ikt));
      rpmboxes[ikt]->SetWindowText(cbuf);
      BYTE val = mdb.Const(Dkparangeve+ikt);
      if (mdb.alphaN()) val = mdb.pctFromTps(val);
      sprintf(cbuf, "%d", val);
      kpaboxes[ikt]->SetWindowText(cbuf);
   }
}

//------------------------------------------------------------------------------

void Dvetable::OnRetrieveve()
{
   mdb.getConst();
   fieldsFromDb();
}

//------------------------------------------------------------------------------

void Dvetable::OnDownloadve()
{
   int ikt;

   for (ikt = 0; ikt < 64; ikt++) {
      mdb.putConstByte(Dve+ikt);
   }

   for (ikt = 0; ikt < 8; ikt++) {
      mdb.putConstByte(Dkparangeve+ikt);
      mdb.putConstByte(Drpmrangeve+ikt);
   }

   mdb.burnConst();
}

//------------------------------------------------------------------------------

BYTE Dvetable::getFld(CEdit *fld, int lo, int hi, char *label, char *idxLbl, double scale)
{
   CString  hhh;
   LPTSTR   pp;
   char     msg[100];
   int      itt;

   fld->GetWindowText((CString &) hhh);
   pp = hhh.GetBuffer(10); sscanf(pp, "%d", &itt); hhh.ReleaseBuffer();

   if (itt < lo) {
      sprintf(msg, "ERROR: VE values must be >= %d, %s[%s] entry is %d (set to %d)", lo, label, idxLbl, itt, lo);
      MessageBox(msg);
      itt = lo;
      sprintf(msg, "%d", itt);
      fld->SetWindowText(msg);
   }

   if (itt > hi) {
      sprintf(msg, "ERROR: VE values must be <= %d, %s[%s] entry is %d (set to %d)", hi, label, idxLbl, itt, hi);
      MessageBox(msg);
      itt = hi;
      sprintf(msg, "%d", itt);
      fld->SetWindowText(msg);
   }

   return BYTE(itt / scale);
}

#if 0
BYTE Dvetable::getFld(CEdit *fld, double lo, double hi, char *label, char *idxLbl, double scale)
{
   CString  hhh;
   LPTSTR   pp;
   char     msg[100];
   double   dtt;

   fld->GetWindowText((CString &) hhh);
   pp = hhh.GetBuffer(10); sscanf(pp, "%lf", &dtt); hhh.ReleaseBuffer();

   if (dtt < lo) {
      sprintf(msg, "ERROR: VE values must be >= %.0f, %s[%s] entry is %.0f (set to %.0f)", lo, label, idxLbl, dtt, lo);
      MessageBox(msg);
      dtt = lo;
      sprintf(msg, "%.0f", dtt);
      fld->SetWindowText(msg);
   }

   if (dtt > hi) {
      sprintf(msg, "ERROR: VE values must be <= %.0f, %s[%s] entry is %.0f (set to %.0f)", hi, label, idxLbl, dtt, hi);
      MessageBox(msg);
      dtt = hi;
      sprintf(msg, "%.0f", dtt);
      fld->SetWindowText(msg);
   }

   return static_cast<BYTE>(dtt * 2.551 / scale);
}
#endif

char *Dvetable::idxLabel(int idx, int dims)
{
   static char idxLbl[100];
   if (dims == 2)
      sprintf(idxLbl, "%d,%d", idx/8+1, idx%8+1);
   else
      sprintf(idxLbl, "%d", idx+1);
   return idxLbl;
}

void Dvetable::dbFromFields()
{
   int ikt;

   for (ikt = 0; ikt < 64; ikt++) {
      mdb.putConstByte(Dve+ikt, getFld(veboxes[ikt], 0, 255, "VE", idxLabel(ikt,2)));
   }

   for (ikt = 0; ikt < 8; ikt++) {
      if (mdb.alphaN())
         mdb.putConstByte(Dkparangeve+ikt, mdb.tpsFromPct(getFld(kpaboxes[ikt], 0, 100, "TPS", idxLabel(ikt,1))));
      else
         mdb.putConstByte(Dkparangeve+ikt,                getFld(kpaboxes[ikt], 1, 255, "MAP", idxLabel(ikt,1)) );
   }

   for (ikt = 0; ikt < 8; ikt++) {
      mdb.putConstByte(Drpmrangeve+ikt, getFld(rpmboxes[ikt], 100, 25500, "RPM", idxLabel(ikt,1), 100.0));
  }
}

//------------------------------------------------------------------------------

void Dvetable::OnPlotve()
{
   dbFromFields();
   Dconplot plot;
   plot.DoModal();
}

//------------------------------------------------------------------------------

void Dvetable::OnScaleVe()
{
   scaleVe sve;
   sve.DoModal();
   fieldsFromDb();
}

//------------------------------------------------------------------------------

