// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef GOTTHARDSHORTMODULEDATA_H
#define GOTTHARDSHORTMODULEDATA_H
#include "slsReceiverData.h"

class gotthardShortModuleData : public slsReceiverData<uint16_t> {
  public:
    /**
 Implements the slsReceiverData structure for the gotthard short read out by a
 module i.e. using the slsReceiver (1x256 pixels, 1 packet 256 large etc.)
 \param c crosstalk parameter for the output buffer

     */

    gotthardShortModuleData(double c = 0)
        : slsReceiverData<uint16_t>(xpixels, ypixels, npackets, buffersize),
          xtalk(c) {

        uint16_t **dMask;
        int **dMap;
        int ix, iy;
        int offset = 2;

        dMask = new uint16_t *[ypixels];
        dMap = new int *[ypixels];
        for (int i = 0; i < ypixels; i++) {
            dMap[i] = new int[xpixels];
            dMask[i] = new uint16_t[xpixels];
        }

        for (ix = 0; ix < ypixels; ++ix)
            for (iy = 0; iy < xpixels; ++iy)
                dMask[ix][iy] = 0x0;

        for (ix = 0; ix < ypixels; ++ix)
            for (iy = 0; iy < xpixels; ++iy) {
                dMap[ix][iy] = offset;
                offset++;
            }

        setDataMap(dMap);
        setDataMask(dMask);
    };

    /**

       Returns the frame number for the given dataset.
       \param buff pointer to the dataset
       \returns frame number

     */

    int getFrameNumber(char *buff) { return (*(int *)buff); };

    /**
 gets the packets number (last packet is labelled with 0 and is replaced with
 40) \param buff pointer to the memory \returns packet number

     */

    int getPacketNumber(char *buff) { return 1; };

    /**
returns the pixel value as double correcting for the output buffer crosstalk
 \param data pointer to the memory
 \param ix coordinate in the x direction
 \param iy coordinate in the y direction
 \returns channel value as double

     */
    double getValue(char *data, int ix, int iy = 0) {
        // check how it is for gotthard
        if (xtalk == 0)
            return slsDetectorData<uint16_t>::getValue(data, ix, iy);
        else
            return slsDetectorData<uint16_t>::getValue(data, ix, iy) -
                   xtalk *
                       slsDetectorData<uint16_t>::getValue(data, ix - 1, iy);
    };

    /** sets the output buffer crosstalk correction parameter
  \param c output buffer crosstalk correction parameter to be set
  \returns current value for the output buffer crosstalk correction parameter

     */
    double setXTalk(double c) {
        xtalk = c;
        return xtalk;
    }

    /** gets the output buffer crosstalk parameter
  \returns current value for the output buffer crosstalk correction parameter
     */
    double getXTalk() { return xtalk; }

  private:
    double xtalk; /**<output buffer crosstalk correction parameter */
    const static int xpixels = 256;
    const static int ypixels = 1;
    const static int npackets = 1;
    const static int buffersize = 518;
};

#endif