// +-------------------------------- DISCLAIMER ---------------------------------+
// |                                                                             |
// | This program is provided to you free of charge "as such".                   |
// | You should not assume that this program is error-free or suitable for any   |
// | purpose whatsoever.                                                         |
// |                                                                             |
// | EURESYS does not give any representation, warranty or undertaking that this |
// | program is free of any defect or error or suitable for any purpose. EURESYS |
// | shall not be liable, in contract, in torts or otherwise, for any damages,   |
// | loss, costs, expenses or other claims for compensation, including those     |
// | asserted by third parties, arising out of or in connection with the use of  |
// | this program.                                                               |
// +-----------------------------------------------------------------------------+

#pragma once

#include "../Common/GrabberInterface.h"
#include "ScanSDK/BnScanSDK.h"

class BenanoGrabber : public GrabberInterface
{
public:
  // Construction and destruction
  BenanoGrabber();
  ~BenanoGrabber();

  // Acquisition control
  virtual void Start(int num_frame = 1);
  virtual long long int WaitFrame(int timeout_ms = -1);
  virtual void ReleaseFrame();
  virtual void Stop();

  // Bit depth for DepthMap and ZMap
  virtual int GetBitDepth();

  // Data retrieval
  virtual void GetDepthMap(Easy3D::EDepthMap& map);
  virtual void GetPointCloud(Easy3D::EPointCloud& pc);
  virtual void GetZMap(Easy3D::EZMap& zmap);

  // Parameter handling GUI
  virtual void InvokeParameterPanel();

private:

  void ConfigureDevice(bool updateParams);

  static void OnViewDataResultCallback(void* cbOwner, benano_scansdk::CViewDataResult* viewResult);

  void OnViewDataResult(benano_scansdk::CViewDataResult* viewResult);

protected:
  // device data
  benano_scansdk::CScanManager* scanManager;

  // device params
  benano_scansdk::eExposureMode exposureMode;
  benano_scansdk::U8 brightness;
  benano_scansdk::U8 cameraGain;
  bool getNormals;
  bool getColors;

  // grabbing state
  bool started;
  bool locked;
  volatile bool ended;
  long long int frameCounter;

  // last processed point cloud and zmap
  Easy3D::EPointCloud pointCloud;
  Easy3D::EZMap32f zmap;
};
