1bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/**
2bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * @file oprof_start.h
3bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * The GUI start main class
4bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
5bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * @remark Copyright 2002 OProfile authors
6bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * @remark Read the file COPYING
7bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson *
8bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * @author Philippe Elie
9bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson * @author John Levon
10bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson */
11bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
12bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#ifndef OPROF_START_H
13bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#define OPROF_START_H
14bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
15bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include <vector>
16bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include <map>
17bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include <set>
18bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
19bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "ui/oprof_start.base.h"
20bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "oprof_start_config.h"
21bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
22bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#include "op_events.h"
23bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
24bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass QIntValidator;
25bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass QListViewItem;
26bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass QTimerEvent;
27bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
28bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson/// a struct describing a particular event type
29bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonstruct op_event_descr {
30bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	op_event_descr();
31bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
32bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// bit mask of allowed counters
33bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	uint counter_mask;
34bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// hardware event number
35bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	u32 val;
36bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// unit mask values if applicable
37bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	op_unit_mask const * unit;
38bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// name of event
39bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	std::string name;
40bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// description of event
41bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	std::string help_str;
42bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// minimum counter value
43bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	uint min_count;
44bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson};
45bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
46bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonclass oprof_start : public oprof_start_base
47bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson{
48bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	Q_OBJECT
49bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
50bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonpublic:
51bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	oprof_start();
52bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
53bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonprotected slots:
54bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// select the kernel image filename
55bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void choose_kernel_filename();
56bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// flush profiler
57bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void on_flush_profiler_data();
58bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// start profiler
59bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void on_start_profiler();
60bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// stop profiler
61bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void on_stop_profiler();
62bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// events selection change
63bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void event_selected();
64bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// the mouse is over an event
65bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void event_over(QListViewItem *);
66bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// state of separate_kernel_cb changed
67bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void on_separate_kernel_cb_changed(int);
68bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// reset sample files
69bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void on_reset_sample_files();
70bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
71bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// close the dialog
72bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void accept();
73bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
74bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// WM hide event
75bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void closeEvent(QCloseEvent * e);
76bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
77bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// timer event
78bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void timerEvent(QTimerEvent * e);
79bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
80bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilsonprivate:
81bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// the counter combo has been activated
82bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void fill_events_listbox();
83bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
84bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// fill the event details and gui setup
85bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void fill_events();
86bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
87bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// find an event description by name
88bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	op_event_descr const & locate_event(std::string const & name) const;
89bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
90bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// update config on user change
91bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void record_selected_event_config();
92bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// update config and validate
93bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	bool record_config();
94bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
95bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// calculate unit mask for given event and unit mask part
96bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void get_unit_mask_part(op_event_descr const & descr, uint num, bool selected, uint & mask);
97bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// calculate unit mask for given event
98bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	uint get_unit_mask(op_event_descr const & descr);
99bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// set the unit mask widgets for given event
100bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void setup_unit_masks(op_event_descr const & descr);
101bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
102bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// return the maximum perf counter value for the current cpu type
103bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	uint max_perf_count() const;
104bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
105bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// show an event's settings
106bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void display_event(op_event_descr const & descrp);
107bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
108bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// hide unit mask widgets
109bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void hide_masks(void);
110bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
111bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// read the events set in daemonrc
112bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void read_set_events();
113bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// use the default event
114bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void setup_default_event();
115bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// load the extra config file
116bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void load_config_file();
117bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// save the config
118bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	bool save_config();
119bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
120bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// redraw the event list by changing icon status
121bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	void draw_event_list();
122bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
123bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// return true if item is selectable or already selected
124bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	bool is_selectable_event(QListViewItem * item);
125bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
126bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// try to alloc counters for the selected_events
127bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	bool alloc_selected_events() const;
128bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
129bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// validator for event count
130bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	QIntValidator* event_count_validator;
131bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
132bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// all available events for this hardware
133bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	std::vector<op_event_descr> v_events;
134bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
135bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// current event configs for each counter
136bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	typedef std::map<std::string, event_setting> event_setting_map;
137bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	event_setting_map event_cfgs;
138bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
139bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// The currently selected events. We must track this because
140bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// with multiple selection listbox QT doesn't allow to know
141bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// what is the last selected item. events_selected() update it
142bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	std::set<QListViewItem *> selected_events;
143bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	QListViewItem * current_event;
144bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
145bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// current config
146bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	config_setting config;
147bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
148bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// the expansion of "~" directory
149bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	std::string user_dir;
150bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
151bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// CPU type
152bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	op_cpu cpu_type;
153bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
154bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// CPU speed in MHz
155bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	double cpu_speed;
156bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
157bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// total number of available HW counters
158bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	uint op_nr_counters;
159bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
160bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	/// Total number of samples for this run
161bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson	unsigned long total_nr_interrupts;
162bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson};
163bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson
164bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson#endif // OPROF_START_H
165bdd62c531bbdea115a3a7e71bba91c19dd319cc4Heather Lee Wilson