/*
Copyright (c) 2015, The Linux Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of The Linux Foundation nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef __FM_RADIO_CTRL_H__
#define __FM_RADIO_CTRL_H___

#include <pthread.h>
#include <ctime>

class FmRadioController
{
    private:
        int cur_fm_state;
        char af_enabled;
        bool seek_scan_canceled;
        bool is_rds_support;
        bool is_ps_event_received = false;
        bool is_rt_event_received = false;
        bool is_af_jump_received = false;
        bool event_listener_canceled;
        pthread_mutex_t mutex_fm_state;
        pthread_mutex_t mutex_turn_on_cond;
        pthread_mutex_t mutex_seek_compl_cond;
        pthread_mutex_t mutex_scan_compl_cond;
        pthread_mutex_t mutex_tune_compl_cond;
        pthread_cond_t turn_on_cond;
        pthread_cond_t seek_compl_cond;
        pthread_cond_t scan_compl_cond;
        pthread_cond_t tune_compl_cond;
        char rds_enabled;
        long int prev_freq;
        int fd_driver;
        pthread_t event_listener_thread;
        int SetRdsGrpMask(int mask);
        int SetRdsGrpProcessing(int grps);
        void handle_enabled_event(void);
        void handle_tuned_event(void);
        void handle_seek_next_event(void);
        void handle_seek_complete_event(void);
        void handle_raw_rds_event(void);
        void handle_rt_event(void);
        void handle_ps_event(void);
        void handle_error_event(void);
        void handle_below_th_event(void);
        void handle_above_th_event(void);
        void handle_stereo_event(void);
        void handle_mono_event(void);
        void handle_rds_aval_event(void);
        void handle_rds_not_aval_event(void);
        void handle_srch_list_event(void);
        void handle_af_list_event(void);
        void handle_disabled_event(void);
        void handle_rds_grp_mask_req_event(void);
        void handle_rt_plus_event(void);
        void handle_ert_event(void);
        void handle_af_jmp_event(void);
        void set_fm_state(int state);
        struct timespec set_time_out(int secs);
        int GetStationList(uint16_t *scan_tbl, int *max_cnt);
        int EnableRDS(void);
        int DisableRDS(void);
        int EnableAF(void);
        int DisableAF(void);
        int SetStereo(void);
        int SetMono(void);
        int MuteOn(void);
        int MuteOff(void);
        int get_fm_state(void);
        long GetCurrentRSSI(void);
        bool GetSoftMute(void);
    public:
       FmRadioController();
       ~FmRadioController();
       int open_dev(void);
       int close_dev();
       int Pwr_Up(int freq);
       int Pwr_Down(void);
       long GetChannel(void);
       int TuneChannel(long);
       bool IsRds_support();
       int ScanList(uint16_t *scan_tbl, int *max_cnt);
       int Seek(int dir);
       int ReadRDS(void);
       int Get_ps(char *ps, int *ps_len);
       int Get_rt(char *rt, int *rt_len);
       int Get_AF_freq(uint16_t *ret_freq);
       int SetDeConstant(long );
       int SetSoftMute(bool mode);
       int Set_mute(bool mute);
       int SetBand(long);
       int SetChannelSpacing(long);
       int Stop_Scan_Seek(void);
       int Turn_On_Off_Rds(bool onoff);
       int Antenna_Switch(int antenna);
       static void* handle_events(void *arg);
       bool process_radio_events(int event);
};

#endif
