source: libi4uc/i4ucprogrammerspresenter.vala @ f7ca2a2bc940eb4ada6c54cc6333162a44a67624

Revision f7ca2a2bc940eb4ada6c54cc6333162a44a67624, 15.2 KB checked in by Matias De la Puente <mfpuente.ar@…>, 3 years ago (diff)

Programmers: Move actions to the menu and toolbar

Fixes Ticket #2

  • Property mode set to 100644
RevLine 
[f6e03d7]1/* i4ucprogrammerspresenter.vala
2 *
3 * Copyright (C) 2010  Matias De la Puente
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 *
18 * Author:
19 *      Matias De la Puente <mfpuente.ar@gmail.com>
20 */
21
22public class I4uc.ProgrammersPresenter : GLib.Object
23{
24        private ProgrammersViewIface _view;
25        private DocumentsPresenter _documents_presenter;
26        private Programmer _current_programmer;
27        private Command _command = new Command ();
28        private string _read_hexfile;
29       
30        public ProgrammersPresenter (ProgrammersViewIface view, DocumentsPresenter documents_presenter)
31        {
32                _view = view;
33                _documents_presenter = documents_presenter;
34               
35                //Configure view
36                _view.side_page.tab_title = _("Programmers");
37                _view.log_page.tab_title = _("Programmer's log");
38               
39                //Load available serial ports
[fed7687]40                on_update_serial_port_clicked ();
[f6e03d7]41               
42                //Load baud rates
43                var baud_rates = SerialPortUtils.list_baud_rates ();
44                foreach (var baud_rate in baud_rates)
45                        _view.side_page.add_baud_rate (baud_rate);
46                if (I4uc.Settings.instance.baud_rate in baud_rates)
47                        _view.side_page.current_baud_rate = I4uc.Settings.instance.baud_rate;
48               
[4893941]49                //Load programmers
50                foreach (var programmer in I4uc.Settings.instance.programmers.values)
51                        _view.side_page.add_programmer (programmer.id);
52                if (I4uc.Settings.instance.programmer in I4uc.Settings.instance.programmers.keys)
53                        _view.side_page.current_programmer = I4uc.Settings.instance.programmer;
54                on_programmer_changed ();
55               
[f6e03d7]56                //Connect signals
57                _view.pages_panel.page_changed.connect (on_page_changed);
58                _view.side_page.programmer_changed.connect (on_programmer_changed);
59                _view.side_page.serial_port_changed.connect (on_serial_port_changed);
[fed7687]60                _view.side_page.update_serial_port_clicked.connect (on_update_serial_port_clicked);
[f6e03d7]61                _view.side_page.baud_rate_changed.connect (on_baud_rate_changed);
62                _view.side_page.devices_file_changed.connect (on_devices_file_changed);
63                _view.side_page.devices_folder_changed.connect (on_devices_folder_changed);
64                _view.side_page.clock_changed.connect (on_clock_changed);
65                _view.side_page.device_changed.connect (on_device_changed);
66                _view.side_page.fuses_changed.connect (on_fuses_changed);
[f7ca2a2]67                _view.write_flash_clicked.connect (on_write_flash_clicked);
68                _view.read_flash_clicked.connect (on_read_flash_clicked);
69                _view.verify_flash_clicked.connect (() => run_command (_current_programmer.verify_flash_command));
70                _view.erase_flash_clicked.connect (on_erase_flash_clicked);
71                _view.write_fuses_clicked.connect (on_write_fuses_clicked);
72                _view.read_fuses_clicked.connect (() => run_command (_current_programmer.read_fuses_command));
73                _view.get_version_clicked.connect (() => run_command (_current_programmer.get_version_command));
74                _view.stop_clicked.connect (() => _command.stop ());
[f6e03d7]75                _command.stopped.connect (on_command_stopped);
[9e8cdad]76                _command.stdout_message_added.connect ((message) => _view.log_page.add_line (message));
77                _command.stderror_message_added.connect ((message) => _view.log_page.add_line (message));
[f6e03d7]78        }
79       
80        private void on_page_changed (PageIface? page)
81        {
[f7ca2a2]82                _view.write_flash_sensitive = false;
83                _view.verify_flash_sensitive = false;
[f6e03d7]84               
85                if (page == null || _view.side_page.current_programmer == null)
86                        return;
87               
88                var valid_page = page.tab_title.has_suffix (".hex");
89                var programmer = I4uc.Settings.instance.programmers[_view.side_page.current_programmer];
90               
[f7ca2a2]91                _view.write_flash_sensitive = valid_page && programmer.can_write_flash;
92                _view.verify_flash_sensitive = valid_page && programmer.can_verify_flash;
[f6e03d7]93        }
94       
95        private void on_programmer_changed ()
96        {
97                hide_parameters ();
98                disable_actions ();
99               
100                if (_view.side_page.current_programmer == null)
101                {
102                        _current_programmer = null;
103                        return;
104                }
105               
106                _current_programmer = I4uc.Settings.instance.programmers[_view.side_page.current_programmer];
107               
108                if (I4uc.Settings.instance.programmer != _current_programmer.id)
109                        I4uc.Settings.instance.programmer = _current_programmer.id;
110               
111                var working_folder = I4uc.Settings.instance.working_folder;
112               
113                //Load devices file if the programmer has devices file
114                var has_devices_file_key = I4uc.Settings.instance.devices_files.has_key (_current_programmer.id);
115                if (_current_programmer.has_devices_file)
116                        _view.side_page.current_devices_file = has_devices_file_key ? I4uc.Settings.instance.devices_files[_current_programmer.id] : working_folder;
117               
118                //Load devices folder if the programmer has devices folder
119                var has_devices_folder_key = I4uc.Settings.instance.devices_folders.has_key (_current_programmer.id);
120                if (_current_programmer.has_devices_folder)
121                        _view.side_page.current_devices_folder = has_devices_folder_key ? I4uc.Settings.instance.devices_folders[_current_programmer.id] : working_folder;
122               
123                //Load clock if the programmer has clock
124                var has_clock_key = I4uc.Settings.instance.clocks.has_key (_current_programmer.id);
125                if (_current_programmer.has_clock)
126                        _view.side_page.current_clock = has_clock_key ? I4uc.Settings.instance.clocks[_current_programmer.id] : "";
127               
128                //Load devices list
129                _view.side_page.clear_devices_list ();
130                foreach (var device in _current_programmer.devices)
131                        _view.side_page.add_device (device);
132                var has_device_key = I4uc.Settings.instance.devices.has_key (_current_programmer.id);
[8ab3720]133                if (has_device_key)
134                        _view.side_page.current_device = I4uc.Settings.instance.devices[_current_programmer.id];
[f6e03d7]135               
136                //Load fuses if the programmer can write fuses
137                var can_write_fuses_key = I4uc.Settings.instance.fuses.has_key (_current_programmer.id);
138                if (_current_programmer.can_write_fuses)
139                        _view.side_page.current_fuses = can_write_fuses_key ? I4uc.Settings.instance.fuses[_current_programmer.id] : "";
140               
141                _view.side_page.serial_port_visible = _current_programmer.has_serial_port;
142                _view.side_page.baud_rate_visible = _current_programmer.has_baud_rate;
143                _view.side_page.devices_file_visible = _current_programmer.has_devices_file;
144                _view.side_page.devices_folder_visible = _current_programmer.has_devices_folder;
145                _view.side_page.clock_visible = _current_programmer.has_clock;
146                _view.side_page.fuses_visible = _current_programmer.can_write_fuses;
147                enable_actions ();
148        }
149       
150        private void on_serial_port_changed ()
151        {
152                disable_actions ();
153               
154                if (_current_programmer == null)
155                        return;
156               
[fed7687]157                var current_serial_port = _view.side_page.current_serial_port;
158               
159                if (current_serial_port != null && I4uc.Settings.instance.serial_port != current_serial_port)
160                        I4uc.Settings.instance.serial_port = current_serial_port;
[f6e03d7]161               
162                enable_actions ();
163        }
164       
[fed7687]165        private void on_update_serial_port_clicked ()
166        {
167                _view.side_page.clear_serial_ports_list ();
168                var serial_ports = SerialPortUtils.list_serial_ports ();
169                foreach (var serial_port in serial_ports)
170                        _view.side_page.add_serial_port (serial_port);
171                if (I4uc.Settings.instance.serial_port in serial_ports)
172                        _view.side_page.current_serial_port = I4uc.Settings.instance.serial_port;
173        }
174       
[f6e03d7]175        private void on_baud_rate_changed ()
176        {
177                disable_actions ();
178               
179                if (_current_programmer == null)
180                        return;
181               
[fed7687]182                var current_baud_rate = _view.side_page.current_baud_rate;
183               
184                if (current_baud_rate != null && I4uc.Settings.instance.baud_rate != current_baud_rate)
185                        I4uc.Settings.instance.baud_rate = current_baud_rate;
[f6e03d7]186               
187                enable_actions ();
188        }
189       
190        private void on_devices_file_changed ()
191        {
192                disable_actions ();
193               
194                if (_current_programmer == null)
195                        return;
196               
197                var current_devices_file = _view.side_page.current_devices_file;
198               
199                if (I4uc.Settings.instance.devices_files[_current_programmer.id] != current_devices_file)
200                        I4uc.Settings.instance.devices_files[_current_programmer.id] = current_devices_file;
201               
202                enable_actions ();
203        }
204       
205        private void on_devices_folder_changed ()
206        {
207                disable_actions ();
208               
209                if (_current_programmer == null)
210                        return;
211               
212                var current_devices_folder = _view.side_page.current_devices_folder;
213               
214                if (I4uc.Settings.instance.devices_folders[_current_programmer.id] != current_devices_folder)
215                        I4uc.Settings.instance.devices_folders[_current_programmer.id] = current_devices_folder;
216               
217                enable_actions ();
218        }
219       
220        private void on_clock_changed ()
221        {
222                disable_actions ();
223               
224                if (_current_programmer == null)
225                        return;
226               
227                var current_clock = _view.side_page.current_clock;
228               
229                if (I4uc.Settings.instance.clocks[_current_programmer.id] != current_clock)
230                        I4uc.Settings.instance.clocks[_current_programmer.id] = current_clock;
231               
232                enable_actions ();
233        }
234       
235        private void on_device_changed ()
236        {
237                disable_actions ();
238               
239                if (_current_programmer == null)
240                        return;
241               
242                var current_device = _view.side_page.current_device;
243               
[8ab3720]244                if (current_device != null && I4uc.Settings.instance.devices[_current_programmer.id] != current_device)
[f6e03d7]245                        I4uc.Settings.instance.devices[_current_programmer.id] = current_device;
246               
247                enable_actions ();
248        }
249       
250        private void on_fuses_changed ()
251        {
252                disable_actions ();
253               
254                if (_current_programmer == null)
255                        return;
256               
257                var current_fuses = _view.side_page.current_fuses;
258               
259                if (I4uc.Settings.instance.fuses[_current_programmer.id] != current_fuses)
260                        I4uc.Settings.instance.fuses[_current_programmer.id] = current_fuses;
261               
262                enable_actions ();
263        }
264       
[3c2306a]265        private void on_write_flash_clicked ()
266        {
267                if (_view.show_yes_no_message (_("Are you sure you want to write the flash memory?")) == Gtk.ResponseType.YES)
268                        run_command (_current_programmer.write_flash_command);
269        }
270       
[f6e03d7]271        private void on_read_flash_clicked ()
272        {
273                string folder_uri = I4uc.Settings.instance.working_folder;
274                string hexfile_uri;
275                _view.show_open_dialog (ref folder_uri, out hexfile_uri);
276                if (hexfile_uri != null)
277                {
278                        I4uc.Settings.instance.working_folder = folder_uri;
279                        _read_hexfile = hexfile_uri;
280                        run_command (_current_programmer.read_flash_command);
281                }
282        }
283       
[3c2306a]284        private void on_erase_flash_clicked ()
285        {
286                if (_view.show_yes_no_message (_("Are you sure you want to erase the flash memory?")) == Gtk.ResponseType.YES)
287                        run_command (_current_programmer.erase_flash_command);
288        }
289       
290        private void on_write_fuses_clicked ()
291        {
292                if (_view.show_yes_no_message (_("Are you sure you want to write the fuses?")) == Gtk.ResponseType.YES)
293                        run_command (_current_programmer.write_fuses_command);
294        }
295       
[f6e03d7]296        private void on_command_stopped ()
297        {
298                if (_read_hexfile != null)
299                {
300                        _documents_presenter.open_document (_read_hexfile);
301                        _read_hexfile = null;
302                }
303                set_parameters_sensitive (true);
304                enable_actions ();
305        }
306       
307        private void run_command (string command)
308        {
309                var filtered_command = command;
310               
311                if (_current_programmer.has_serial_port)
312                        filtered_command = filtered_command.replace ("%serial_port", _view.side_page.current_serial_port);
313                if (_current_programmer.has_baud_rate)
314                        filtered_command = filtered_command.replace ("%baud_rate", _view.side_page.current_baud_rate);
315                if (_current_programmer.has_devices_file)
316                {
317                        var devices_file = File.new_for_uri (_view.side_page.current_devices_file).get_path ();
[7a80806]318                        filtered_command = filtered_command.replace ("%devices_file", "\"" + devices_file + "\"");
[f6e03d7]319                }
320                if (_current_programmer.has_devices_folder)
321                {
322                        var devices_folder = File.new_for_uri (_view.side_page.current_devices_folder).get_path ();
[7a80806]323                        filtered_command = filtered_command.replace ("%devices_folder",  "\"" + devices_folder + "\"");
[f6e03d7]324                }
325                if (_current_programmer.has_clock)
326                        filtered_command = filtered_command.replace ("%clock", _view.side_page.current_clock);
327               
328                filtered_command = filtered_command.replace ("%device", _view.side_page.current_device);
329               
330                if (_current_programmer.can_write_fuses)
331                        filtered_command = filtered_command.replace ("%fuses", _view.side_page.current_fuses);
332               
333                if (_read_hexfile == null)
334                {
335                        if (_view.pages_panel.current_page != null && _view.pages_panel.current_page.tab_title.has_suffix (".hex"))
336                        {
337                                var hexfile = File.new_for_uri (_view.pages_panel.current_page.title).get_path ();
[7a80806]338                                filtered_command = filtered_command.replace ("%hexfile", "\"" + hexfile + "\"");
[f6e03d7]339                        }
340                }
341                else
342                {
343                        var hexfile = File.new_for_uri (_read_hexfile).get_path ();
[7a80806]344                        filtered_command = filtered_command.replace ("%hexfile", "\"" + hexfile + "\"");
[f6e03d7]345                }
346               
347                if (_command.run (filtered_command))
348                {
349                        set_parameters_sensitive (false);
350                        disable_actions ();
[f7ca2a2]351                        _view.stop_sensitive = true;
[f6e03d7]352                }
353               
354                _view.show_log_page ();
355        }
356       
357        private void hide_parameters ()
358        {
359                _view.side_page.serial_port_visible = false;
360                _view.side_page.baud_rate_visible = false;
361                _view.side_page.devices_file_visible = false;
362                _view.side_page.devices_folder_visible = false;
363                _view.side_page.clock_visible = false;
364                _view.side_page.fuses_visible = false;
365        }
366       
367        private void set_parameters_sensitive (bool sensitive)
368        {
369                _view.side_page.programmer_sensitive = sensitive;
370                _view.side_page.serial_port_sensitive = sensitive;
371                _view.side_page.baud_rate_sensitive = sensitive;
372                _view.side_page.devices_file_sensitive = sensitive;
373                _view.side_page.devices_folder_sensitive = sensitive;
374                _view.side_page.clock_sensitive = sensitive;
375                _view.side_page.device_sensitive = sensitive;
376                _view.side_page.fuses_sensitive = sensitive;
377        }
378       
379        private void enable_actions ()
380        {
381                var valid_page = _view.pages_panel.current_page != null && _view.pages_panel.current_page.tab_title.has_suffix (".hex");
382                var valid_serial_port =  !_current_programmer.has_serial_port || _view.side_page.current_serial_port != null;
383                var valid_baud_rate = !_current_programmer.has_baud_rate || _view.side_page.current_baud_rate != null;
384                var valid_devices_file = !_current_programmer.has_devices_file || _view.side_page.current_devices_file != null;
385                var valid_devices_folder =  !_current_programmer.has_devices_folder || _view.side_page.current_devices_folder != null;
386                var valid_clock =  !_current_programmer.has_clock || _view.side_page.current_clock != "";
387                var valid_device = _view.side_page.current_device != null;
388                var valid_fuses = !_current_programmer.can_write_fuses || _view.side_page.current_fuses != "";
389               
390                if (!valid_serial_port ||
391                    !valid_baud_rate ||
392                    !valid_devices_file ||
393                    !valid_devices_folder ||
394                    !valid_clock ||
[cabbcc1]395                    !valid_device)
[f6e03d7]396                    return;
397               
[f7ca2a2]398                _view.write_flash_sensitive = valid_page && _current_programmer.can_write_flash;
399                _view.read_flash_sensitive = _current_programmer.can_read_flash;
400                _view.verify_flash_sensitive = valid_page && _current_programmer.can_verify_flash;
401                _view.erase_flash_sensitive = _current_programmer.can_erase_flash;
402                _view.write_fuses_sensitive = valid_fuses && _current_programmer.can_write_fuses;
403                _view.read_fuses_sensitive = _current_programmer.can_read_fuses;
404                _view.get_version_sensitive = _current_programmer.can_get_version;
405                _view.stop_sensitive = _command.is_running;
[f6e03d7]406        }
407       
408        private void disable_actions ()
409        {
[f7ca2a2]410                _view.write_flash_sensitive = false;
411                _view.read_flash_sensitive = false;
412                _view.verify_flash_sensitive = false;
413                _view.erase_flash_sensitive = false;
414                _view.write_fuses_sensitive = false;
415                _view.read_fuses_sensitive = false;
416                _view.get_version_sensitive = false;
417                _view.stop_sensitive = false;
[f6e03d7]418        }
419}
Note: See TracBrowser for help on using the repository browser.