/*
 * qTabAdvanced.h
 *
 *  Created on: May 10, 2012
 *      Author: l_maliakal_d
 */

#ifndef QTABADVANCED_H_
#define QTABADVANCED_H_

#include "qDefs.h"
#include "sls_detector_defs.h"

/** Form Header */
#include "ui_form_tab_advanced.h"
/** Project Class Headers */
class multiSlsDetector;
class slsDetector;
/** Qt Project Class Headers */
class qDrawPlot;
/** Qt Include Header */
#include <QStackedLayout>
#include <QSpacerItem>
/**
 *@short sets up the advanced parameters
 */
class qTabAdvanced:public QWidget, private Ui::TabAdvancedObject{
	Q_OBJECT

public:
	/** \short The constructor
	 *    @param parent is the parent tab widget
	 *    @param detector is the detector returned from the detector tab
	 *    @param plot plot object reference
	 */
	qTabAdvanced(QWidget *parent,multiSlsDetector*& detector, qDrawPlot*& plot);

	/** Destructor
	 */
	~qTabAdvanced();

public slots:
	/** To refresh and update widgets
	 */
	void Refresh();

private:
	/** Sets up the widget
	 */
	void SetupWidgetWindow();

	/** Sets up all the slots and signals
	 */
	void Initialization();

	/** Add ROI Input
	 * @param num number of inputs to add
	 */
	void AddROIInput(int num);

	/** Checks for a few conditions before trimming
	 /returns OK or FAIL
	 */
	int validateBeforeTrimming();

	/** update the setalltrimbits value from server
	 */
	void updateAllTrimbitsFromServer();


private slots:

	/** Enable/Disable Energy and Calibration Logs
	 */
	void SetLogs();

	/** Set acquisition time
	 */
	void SetExposureTime();

	/** Set the Threshold dac value
	 */
	void SetThreshold();

	/** Set output directory for trimming
	 */
	void SetOutputFile();

	/** Browse output directory for trimming
	 */
	void BrowseOutputFile();

	/** Enables trimming method and calls SetTrimmingMethod if enabled
	 * @param enable to enable trimming
	 */
	void EnableTrimming(bool enable);

	/** Enabling resolution and Counts if this is enabled
	 * @param enable to enable
	 */
	void SetOptimize(bool enable);

	/** Sets the trimming method
	 * @param mode trimming method
	 */
	void SetTrimmingMethod(int mode);

	/** Ensures the right trimming mode and Executes Trimming
	 */
	void StartTrimming();

	/** Updates the plot with trimbits from detector/shared memory
	 */
	void UpdateTrimbitPlot(int id);

	/** Sets control port
	 * @param port control port
	 */
	void SetControlPort(int port);

	/** Sets stop port
	 * @param port stop port
	 */
	void SetStopPort(int port);

	/** Sets receiver tcp port
	 * @param port receiver tcp port
	 */
	void SetRxrTCPPort(int port);

	/** Sets receiver udp port
	 * @param port receiver udp port
	 */
	void SetRxrUDPPort(int port);

	/** Sets client zmq receiver port
	 * @param port client zmq receiver port
	 */
	void SetCltZmqPort(int port);

	/** Sets receiver zmq transmitting port
	 * @param port receiver zmq transmitting port
	 */
	void SetRxrZmqPort(int port);

	/** Sets receiver online
	 * @param index 1 for online and 0 for offline
	 */
	void SetReceiverOnline(int index);

	/** Sets detector online
	 * @param index 1 for online and 0 for offline
	 */
	void SetOnline(int index);

	/** Sets network parameters like receiver udp ip,
	 * receiver udp mac, detector ip and detector mac
	 */
	void SetNetworkParameters();

	/** Sets client zmq ip to listen to
	 */
	void SetClientZMQIP();

	/** Sets receiver zmq ip to stream from
	 */
	void SetReceiverZMQIP();

	/** Sets the receiver. which also sets the receiver parameters
	 */
	void SetReceiver();

	/** Add ROI Input if the value changed in the last slot
	 */
	void AddROIInputSlot(){AddROIInput(1);};

	/** Clears all the ROI inputs
	 */
	void clearROI();

	/** Gets ROIs from detector and updates it
	 */
	void updateROIList();

	/** Sets ROI in detector
	 */
	void setROI();

	/** Clears ROI in detector
	 */
	void clearROIinDetector();

	/** Clears ROI in detector
	 */
	void SetDetector(int index);

	/** Set all trimbits to a value
	 */
	void SetAllTrimbits();

	/** Set storage cells */
	void SetNumStoragecells(int value);

	/** Set sub frame exposure time */
	void SetSubExposureTime();

	/** Set sub frame period */
	void SetSubPeriod();


private:
	/** The multi detector object */
	multiSlsDetector *myDet;

	/** The sls detector object */
	slsDetector *det;

	/** detector type */
	slsDetectorDefs::detectorType detType;

	/** The Plot widget	 */
	qDrawPlot *myPlot;

	QButtonGroup 	*btnGroup;

	/** Tool Tip for the output dir */
	QString 	outputDirTip;
	QString 	errOutputTip;
	QString		errOnlineTip;
	QString		detOnlineTip;
	QString 	rxrOnlineTip;
	QPalette	red;

	/** Trimming mode */
	slsDetectorDefs::trimMode trimmingMode;
	static const int TRIMMING_DYNAMIC_RANGE 	= 32;
	static const int TRIMMING_FRAME_NUMBER 		= 1;
	static const int TRIMMING_TRIGGER_NUMBER 	= 1;
	static const int TRIMMING_PROBE_NUMBER 		= 0;

	bool isEnergy;
	bool isAngular;

	/** ROI */
	vector <QLabel*> 	lblFromX;
	vector <QSpinBox*> 	spinFromX;
	vector <QLabel*> 	lblFromY;
	vector <QSpinBox*> 	spinFromY;
	vector <QLabel*> 	lblToX;
	vector <QSpinBox*> 	spinToX;
	vector <QLabel*> 	lblToY;
	vector <QSpinBox*> 	spinToY;
	int numRois;

	/** sub period tool tip variables*/
	QString 	acqSubPeriodTip;
	QString 	errSubPeriodTip;

	void CheckAcqPeriodGreaterThanExp();


};



#endif /* QTABADVANCED_H_ */
