// --------------------------------------------------------------------------
// --
// -- WINDOWS - Window handlers.
// --
// --
// --------------------------------------------------------------------------

// --------------------------------------------------------------------------
// -- Includes
// --------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
#include "defines.h"
#include "console.h"
#include "logs.h"
#include "windows.h"

// --------------------------------------------------------------------------
// -- Definitions
// --------------------------------------------------------------------------

// --- Status window specifics ---------------------

// --- Screen
#define WIN_STS_Y_SIZE		4

#define WIN_STS_LOG_X		18
#define WIN_STS_RXLOG_Y	    1
#define WIN_STS_TXLOG_Y	    2
#define WIN_STS_FMLOG_Y	    3

#define WIN_STS_LOGFILE_X   34
#define WIN_STS_LOGFRX_Y	1
#define WIN_STS_LOGFTX_Y	2
#define WIN_STS_LOGFFM_Y	3

#define WIN_STS_COUNT_X	    54
#define WIN_STS_RXCNT_Y	    1
#define WIN_STS_TXCNT_Y		2

#define WIN_STS_FRXCOUNT_X	57
#define WIN_STS_FTXCOUNT_X  74
#define WIN_STS_FCOUNT_Y	3

#define WIN_STS_STOPGO_X	72
#define WIN_STS_STOPGO_Y	1

#define WIN_STS_ALARM_X		2
#define WIN_STS_ALARM_Y		4

#define WIN_STS_COLOR		YELLOW
#define WIN_STS_COLORB		BLUE

// --- Helper functions

// --- Status window specifics ---------------------

// --- Screen

#define WIN_FRM_COLOR		YELLOW
#define WIN_FRM_COLORB		BLUE

// --------------------------------------------------------------------------
// -- Data
// --------------------------------------------------------------------------

// --- Text for Logging types
char   winLogStyleText[5][5] = {

   "OFF ",
   "SNAP",
   "QUOT",
   "DUMP",
   "VERB"

};

char   *winSTSGoString   = "[ GO ]";
char   *winSTSStopString = "[STOP]";

// --------------------------------------------------------------------------
// -- Methods
// --------------------------------------------------------------------------

// --- Status window -------------------------------------------------------

// --- Constructor ------------------
WinStatus::WinStatus( int yStart ) {

   view = new ConFreeWindow(yStart, CON_START_X, WIN_STS_Y_SIZE);

   view->setTextColor(WIN_STS_COLOR);
   view->setBackgroundColor(WIN_STS_COLORB);

   reset();

   // DOES NOT REFRESH
}

// --- Destructor -------------------
WinStatus::~WinStatus() {

   delete view;
}

// --- Reset values -----------------
void WinStatus::reset(void) {

   rxLogName    = NULL;
   txLogName    = NULL;
   frameLogName = NULL;

   rxStyle      = LOG_OFF;
   txStyle      = LOG_OFF;
   frameStyle   = LOG_OFF;

   rxCount      = 0;
   txCount      = 0;
   frameRXCount = 0;
   frameTXCount = 0;

   go			= FALSE;

   alarmText	= NULL;
}

// --- Refresh the whole window ----
void WinStatus::refresh(void) {

   char  textBuffer[LINE_BUFFER_SIZE];

   view->reset();
   view->put(1,1, "-DTE RXù LOGGING      ù LOG FILE              ù CNT=");
   view->put(1,2, "-DTE TXù LOGGING      ù LOG FILE              ù CNT=");
   view->put(1,3, "-FRAME ù LOGGING      ù LOG FILE              ù RX CNT=        ù TX CNT=");
   view->put(1,4, "¯                                                                              ®");

   // Fill values
   view->put(WIN_STS_LOG_X, WIN_STS_RXLOG_Y, winLogStyleText[rxStyle]);
   view->put(WIN_STS_LOG_X, WIN_STS_TXLOG_Y, winLogStyleText[txStyle]);
   view->put(WIN_STS_LOG_X, WIN_STS_FMLOG_Y, winLogStyleText[frameStyle]);

   view->put(WIN_STS_LOGFILE_X, WIN_STS_LOGFRX_Y, rxLogName);
   view->put(WIN_STS_LOGFILE_X, WIN_STS_LOGFTX_Y, txLogName);
   view->put(WIN_STS_LOGFILE_X, WIN_STS_LOGFFM_Y, frameLogName);

   sprintf(textBuffer, "%09lu", rxCount);
   view->put(WIN_STS_COUNT_X, WIN_STS_RXCNT_Y, textBuffer);
   sprintf(textBuffer, "%09lu", txCount);
   view->put(WIN_STS_COUNT_X, WIN_STS_TXCNT_Y, textBuffer);

   sprintf(textBuffer, "%09lu", frameRXCount);
   view->put(WIN_STS_FRXCOUNT_X, WIN_STS_FCOUNT_Y, textBuffer);
   sprintf(textBuffer, "%09lu", frameTXCount);
   view->put(WIN_STS_FTXCOUNT_X, WIN_STS_FCOUNT_Y, textBuffer);

   if (go)
	  view->put(WIN_STS_STOPGO_X, WIN_STS_STOPGO_Y, winSTSGoString,
				LIGHTGRAY, GREEN );
   else
	  view->put(WIN_STS_STOPGO_X, WIN_STS_STOPGO_Y, winSTSStopString,
				LIGHTGRAY, RED   );

   sprintf(textBuffer, "%-78s", alarmText );
   view->put(WIN_STS_ALARM_X, WIN_STS_ALARM_Y, textBuffer,
			 RED, BLUE);
}

// -- Move the window to a new position.  DOES NOT REFRESH
void  WinStatus::moveTo(int  yStart) {

   delete view;
   view = new ConFreeWindow(yStart, CON_START_X, WIN_STS_Y_SIZE);

}


// --- Ststus window manipulators ----
void WinStatus::setLogRX(LogFileName *rx) {
   rxLogName = rx;
   view->put(WIN_STS_LOGFILE_X, WIN_STS_LOGFRX_Y, rxLogName);
}

void WinStatus::setLogTX(LogFileName *tx) {
   txLogName = tx;
   view->put(WIN_STS_LOGFILE_X, WIN_STS_LOGFTX_Y, txLogName);
}

void WinStatus::setLogFRAME(LogFileName *frame) {
   frameLogName = frame;
   view->put(WIN_STS_LOGFILE_X, WIN_STS_LOGFFM_Y, frameLogName);
}

void WinStatus::showGo(void) {
   go = TRUE;
   view->put(WIN_STS_STOPGO_X, WIN_STS_STOPGO_Y, winSTSGoString,
			 LIGHTGRAY, GREEN );
}

void WinStatus::showStop(void) {
   go = FALSE;
   view->put(WIN_STS_STOPGO_X, WIN_STS_STOPGO_Y, winSTSStopString,
			 LIGHTGRAY, RED   );
}

void WinStatus::incRX(void) {
   char  textBuffer[LINE_BUFFER_SIZE];

   rxCount++;
   sprintf(textBuffer, "%09lu", rxCount);
   view->put(WIN_STS_COUNT_X, WIN_STS_RXCNT_Y, textBuffer);
}

void WinStatus::incTX(void) {
   char  textBuffer[LINE_BUFFER_SIZE];

   txCount++;
   sprintf(textBuffer, "%09lu", txCount);
   view->put(WIN_STS_COUNT_X, WIN_STS_TXCNT_Y, textBuffer);
}

void WinStatus::incRXFrame(void) {
   char  textBuffer[LINE_BUFFER_SIZE];

   frameRXCount++;
   sprintf(textBuffer, "%09lu", frameRXCount);
   view->put(WIN_STS_FRXCOUNT_X, WIN_STS_FCOUNT_Y, textBuffer);
}

void WinStatus::incTXFrame(void) {
   char  textBuffer[LINE_BUFFER_SIZE];

   frameTXCount++;
   sprintf(textBuffer, "%09lu", frameTXCount);
   view->put(WIN_STS_FTXCOUNT_X, WIN_STS_FCOUNT_Y, textBuffer);
}

void WinStatus::clearAll(void) {

   clearChars();
   clearFrames();
}

void WinStatus::clearChars(void) {
   char  textBuffer[LINE_BUFFER_SIZE];

   rxCount = 0;
   txCount = 0;
   sprintf(textBuffer, "%09lu", rxCount);
   view->put(WIN_STS_COUNT_X, WIN_STS_RXCNT_Y, textBuffer);
   sprintf(textBuffer, "%09lu", txCount);
   view->put(WIN_STS_COUNT_X, WIN_STS_TXCNT_Y, textBuffer);
}

void WinStatus::clearFrames(void) {
   char  textBuffer[LINE_BUFFER_SIZE];

   frameRXCount = 0;
   frameTXCount = 0;
   sprintf(textBuffer, "%09lu", frameRXCount);
   view->put(WIN_STS_FRXCOUNT_X, WIN_STS_FCOUNT_Y, textBuffer);
   sprintf(textBuffer, "%09lu", frameTXCount);
   view->put(WIN_STS_FTXCOUNT_X, WIN_STS_FCOUNT_Y, textBuffer);
}

void WinStatus::showRXStyle(LoggingStyle rx) {
   rxStyle = rx;
   view->put(WIN_STS_LOG_X, WIN_STS_RXLOG_Y, winLogStyleText[rxStyle]);
}

void WinStatus::showTXStyle(LoggingStyle tx) {
   txStyle = tx;
   view->put(WIN_STS_LOG_X, WIN_STS_TXLOG_Y, winLogStyleText[txStyle]);
}

void WinStatus::showFrameStyle(LoggingStyle frame) {
   frameStyle = frame;
   view->put(WIN_STS_LOG_X, WIN_STS_FMLOG_Y, winLogStyleText[frameStyle]);
}

void WinStatus::portAlarm( char *text ) {
   char  textBuffer[LINE_BUFFER_SIZE];

   alarmText = text;
   sprintf(textBuffer, "%-78s", alarmText );
   view->put(WIN_STS_ALARM_X, WIN_STS_ALARM_Y, textBuffer,
			 RED, BLUE);
}


// --- Frame window -------------------------------------------------------

// --- Constructor ------------------
WinFrame::WinFrame(int  startY, int  sizeY, int  lineBuffers ) {

   ySize = sizeY;
   view  = new ConLBSWindow( startY, sizeY );

   lines             = (char *) farmalloc(lineBuffers * LINE_BUFFER_SIZE);
   startLine         = 0;
   firstVisibleLine  = 0;
   nextLine          = 0;

   view->setTextColor(WIN_FRM_COLOR);
   view->setBackgroundColor(WIN_FRM_COLORB);

   view->reset();

}


// --- Destructor ------------------
WinFrame::~WinFrame() {

   delete view;
   farfree(lines);
}


// --- Dump the lines --------------
void WinFrame::flush(void) {

   startLine         = 0;
   firstVisibleLine  = 0;
   nextLine          = 0;

   view->reset();
}


// --- Refresh the screen ---------
void WinFrame::refresh(void) {


   view->reset();


}


// ---
void WinFrame::moveTo(int startY, int  sizeY) {

}


// ---
void WinFrame::post( char  *line) {

}


// ---
void WinFrame::scrollUp(  void) {


}


// ---
void WinFrame::scrollDown(void) {

}


// --------------------------------------------------------------------------
// -- FUNCTIONS
// --------------------------------------------------------------------------
