source: libi4uc/i4ucprogrammerspresenter.vala @ 4893941d55edeabaa4b19d4a2ee68a523dee62cb

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

Programmers: Load programmers after the serial port and baud rate lists

  • Property mode set to 100644
Line 
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
40                var serial_ports = SerialPortUtils.list_serial_ports ();
41                foreach (var serial_port in serial_ports)
42                        _view.side_page.add_serial_port (serial_port);
43                if (I4uc.Settings.instance.serial_port in serial_ports)
44                        _view.side_page.current_serial_port = I4uc.Settings.instance.serial_port;
45               
46                //Load baud rates
47                var baud_rates = SerialPortUtils.list_baud_rates ();
48                foreach (var baud_rate in baud_rates)
49                        _view.side_page.add_baud_rate (baud_rate);
50                if (I4uc.Settings.instance.baud_rate in baud_rates)
51                        _view.side_page.current_baud_rate = I4uc.Settings.instance.baud_rate;
52               
53                //Load programmers
54                foreach (var programmer in I4uc.Settings.instance.programmers.values)
55                        _view.side_page.add_programmer (programmer.id);
56                if (I4uc.Settings.instance.programmer in I4uc.Settings.instance.programmers.keys)
57                        _view.side_page.current_programmer = I4uc.Settings.instance.programmer;
58                on_programmer_changed ();
59               
60                //Connect signals
61                _view.pages_panel.page_changed.connect (on_page_changed);
62                _view.side_page.programmer_changed.connect (on_programmer_changed);
63                _view.side_page.serial_port_changed.connect (on_serial_port_changed);
64                _view.side_page.baud_rate_changed.connect (on_baud_rate_changed);
65                _view.side_page.devices_file_changed.connect (on_devices_file_changed);
66                _view.side_page.devices_folder_changed.connect (on_devices_folder_changed);
67                _view.side_page.clock_changed.connect (on_clock_changed);
68                _view.side_page.device_changed.connect (on_device_changed);
69                _view.side_page.fuses_changed.connect (on_fuses_changed);
70                _view.side_page.write_flash_clicked.connect (() => run_command (_current_programmer.write_flash_command));
71                _view.side_page.read_flash_clicked.connect (on_read_flash_clicked);
72                _view.side_page.verify_flash_clicked.connect (() => run_command (_current_programmer.verify_flash_command));
73                _view.side_page.erase_flash_clicked.connect (() => run_command (_current_programmer.erase_flash_command));
74                _view.side_page.write_fuses_clicked.connect (() => run_command (_current_programmer.write_fuses_command));
75                _view.side_page.read_fuses_clicked.connect (() => run_command (_current_programmer.read_fuses_command));
76                _view.side_page.get_version_clicked.connect (() => run_command (_current_programmer.get_version_command));
77                _view.side_page.stop_clicked.connect (() => _command.stop ());
78                _command.stopped.connect (on_command_stopped);
79                _command.message_added.connect ((message) => _view.log_page.add_line (message));
80        }
81       
82        private void on_page_changed (PageIface? page)
83        {
84                _view.side_page.write_flash_sensitive = false;
85                _view.side_page.verify_flash_sensitive = false;
86               
87                if (page == null || _view.side_page.current_programmer == null)
88                        return;
89               
90                var valid_page = page.tab_title.has_suffix (".hex");
91                var programmer = I4uc.Settings.instance.programmers[_view.side_page.current_programmer];
92               
93                _view.side_page.write_flash_sensitive = valid_page && programmer.can_write_flash;
94                _view.side_page.verify_flash_sensitive = valid_page && programmer.can_verify_flash;
95        }
96       
97        private void on_programmer_changed ()
98        {
99                hide_parameters ();
100                disable_actions ();
101               
102                if (_view.side_page.current_programmer == null)
103                {
104                        _current_programmer = null;
105                        return;
106                }
107               
108                _current_programmer = I4uc.Settings.instance.programmers[_view.side_page.current_programmer];
109               
110                if (I4uc.Settings.instance.programmer != _current_programmer.id)
111                        I4uc.Settings.instance.programmer = _current_programmer.id;
112               
113                var working_folder = I4uc.Settings.instance.working_folder;
114               
115                //Load devices file if the programmer has devices file
116                var has_devices_file_key = I4uc.Settings.instance.devices_files.has_key (_current_programmer.id);
117                if (_current_programmer.has_devices_file)
118                        _view.side_page.current_devices_file = has_devices_file_key ? I4uc.Settings.instance.devices_files[_current_programmer.id] : working_folder;
119               
120                //Load devices folder if the programmer has devices folder
121                var has_devices_folder_key = I4uc.Settings.instance.devices_folders.has_key (_current_programmer.id);
122                if (_current_programmer.has_devices_folder)
123                        _view.side_page.current_devices_folder = has_devices_folder_key ? I4uc.Settings.instance.devices_folders[_current_programmer.id] : working_folder;
124               
125                //Load clock if the programmer has clock
126                var has_clock_key = I4uc.Settings.instance.clocks.has_key (_current_programmer.id);
127                if (_current_programmer.has_clock)
128                        _view.side_page.current_clock = has_clock_key ? I4uc.Settings.instance.clocks[_current_programmer.id] : "";
129               
130                //Load devices list
131                _view.side_page.clear_devices_list ();
132                foreach (var device in _current_programmer.devices)
133                        _view.side_page.add_device (device);
134                var has_device_key = I4uc.Settings.instance.devices.has_key (_current_programmer.id);
135                if (has_device_key)
136                        _view.side_page.current_device = I4uc.Settings.instance.devices[_current_programmer.id];
137               
138                //Load fuses if the programmer can write fuses
139                var can_write_fuses_key = I4uc.Settings.instance.fuses.has_key (_current_programmer.id);
140                if (_current_programmer.can_write_fuses)
141                        _view.side_page.current_fuses = can_write_fuses_key ? I4uc.Settings.instance.fuses[_current_programmer.id] : "";
142               
143                _view.side_page.serial_port_visible = _current_programmer.has_serial_port;
144                _view.side_page.baud_rate_visible = _current_programmer.has_baud_rate;
145                _view.side_page.devices_file_visible = _current_programmer.has_devices_file;
146                _view.side_page.devices_folder_visible = _current_programmer.has_devices_folder;
147                _view.side_page.clock_visible = _current_programmer.has_clock;
148                _view.side_page.fuses_visible = _current_programmer.can_write_fuses;
149                enable_actions ();
150        }
151       
152        private void on_serial_port_changed ()
153        {
154                disable_actions ();
155               
156                if (_current_programmer == null)
157                        return;
158                if (_view.side_page.current_serial_port == null)
159                        return;
160               
161                if (I4uc.Settings.instance.serial_port != _view.side_page.current_serial_port)
162                        I4uc.Settings.instance.serial_port = _view.side_page.current_serial_port;
163               
164                enable_actions ();
165        }
166       
167        private void on_baud_rate_changed ()
168        {
169                disable_actions ();
170               
171                if (_current_programmer == null)
172                        return;
173                if (_view.side_page.current_baud_rate == null)
174                        return;
175               
176                if (I4uc.Settings.instance.baud_rate != _view.side_page.current_baud_rate)
177                        I4uc.Settings.instance.baud_rate = _view.side_page.current_baud_rate;
178               
179                enable_actions ();
180        }
181       
182        private void on_devices_file_changed ()
183        {
184                disable_actions ();
185               
186                if (_current_programmer == null)
187                        return;
188               
189                var current_devices_file = _view.side_page.current_devices_file;
190               
191                if (I4uc.Settings.instance.devices_files[_current_programmer.id] != current_devices_file)
192                        I4uc.Settings.instance.devices_files[_current_programmer.id] = current_devices_file;
193               
194                enable_actions ();
195        }
196       
197        private void on_devices_folder_changed ()
198        {
199                disable_actions ();
200               
201                if (_current_programmer == null)
202                        return;
203               
204                var current_devices_folder = _view.side_page.current_devices_folder;
205               
206                if (I4uc.Settings.instance.devices_folders[_current_programmer.id] != current_devices_folder)
207                        I4uc.Settings.instance.devices_folders[_current_programmer.id] = current_devices_folder;
208               
209                enable_actions ();
210        }
211       
212        private void on_clock_changed ()
213        {
214                disable_actions ();
215               
216                if (_current_programmer == null)
217                        return;
218               
219                var current_clock = _view.side_page.current_clock;
220               
221                if (I4uc.Settings.instance.clocks[_current_programmer.id] != current_clock)
222                        I4uc.Settings.instance.clocks[_current_programmer.id] = current_clock;
223               
224                enable_actions ();
225        }
226       
227        private void on_device_changed ()
228        {
229                disable_actions ();
230               
231                if (_current_programmer == null)
232                        return;
233               
234                var current_device = _view.side_page.current_device;
235               
236                if (current_device != null && I4uc.Settings.instance.devices[_current_programmer.id] != current_device)
237                        I4uc.Settings.instance.devices[_current_programmer.id] = current_device;
238               
239                enable_actions ();
240        }
241       
242        private void on_fuses_changed ()
243        {
244                disable_actions ();
245               
246                if (_current_programmer == null)
247                        return;
248               
249                var current_fuses = _view.side_page.current_fuses;
250               
251                if (I4uc.Settings.instance.fuses[_current_programmer.id] != current_fuses)
252                        I4uc.Settings.instance.fuses[_current_programmer.id] = current_fuses;
253               
254                enable_actions ();
255        }
256       
257        private void on_read_flash_clicked ()
258        {
259                string folder_uri = I4uc.Settings.instance.working_folder;
260                string hexfile_uri;
261                _view.show_open_dialog (ref folder_uri, out hexfile_uri);
262                if (hexfile_uri != null)
263                {
264                        I4uc.Settings.instance.working_folder = folder_uri;
265                        _read_hexfile = hexfile_uri;
266                        run_command (_current_programmer.read_flash_command);
267                }
268        }
269       
270        private void on_command_stopped ()
271        {
272                if (_read_hexfile != null)
273                {
274                        _documents_presenter.open_document (_read_hexfile);
275                        _read_hexfile = null;
276                }
277                set_parameters_sensitive (true);
278                enable_actions ();
279        }
280       
281        private void run_command (string command)
282        {
283                var filtered_command = command;
284               
285                if (_current_programmer.has_serial_port)
286                        filtered_command = filtered_command.replace ("%serial_port", _view.side_page.current_serial_port);
287                if (_current_programmer.has_baud_rate)
288                        filtered_command = filtered_command.replace ("%baud_rate", _view.side_page.current_baud_rate);
289                if (_current_programmer.has_devices_file)
290                {
291                        var devices_file = File.new_for_uri (_view.side_page.current_devices_file).get_path ();
292                        filtered_command = filtered_command.replace ("%devices_file", devices_file);
293                }
294                if (_current_programmer.has_devices_folder)
295                {
296                        var devices_folder = File.new_for_uri (_view.side_page.current_devices_folder).get_path ();
297                        filtered_command = filtered_command.replace ("%devices_folder", devices_folder);
298                }
299                if (_current_programmer.has_clock)
300                        filtered_command = filtered_command.replace ("%clock", _view.side_page.current_clock);
301               
302                filtered_command = filtered_command.replace ("%device", _view.side_page.current_device);
303               
304                if (_current_programmer.can_write_fuses)
305                        filtered_command = filtered_command.replace ("%fuses", _view.side_page.current_fuses);
306               
307                if (_read_hexfile == null)
308                {
309                        if (_view.pages_panel.current_page != null && _view.pages_panel.current_page.tab_title.has_suffix (".hex"))
310                        {
311                                var hexfile = File.new_for_uri (_view.pages_panel.current_page.title).get_path ();
312                                filtered_command = filtered_command.replace ("%hexfile", hexfile);
313                        }
314                }
315                else
316                {
317                        var hexfile = File.new_for_uri (_read_hexfile).get_path ();
318                        filtered_command = filtered_command.replace ("%hexfile", hexfile);
319                }
320               
321                if (_command.run (filtered_command))
322                {
323                        set_parameters_sensitive (false);
324                        disable_actions ();
325                        _view.side_page.stop_sensitive = true;
326                }
327               
328                _view.show_log_page ();
329        }
330       
331        private void hide_parameters ()
332        {
333                _view.side_page.serial_port_visible = false;
334                _view.side_page.baud_rate_visible = false;
335                _view.side_page.devices_file_visible = false;
336                _view.side_page.devices_folder_visible = false;
337                _view.side_page.clock_visible = false;
338                _view.side_page.fuses_visible = false;
339        }
340       
341        private void set_parameters_sensitive (bool sensitive)
342        {
343                _view.side_page.programmer_sensitive = sensitive;
344                _view.side_page.serial_port_sensitive = sensitive;
345                _view.side_page.baud_rate_sensitive = sensitive;
346                _view.side_page.devices_file_sensitive = sensitive;
347                _view.side_page.devices_folder_sensitive = sensitive;
348                _view.side_page.clock_sensitive = sensitive;
349                _view.side_page.device_sensitive = sensitive;
350                _view.side_page.fuses_sensitive = sensitive;
351        }
352       
353        private void enable_actions ()
354        {
355                var valid_page = _view.pages_panel.current_page != null && _view.pages_panel.current_page.tab_title.has_suffix (".hex");
356                var valid_serial_port =  !_current_programmer.has_serial_port || _view.side_page.current_serial_port != null;
357                var valid_baud_rate = !_current_programmer.has_baud_rate || _view.side_page.current_baud_rate != null;
358                var valid_devices_file = !_current_programmer.has_devices_file || _view.side_page.current_devices_file != null;
359                var valid_devices_folder =  !_current_programmer.has_devices_folder || _view.side_page.current_devices_folder != null;
360                var valid_clock =  !_current_programmer.has_clock || _view.side_page.current_clock != "";
361                var valid_device = _view.side_page.current_device != null;
362                var valid_fuses = !_current_programmer.can_write_fuses || _view.side_page.current_fuses != "";
363               
364                if (!valid_serial_port ||
365                    !valid_baud_rate ||
366                    !valid_devices_file ||
367                    !valid_devices_folder ||
368                    !valid_clock ||
369                    !valid_device ||
370                    !valid_fuses)
371                    return;
372               
373                _view.side_page.write_flash_sensitive = valid_page && _current_programmer.can_write_flash;
374                _view.side_page.read_flash_sensitive = _current_programmer.can_read_flash;
375                _view.side_page.verify_flash_sensitive = valid_page && _current_programmer.can_verify_flash;
376                _view.side_page.erase_flash_sensitive = _current_programmer.can_erase_flash;
377                _view.side_page.write_fuses_sensitive = _current_programmer.can_write_fuses;
378                _view.side_page.read_fuses_sensitive = _current_programmer.can_read_fuses;
379                _view.side_page.get_version_sensitive = _current_programmer.can_get_version;
380                _view.side_page.stop_sensitive = _command.is_running;
381        }
382       
383        private void disable_actions ()
384        {
385                _view.side_page.write_flash_sensitive = false;
386                _view.side_page.read_flash_sensitive = false;
387                _view.side_page.verify_flash_sensitive = false;
388                _view.side_page.erase_flash_sensitive = false;
389                _view.side_page.write_fuses_sensitive = false;
390                _view.side_page.read_fuses_sensitive = false;
391                _view.side_page.get_version_sensitive = false;
392                _view.side_page.stop_sensitive = false;
393        }
394}
Note: See TracBrowser for help on using the repository browser.