source: libi4uccore/programmerslogic.vala @ dfe49c76fe79c726339d9cad8d91dc6242eb2959

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

Another massive code rework

+ Models, presenters and view interfaces were moved from libi4uc to libi4uccore.
+ Models, presenters and view interfaces are now in I4uc.Core namespace.
+ Views were moved from libi4uc to gtkfrontend.
+ Views are now in I4uc.GtkFrontend? namespace.
+ src/main.vala was moved to gtksourceview.
+ All the 'i4uc' prefix in source files were removed.
+ Presenters were renamed to Logic (It's shorter).
+ View interfaces were renamed to just View.
+ Side pages are now just pages.

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