/*
 * Copyright (c) 2011-2014 - Mauro Carvalho Chehab
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation version 2.1 of the License.
 *
 * This program 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 */
#ifndef _LIBSAT_H
#define _LIBSAT_H

#include "dvb-v5-std.h"

/**
 * @file dvb-sat.h
 * @ingroup satellite
 * @brief Provides interfaces to deal with DVB Satellite systems.
 * @copyright GNU Lesser General Public License version 2.1 (LGPLv2.1)
 * @author Mauro Carvalho Chehab
 *
 * @par Bug Report
 * Please submit bug reports and patches to linux-media@vger.kernel.org
 */

/*
 * Satellite handling functions
 */

/**
 * @struct dvb_sat_lnb
 * @brief Stores the information of a LNBf
 * @ingroup satellite
 *
 * @param name		long name of the LNBf type
 * @param alias		short name for the LNBf type
 *
 * The LNBf (low-noise block downconverter) is a type of amplifier that is
 * installed inside the parabolic dishes. It converts the antenna signal to
 * an Intermediate Frequency. Several Ku-band LNBf have more than one IF.
 * The lower IF is stored at lowfreq, the higher IF at highfreq.
 * The exact setup for those structs actually depend on the model of the LNBf,
 * and its usage.
 */
struct dvb_sat_lnb {
	const char *name;
	const char *alias;

	/*
	 * Legacy fields, kept just to avoid ABI breakages
	 * Should not be used by new applications
	 */
	unsigned lowfreq, highfreq;
	unsigned rangeswitch;
	struct dvbsat_freqrange {
		unsigned low, high;
	} freqrange[2];
};

struct dvb_v5_fe_parms;

#ifdef __cplusplus
extern "C" {
#endif

/* From libsat.c */

/**
 * @brief search for a LNBf entry
 * @ingroup satellite
 *
 * @param name	name of the LNBf entry to seek.
 *
 * On sucess, it returns a non-negative number with corresponds to the LNBf
 * entry inside the LNBf structure at dvb-sat.c.
 *
 * @return A -1 return code indicates that the LNBf was not found.
 */
int dvb_sat_search_lnb(const char *name);

/**
 * @brief prints the contents of a LNBf entry at STDOUT.
 * @ingroup satellite
 *
 * @param index		index for the entry
 *
 * @return returns -1 if the index is out of range, zero otherwise.
 */
int dvb_print_lnb(int index);

/**
 * @brief Prints all LNBf entries at STDOUT.
 * @ingroup satellite
 *
 * This function doesn't return anything. Internally, it calls dvb_print_lnb()
 * for all entries inside its LNBf database.
 */
void dvb_print_all_lnb(void);

/**
 * @brief gets a LNBf entry at its internal database
 * @ingroup satellite
 *
 * @param index		index for the entry.
 *
 * @return returns NULL if not found, of a struct dvb_sat_lnb pointer otherwise.
 *
 * NOTE: none of the strings are i18n translated. In order to get the
 * translated name, you should use dvb_sat_get_lnb_name()
 */
const struct dvb_sat_lnb *dvb_sat_get_lnb(int index);

/**
 * @brief gets a LNBf entry at its internal database
 * @ingroup satellite
 *
 * @param index		index for the entry.
 *
 * @return returns NULL if not found, of the name of a LNBf,
 * translated to the user language, if translation is available.
 */
const char *dvb_sat_get_lnb_name(int index);

/**
 * @brief sets the satellite parameters
 * @ingroup satellite
 *
 * @param parms	struct dvb_v5_fe_parms pointer.
 *
 * This function is called internally by the library to set the LNBf
 * parameters, if the dvb_v5_fe_parms::lnb field is filled.
 *
 * @return 0 on success.
 */
int dvb_sat_set_parms(struct dvb_v5_fe_parms *parms);

/**
 * @brief return the real satellite frequency
 * @ingroup satellite
 *
 * @param p	struct dvb_v5_fe_parms pointer.
 * @param freq	the DTV frequency.
 *
 * This function is called internally by the library to get the satellite
 * frequency, considering the LO frequency.
 *
 * @return frequency.
 */
int dvb_sat_real_freq(struct dvb_v5_fe_parms *p, int freq);


#ifdef __cplusplus
}
#endif

#endif // _LIBSAT_H
