/****************************************************************************
 * Copyright (C) 2004 Leonid Zolotarev
 *
 * Licensed under the terms of the BSD license, see file COPYING
 * for details.
 *
 * GTK ACX Tool.
 *
 * Timer.
 *
 * $Id: gacxtimer.c,v 1.10 2004/10/18 19:13:09 leoz Exp $
 ***************************************************************************/

#include "support.h"
#include "gacxopt.h"
#include "gacxmain.h"
#include "gacxtimer.h"
#include "gacxsignal.h"
#include "gacxtraffic.h"
#include "gacxrate.h"
#include "gacxbox.h"
#include "gacxset.h"

/***************************************************************************/

gacx_timer_data* _timer_data = 0;

/***************************************************************************/

gdouble gacx_rate_to_kbps ( glong rate,
                            gint  timeout )
{
	gdouble seconds = timeout * 0.001;
	gdouble kbps    = ( rate / 1000 ) / seconds;
	return kbps;
}

/***************************************************************************/

static gint    _val_count        = 0;

static glong   _val_cur_transmit = 0L;
static glong   _val_cur_receive  = 0L;

/***************************************************************************/

gint    _val_quality  = 0;
gint    _val_strength = 0;
gint    _val_noise    = 0;

gdouble _val_transmit = 0.0;
gdouble _val_receive  = 0.0;

/***************************************************************************/

void gacx_delay_proc ( gacx_timer_data* data, acx_interface_stat* stat )
{
	_val_quality  += ( 100 - acx_user_level ( stat->is_noise ) );
	_val_strength += acx_user_level ( stat->is_strength );
	_val_noise    += acx_user_level ( stat->is_noise );
	_val_transmit += gacx_rate_to_kbps (
                                     stat->is_bytes_sent - _val_cur_transmit,
                                     data->td_timeout );
	_val_receive  += gacx_rate_to_kbps (
                                     stat->is_bytes_received - _val_cur_receive,
                                     data->td_timeout );
	_val_count++;
	
	if ( _val_count == _gacx_options.o_delay ) {
		gacx_delay_gui_proc_signal  ( data, stat );
		gacx_delay_gui_proc_traffic ( data, stat );
		_val_quality  = 0;
		_val_strength = 0;
		_val_noise    = 0;
		_val_transmit = 0.0;
		_val_receive  = 0.0;
		_val_count    = 0;
	}
	
	_val_cur_receive  = stat->is_bytes_received;
	_val_cur_transmit = stat->is_bytes_sent;
	
	if ( data->td_state == GACX_CREATED ) {
		data->td_state = GACX_INITIALIZED;
	}
}

/***************************************************************************/

gboolean gacx_timer_proc ( gpointer data )
{
	gchar* val_bssid = NULL;
	acx_interface_stat stat;
	gacx_timer_data* timer_data = ( gacx_timer_data* ) data;
	if ( timer_data && timer_data->td_iface == ACX_NO_ERROR ) {
		if ( acx_interface_get_stat ( &stat ) == ACX_NO_ERROR ) {

			gacx_delay_proc ( timer_data, &stat );
			
			val_bssid = net_wi_get_bssid ();
			gtk_entry_set_text ( GTK_ENTRY ( timer_data->td_ent_status ),
                                 net_wi_get_status ( val_bssid ) );
			gtk_entry_set_text ( GTK_ENTRY ( timer_data->td_ent_bssid  ),
                                 val_bssid );
			gtk_entry_set_text ( GTK_ENTRY ( timer_data->td_ent_ssid   ),
                                 net_80211_get_ssid   () );
			gacx_update_entry ( timer_data->td_ent_channel,
                                net_wi_get_channel () );

			gacx_rate_data_update ( stat.is_rates );
			gacx_settings_data_update ();
		}
		gacx_status_update_main ( _timer_data->td_status_main );
	}
	return TRUE;
} 

/***************************************************************************/

void gacx_hide_raw_data ()
{
	gtk_widget_hide ( _timer_data->td_ent_strength     );
	gtk_widget_hide ( _timer_data->td_ent_strength_avg );
	gtk_widget_hide ( _timer_data->td_ent_strength_max );
	gtk_widget_hide ( _timer_data->td_lab_strength_avg );
	gtk_widget_hide ( _timer_data->td_lab_strength_max );
	gtk_widget_hide ( _timer_data->td_ent_noise        );
	gtk_widget_hide ( _timer_data->td_ent_noise_avg    );
	gtk_widget_hide ( _timer_data->td_ent_noise_max    );
	gtk_widget_hide ( _timer_data->td_lab_noise_avg    );
	gtk_widget_hide ( _timer_data->td_lab_noise_max    );
	gtk_widget_hide ( _timer_data->td_ent_transmit     );
	gtk_widget_hide ( _timer_data->td_ent_receive      );	
}

/***************************************************************************/

void gacx_timer_data_create ( GtkWidget* main_window )
{
	if ( ! _timer_data ) {
    	_timer_data = g_malloc ( sizeof ( gacx_timer_data ) );
		_timer_data->td_iface        = acx_interface_open (
		                                           _gacx_options.o_iface_name );
		_timer_data->td_main_window  = main_window;
		_timer_data->td_bar_quality      = lookup_widget (main_window,
                                                        "quality_progressbar" );
		_timer_data->td_bar_strength     = lookup_widget (main_window,
                                                        "strength_progressbar");
		_timer_data->td_bar_noise        = lookup_widget (main_window,
                                                        "noise_progressbar"   );
		_timer_data->td_ent_strength     = lookup_widget (main_window,
                                                        "strength_entry"      );
		_timer_data->td_ent_strength_avg = lookup_widget (main_window,
                                                        "strength_entry_avg"  );
		_timer_data->td_ent_strength_max = lookup_widget (main_window,
                                                        "strength_entry_max"  );
		_timer_data->td_ent_noise        = lookup_widget (main_window,
                                                        "noise_entry"         );
		_timer_data->td_ent_noise_avg    = lookup_widget (main_window,
                                                        "noise_entry_avg"     );
		_timer_data->td_ent_noise_max    = lookup_widget (main_window,
                                                        "noise_entry_max"     );
		_timer_data->td_ent_status       = lookup_widget (main_window,
                                                        "entry_status"        );
		_timer_data->td_ent_bssid        = lookup_widget (main_window,
                                                        "entry_bssid"         );
		_timer_data->td_ent_ssid         = lookup_widget (main_window,
                                                        "entry_ssid"          );
		_timer_data->td_ent_channel      = lookup_widget (main_window,
                                                        "entry_channel"       );
		_timer_data->td_bar_transmit     = lookup_widget (main_window,
                                                        "transmit_progressbar");
		_timer_data->td_bar_receive      = lookup_widget (main_window,
                                                        "receive_progressbar" );
		_timer_data->td_ent_transmit     = lookup_widget (main_window,
                                                        "transmit_entry");
		_timer_data->td_ent_receive      = lookup_widget (main_window,
                                                        "receive_entry" );
		_timer_data->td_lab_strength_avg = lookup_widget (main_window,
                                                        "strength_label_avg" );
		_timer_data->td_lab_strength_max = lookup_widget (main_window,
                                                        "strength_label_max" );
		_timer_data->td_lab_noise_avg    = lookup_widget (main_window,
                                                        "noise_label_avg" );
		_timer_data->td_lab_noise_max    = lookup_widget (main_window,
                                                        "noise_label_max" );
		_timer_data->td_status_main      = lookup_widget (main_window,
                                                        "main_statusbar"   );
		_timer_data->td_status_device    = lookup_widget (main_window,
                                                        "device_statusbar" );
		_timer_data->td_status_user      = lookup_widget (main_window,
                                                        "user_statusbar" );
		_timer_data->td_state            = GACX_CREATED;
		_timer_data->td_max_rate         = _gacx_options.o_bandwidth;
		_timer_data->td_timeout          = _gacx_options.o_timeout;
		
		gacx_status_update_device ( _timer_data->td_status_device );
		gacx_status_update_user   ( _timer_data->td_status_user   );
		
		if ( _gacx_options.o_rawdata == GACX_FLAG_OFF ) {
			gacx_hide_raw_data ();
		}
		
    	_timer_data->td_timer = g_timeout_add ( _timer_data->td_timeout,
                                                gacx_timer_proc,
                                                _timer_data );
	}
	gacx_rate_data_create     ( main_window );
	gacx_settings_data_create ( main_window );
}

/***************************************************************************/

void gacx_timer_data_destroy ()
{
	gacx_settings_data_destroy ();
	gacx_rate_data_destroy     ();
	if ( _timer_data ) {
		g_source_remove ( _timer_data->td_timer );
		_timer_data->td_state            = GACX_FINALIZED;
		_timer_data->td_timer            = 0;
		_timer_data->td_timeout          = 0;
		_timer_data->td_max_rate         = 0;
		_timer_data->td_main_window      = NULL;
		_timer_data->td_bar_quality      = NULL;
		_timer_data->td_bar_strength     = NULL;
		_timer_data->td_bar_noise        = NULL;
		_timer_data->td_ent_strength     = NULL;
		_timer_data->td_ent_strength_avg = NULL;
		_timer_data->td_ent_strength_max = NULL;
		_timer_data->td_ent_noise        = NULL;
		_timer_data->td_ent_noise_avg    = NULL;
		_timer_data->td_ent_noise_max    = NULL;
		_timer_data->td_ent_status       = NULL;
		_timer_data->td_ent_bssid        = NULL;
		_timer_data->td_ent_ssid         = NULL;
		_timer_data->td_ent_channel      = NULL;
		_timer_data->td_bar_transmit     = NULL;
		_timer_data->td_bar_receive      = NULL;
		_timer_data->td_ent_transmit     = NULL;
		_timer_data->td_ent_receive      = NULL;
		_timer_data->td_lab_strength_avg = NULL;
		_timer_data->td_lab_strength_max = NULL;
		_timer_data->td_lab_noise_avg    = NULL;
		_timer_data->td_lab_noise_max    = NULL;
		_timer_data->td_status_main      = NULL;
		_timer_data->td_status_device    = NULL;
		_timer_data->td_status_user      = NULL;
		_timer_data->td_iface            = acx_interface_close ();
		g_free ( _timer_data );
		_timer_data = NULL;
	}
}

/***************************************************************************/


syntax highlighted by Code2HTML, v. 0.9.1