
#ifndef __STLINK_GUI_H__
#define __STLINK_GUI_H__

#include <glib-object.h>

#define STLINK_TYPE_GUI             (stlink_gui_get_type ())
#define STLINK_GUI(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), STLINK_TYPE_GUI, STlinkGUI))
#define STLINK_IS_GUI(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STLINK_TYPE_GUI))
#define STLINK_GUI_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), STLINK_TYPE_GUI, STlinkGUIClass))
#define STLINK_IS_GUI_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), STLINK_TYPE_GUI))
#define STLINK_GUI_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), STLINK_TYPE_GUI, STlinkGUIlass))
#define STLINK_GUI_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), STLINK_TYPE_GUI, STlinkGUIPrivate))

typedef struct _STlinkGUI        STlinkGUI;
typedef struct _STlinkGUIClass   STlinkGUIClass;
typedef struct _STlinkGUIPrivate STlinkGUIPrivate;

enum stlink_gui_pages_t {
    PAGE_DEVMEM,
    PAGE_FILEMEM
};

enum stlink_gui_dnd_targets_t {
    TARGET_FILENAME,
    TARGET_ROOTWIN
};

struct progress_t {
    GtkProgressBar *bar;
    guint           timer;
    gboolean        activity_mode;
    gdouble         fraction;
};

struct mem_t {
    guchar *memory;
    gsize   size;
    guint32 base;
};

struct _STlinkGUI
{
    GObject parent_instance;

    /*< private >*/
    GtkWindow      *window;
    GtkTreeView    *devmem_treeview;
    GtkTreeView    *filemem_treeview;
    GtkSpinner     *spinner;
    GtkStatusbar   *statusbar;
    GtkInfoBar     *infobar;
    GtkLabel       *infolabel;
    GtkNotebook    *notebook;
    GtkFrame       *device_frame;
    GtkLabel       *chip_id_label;
    GtkLabel       *core_id_label;
    GtkLabel       *flash_size_label;
    GtkLabel       *ram_size_label;
    GtkBox         *devmem_box;
    GtkEntry       *devmem_jmp_entry;
    GtkBox         *filemem_box;
    GtkEntry       *filemem_jmp_entry;
    GtkToolButton  *connect_button;
    GtkToolButton  *disconnect_button;
    GtkToolButton  *flash_button;
    GtkToolButton  *export_button;
    GtkToolButton  *open_button;

    /* flash dialog */
    GtkDialog  *flash_dialog;
    GtkButton  *flash_dialog_ok;
    GtkButton  *flash_dialog_cancel;
    GtkEntry   *flash_dialog_entry;

    struct progress_t  progress;
    struct mem_t       flash_mem;
    struct mem_t       file_mem;

    gchar    *error_message;
    gchar    *filename;
    stlink_t *sl;
};

struct _STlinkGUIClass
{
    GObjectClass parent_class;

    /* class members */
};

GType stlink_gui_get_type (void);
int export_to_file(const char*filename, const struct mem_t flash_mem);

#endif
