Skip to content
Snippets Groups Projects
c11.h 12.4 KiB
Newer Older
Valerio Pastore's avatar
Valerio Pastore committed
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#pragma once

#include <sstream>
#include "boost/any.hpp"
#include <Specific.hh>
#include <Encoder.hh>
#include <Decoder.hh>

#include <Base_Packet.h>

namespace C11 {

static const int TRIGGER_COUNT_SIZE = 64;
static const int NUM_PDM = 37;

Valerio Pastore's avatar
Valerio Pastore committed
struct PDMBlock {
    bool pdmVal;
    int32_t spare_1;
    int32_t pdmID;
    std::vector<int32_t > triggerCounts;
    int32_t sipmTemp1;
    int32_t sipmTemp2;
    int32_t sipmTemp3;
    int32_t sipmHighVoltage;
    int32_t sipmCurrent;
    PDMBlock() :
        pdmVal(bool()),
        spare_1(int32_t()),
        pdmID(int32_t()),
        triggerCounts(std::vector<int32_t >()),
        sipmTemp1(int32_t()),
        sipmTemp2(int32_t()),
        sipmTemp3(int32_t()),
        sipmHighVoltage(int32_t()),
        sipmCurrent(int32_t())
        { }
};

struct C11 {
    int32_t telescopeID;
    int32_t type;
    int32_t subType;
    int32_t ssc;
    int32_t packetLength;
    int32_t year;
    int32_t month;
    int32_t day;
    int32_t hours;
    int32_t minutes;
    int32_t seconds;
    bool validTime;
    int32_t timeTagNanosec;
    int32_t eventCounter;
    bool lid;
    bool fibSt;
    bool fibCont;
    bool fibPuls;
    int32_t rgbCont;
    int32_t rgbPuls;
    int32_t spare_0;
    int32_t pixelTriggerDiscriminatorThreshold;
    bool ptm;
    int32_t triggeredPixel;
    int32_t timeWindow;
    int32_t discriminatorChain;
    std::vector<PDMBlock > PDMs;
    C11() :
        telescopeID(int32_t()),
        type(int32_t()),
        subType(int32_t()),
        ssc(int32_t()),
        packetLength(int32_t()),
        year(int32_t()),
        month(int32_t()),
        day(int32_t()),
        hours(int32_t()),
        minutes(int32_t()),
        seconds(int32_t()),
        validTime(bool()),
        timeTagNanosec(int32_t()),
        eventCounter(int32_t()),
        lid(bool()),
        fibSt(bool()),
        fibCont(bool()),
        fibPuls(bool()),
        rgbCont(int32_t()),
        rgbPuls(int32_t()),
        spare_0(int32_t()),
        pixelTriggerDiscriminatorThreshold(int32_t()),
        ptm(bool()),
        triggeredPixel(int32_t()),
        timeWindow(int32_t()),
        discriminatorChain(int32_t()),
        PDMs(std::vector<PDMBlock >())
        { }
};

}
namespace avro {
template<> struct codec_traits<C11::PDMBlock> {
    static void encode(Encoder& e, const C11::PDMBlock& v) {
        avro::encode(e, v.pdmVal);
        avro::encode(e, v.spare_1);
        avro::encode(e, v.pdmID);
        avro::encode(e, v.triggerCounts);
        avro::encode(e, v.sipmTemp1);
        avro::encode(e, v.sipmTemp2);
        avro::encode(e, v.sipmTemp3);
        avro::encode(e, v.sipmHighVoltage);
        avro::encode(e, v.sipmCurrent);
    }
    static void decode(Decoder& d, C11::PDMBlock& v) {
        if (avro::ResolvingDecoder *rd =
            dynamic_cast<avro::ResolvingDecoder *>(&d)) {
            const std::vector<size_t> fo = rd->fieldOrder();
            for (std::vector<size_t>::const_iterator it = fo.begin();
                it != fo.end(); ++it) {
                switch (*it) {
                case 0:
                    avro::decode(d, v.pdmVal);
                    break;
                case 1:
                    avro::decode(d, v.spare_1);
                    break;
                case 2:
                    avro::decode(d, v.pdmID);
                    break;
                case 3:
                    avro::decode(d, v.triggerCounts);
                    break;
                case 4:
                    avro::decode(d, v.sipmTemp1);
                    break;
                case 5:
                    avro::decode(d, v.sipmTemp2);
                    break;
                case 6:
                    avro::decode(d, v.sipmTemp3);
                    break;
                case 7:
                    avro::decode(d, v.sipmHighVoltage);
                    break;
                case 8:
                    avro::decode(d, v.sipmCurrent);
                    break;
                default:
                    break;
                }
            }
        } else {
            avro::decode(d, v.pdmVal);
            avro::decode(d, v.spare_1);
            avro::decode(d, v.pdmID);
            avro::decode(d, v.triggerCounts);
            avro::decode(d, v.sipmTemp1);
            avro::decode(d, v.sipmTemp2);
            avro::decode(d, v.sipmTemp3);
            avro::decode(d, v.sipmHighVoltage);
            avro::decode(d, v.sipmCurrent);
        }
    }
};

template<> struct codec_traits<C11::C11> {
    static void encode(Encoder& e, const C11::C11& v) {
        avro::encode(e, v.telescopeID);
        avro::encode(e, v.type);
        avro::encode(e, v.subType);
        avro::encode(e, v.ssc);
        avro::encode(e, v.packetLength);
        avro::encode(e, v.year);
        avro::encode(e, v.month);
        avro::encode(e, v.day);
        avro::encode(e, v.hours);
        avro::encode(e, v.minutes);
        avro::encode(e, v.seconds);
        avro::encode(e, v.validTime);
        avro::encode(e, v.timeTagNanosec);
        avro::encode(e, v.eventCounter);
        avro::encode(e, v.lid);
        avro::encode(e, v.fibSt);
        avro::encode(e, v.fibCont);
        avro::encode(e, v.fibPuls);
        avro::encode(e, v.rgbCont);
        avro::encode(e, v.rgbPuls);
        avro::encode(e, v.spare_0);
        avro::encode(e, v.pixelTriggerDiscriminatorThreshold);
        avro::encode(e, v.ptm);
        avro::encode(e, v.triggeredPixel);
        avro::encode(e, v.timeWindow);
        avro::encode(e, v.discriminatorChain);
        avro::encode(e, v.PDMs);
    }
    static void decode(Decoder& d, C11::C11& v) {
        if (avro::ResolvingDecoder *rd =
            dynamic_cast<avro::ResolvingDecoder *>(&d)) {
            const std::vector<size_t> fo = rd->fieldOrder();
            for (std::vector<size_t>::const_iterator it = fo.begin();
                it != fo.end(); ++it) {
                switch (*it) {
                case 0:
                    avro::decode(d, v.telescopeID);
                    break;
                case 1:
                    avro::decode(d, v.type);
                    break;
                case 2:
                    avro::decode(d, v.subType);
                    break;
                case 3:
                    avro::decode(d, v.ssc);
                    break;
                case 4:
                    avro::decode(d, v.packetLength);
                    break;
                case 5:
                    avro::decode(d, v.year);
                    break;
                case 6:
                    avro::decode(d, v.month);
                    break;
                case 7:
                    avro::decode(d, v.day);
                    break;
                case 8:
                    avro::decode(d, v.hours);
                    break;
                case 9:
                    avro::decode(d, v.minutes);
                    break;
                case 10:
                    avro::decode(d, v.seconds);
                    break;
                case 11:
                    avro::decode(d, v.validTime);
                    break;
                case 12:
                    avro::decode(d, v.timeTagNanosec);
                    break;
                case 13:
                    avro::decode(d, v.eventCounter);
                    break;
                case 14:
                    avro::decode(d, v.lid);
                    break;
                case 15:
                    avro::decode(d, v.fibSt);
                    break;
                case 16:
                    avro::decode(d, v.fibCont);
                    break;
                case 17:
                    avro::decode(d, v.fibPuls);
                    break;
                case 18:
                    avro::decode(d, v.rgbCont);
                    break;
                case 19:
                    avro::decode(d, v.rgbPuls);
                    break;
                case 20:
                    avro::decode(d, v.spare_0);
                    break;
                case 21:
                    avro::decode(d, v.pixelTriggerDiscriminatorThreshold);
                    break;
                case 22:
                    avro::decode(d, v.ptm);
                    break;
                case 23:
                    avro::decode(d, v.triggeredPixel);
                    break;
                case 24:
                    avro::decode(d, v.timeWindow);
                    break;
                case 25:
                    avro::decode(d, v.discriminatorChain);
                    break;
                case 26:
                    avro::decode(d, v.PDMs);
                    break;
                default:
                    break;
                }
            }
        } else {
            avro::decode(d, v.telescopeID);
            avro::decode(d, v.type);
            avro::decode(d, v.subType);
            avro::decode(d, v.ssc);
            avro::decode(d, v.packetLength);
            avro::decode(d, v.year);
            avro::decode(d, v.month);
            avro::decode(d, v.day);
            avro::decode(d, v.hours);
            avro::decode(d, v.minutes);
            avro::decode(d, v.seconds);
            avro::decode(d, v.validTime);
            avro::decode(d, v.timeTagNanosec);
            avro::decode(d, v.eventCounter);
            avro::decode(d, v.lid);
            avro::decode(d, v.fibSt);
            avro::decode(d, v.fibCont);
            avro::decode(d, v.fibPuls);
            avro::decode(d, v.rgbCont);
            avro::decode(d, v.rgbPuls);
            avro::decode(d, v.spare_0);
            avro::decode(d, v.pixelTriggerDiscriminatorThreshold);
            avro::decode(d, v.ptm);
            avro::decode(d, v.triggeredPixel);
            avro::decode(d, v.timeWindow);
            avro::decode(d, v.discriminatorChain);
            avro::decode(d, v.PDMs);
        }
    }
};

void encodeC11(Encoder &avroencoder,
		inaf::oasbo::PacketLib::BasePacket &packet) {
	// PACKET HEADER
	int offset;
	for (offset = 0; offset < 11; offset++)
		avro::encode(avroencoder, (int32_t) packet[offset].value());

	avro::encode(avroencoder, (bool) packet[11].value());
	avro::encode(avroencoder, (int32_t) packet[12].value());
	avro::encode(avroencoder, (int32_t) packet[13].value());
	avro::encode(avroencoder, (bool) packet[14].value());
	avro::encode(avroencoder, (bool) packet[15].value());
	avro::encode(avroencoder, (bool) packet[16].value());
	avro::encode(avroencoder, (bool) packet[17].value());

	// PACKET DATA FIELD HEADER EXTENSION
	for (offset = 18; offset < 22; offset++)
		avro::encode(avroencoder, (int32_t) packet[offset].value());

	avro::encode(avroencoder, (bool) packet[22].value());
	avro::encode(avroencoder, (int32_t) packet[23].value());
	avro::encode(avroencoder, (int32_t) packet[24].value());
	avro::encode(avroencoder, (int32_t) packet[25].value());
	offset = 26;

	// PACKET SOURCE DATA FIELD
	avroencoder.arrayStart();
	avroencoder.setItemCount(C11::NUM_PDM);

	for (int i = 0; i < C11::NUM_PDM; i++) {
		avroencoder.startItem();
		avro::encode(avroencoder, (bool) packet[offset++].value());
		avro::encode(avroencoder, (int32_t) packet[offset++].value());
		avro::encode(avroencoder, (int32_t) packet[offset++].value());

		avroencoder.arrayStart();
		avroencoder.setItemCount(C11::TRIGGER_COUNT_SIZE);
		for(int i = 0; i < C11::TRIGGER_COUNT_SIZE; i++){
			avroencoder.startItem();
			avro::encode(avroencoder, (int32_t) packet[offset+i].value());
		}
		offset += C11::TRIGGER_COUNT_SIZE;
		avroencoder.arrayEnd();
		avro::encode(avroencoder, (int32_t) packet[offset++].value());
		avro::encode(avroencoder, (int32_t) packet[offset++].value());
		avro::encode(avroencoder, (int32_t) packet[offset++].value());
		avro::encode(avroencoder, (int32_t) packet[offset++].value());
		avro::encode(avroencoder, (int32_t) packet[offset++].value());
	}
	avroencoder.arrayEnd();
}