/*
 * Copyright 2012 Free Software Foundation, Inc.
 *
 * This file is part of GNU Radio
 *
 * GNU Radio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 *
 * GNU Radio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with GNU Radio; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

[["python:package:gnuradio.ctrlport"]]

#ifndef GNURADIO_DEBUG
#define GNURADIO_DEBUG

module GNURadio {

struct complex {
  float re;
  float im;
};

class Knob {};
class KnobB extends Knob { bool   value; };
class KnobC extends Knob { byte   value; };
class KnobI extends Knob { int 	  value; };
class KnobF extends Knob { float  value; };
class KnobD extends Knob { double value; };
class KnobL extends Knob { long   value; };
class KnobS extends Knob { string value; };
class KnobZ extends Knob { complex value; };

sequence<bool>   VectorB; sequence<byte>   VectorC; 
sequence<int>    VectorI; sequence<float>  VectorF;
sequence<double> VectorD; sequence<string> VectorS;
sequence<long> 	 VectorL;

class KnobVecB extends Knob { VectorB value; }; 
class KnobVecC extends Knob { VectorC value; }; 
class KnobVecI extends Knob { VectorI value; }; 
class KnobVecF extends Knob { VectorF value; }; 
class KnobVecD extends Knob { VectorD value; }; 
class KnobVecL extends Knob { VectorL value; }; 
class KnobVecS extends Knob { VectorS value; }; 

enum KnobType { KNOBBOOL, 	KNOBCHAR, 	KNOBINT, 	KNOBFLOAT, 
		KNOBDOUBLE, 	KNOBSTRING, 	KNOBLONG, 	KNOBVECBOOL, 
		KNOBVECCHAR, 	KNOBVECINT,	KNOBVECFLOAT, 	KNOBVECDOUBLE, 
		KNOBVECSTRING, 	KNOBVECLONG };

const int DISPNULL = 0x0000;
const int DISPTIME = 0x0001;
const int DISPXY   = 0x0002;
const int DISPPSD  = 0x0004;
const int DISPSPEC = 0x0008;
const int DISPRAST = 0x0010;
const int DISPOPTCPLX    = 0x0100;
const int DISPOPTLOG     = 0x0200;
const int DISPOPTSTEM    = 0x0400; 
const int DISPOPTSTRIP   = 0x0800;
const int DISPOPTSCATTER = 0x1000;

struct KnobProp {
	KnobType    type;
	string      units;
	string      description;
        int         display;
	Knob        min;
	Knob        max;
	Knob        defaultvalue;
};

sequence<string> 		KnobIDList;
dictionary<string, Knob> 	KnobMap;
dictionary<string, KnobProp> 	KnobPropMap;
dictionary<string, string>	WaveformArgMap;

interface StreamReceiver {
    void 			push(VectorC 	data);
};

interface ControlPort {
    void 			set(KnobMap knobs);
    idempotent  KnobMap 	get(KnobIDList knobs);
    idempotent  KnobMap 	getRe(KnobIDList knobs);
    idempotent  KnobPropMap 	properties(KnobIDList knobs);
    void 			shutdown();
};

};

#endif