OSDN Git Service

[UI][Qt][EMU]Menu: Make around quick-disk new signal framework.
[csp-qt/common_source_project-fm7.git] / source / src / qt / gui / emu_thread_tmpl.h
1 /*
2         Skelton for retropc emulator
3         Author : Takeda.Toshiya
4         Port to Qt : K.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2006.08.18 -
6         License : GPLv2
7         History : 2015.11.10 Split from qt_main.h
8         [ win32 main ] -> [ Qt main ] -> [Emu Thread]
9 */
10 #ifndef _CSP_QT_EMU_THREAD_TMPL_H
11 #define _CSP_QT_EMU_THREAD_TMPL_H
12
13 #include <QThread>
14 #include <QQueue>
15 #include <QString>
16 #include <QStringList>
17 #include <QElapsedTimer>
18 #if QT_VERSION >= 0x051400
19         #include <QRecursiveMutex>
20 #else
21         #include <QMutex>
22 #endif
23
24 #include <QMutexLocker>
25
26 #include "fifo.h"
27 #include "common.h"
28 #include "commonclasses.h"
29 #include "fileio.h"
30 #include "emu_template.h"
31
32 //#include "menuclasses.h"
33
34 #include "mainwidget_base.h"
35 #include "commonclasses.h"
36 #include "config.h"
37 #include <memory>
38
39 #ifndef MAX_HISTORY
40 #define MAX_HISTORY 8
41 #endif
42 #define MAX_COMMAND_LEN 64
43
44 class QWaitCondition;
45 class QOpenGLContext;
46
47 class EMU_TEMPLATE;
48 class OSD_BASE;
49 class USING_FLAGS;
50
51 class Ui_MainWindowBase;
52
53 class VirtualFilesList;
54 class VirtualBanksList;
55 class Menu_MetaClass;
56
57 //class META_MainWindow;
58
59 QT_BEGIN_NAMESPACE
60 enum {
61         KEY_QUEUE_DOWN = 0x10000000,
62         KEY_QUEUE_UP   = 0x20000000,
63 };
64 typedef struct {
65         uint32_t type;
66         uint32_t code;
67         uint32_t mod;
68         bool repeat;
69 } key_queue_t;
70
71
72 class DLL_PREFIX EmuThreadClassBase : public QThread {
73         Q_OBJECT
74 protected:
75         EMU_TEMPLATE *p_emu;
76         OSD_BASE *p_osd;
77
78         bool poweroff_notified;
79
80         bool now_skip;
81         bool calc_message;
82         bool tape_play_flag;
83         bool tape_rec_flag;
84         int tape_pos;
85         bool mouse_flag;
86         int mouse_x;
87         int mouse_y;
88         Qt::HANDLE thread_id;
89         int queue_fixed_cpu;
90
91     FIFO *key_fifo;
92         QOpenGLContext *glContext;
93         bool is_shared_glcontext;
94
95         uint32_t key_mod;
96
97         std::shared_ptr<USING_FLAGS> using_flags;
98         config_t *p_config;
99
100         QWaitCondition *drawCond;
101 #if QT_VERSION >= 0x051400
102         QRecursiveMutex keyMutex;
103         QRecursiveMutex mouseMutex;
104 #else
105         QMutex keyMutex;
106         QMutex mouseMutex;
107 #endif
108         //class META_MainWindow *MainWindow;
109         Ui_MainWindowBase *MainWindow;
110         QElapsedTimer tick_timer;
111
112         bool bBlockTask;
113         bool bRunThread;
114         bool bResetReq;
115         bool bSpecialResetReq;
116         bool bLoadStateReq;
117         bool bSaveStateReq;
118         bool bUpdateConfigReq;
119         bool bStartRecordSoundReq;
120         bool bStopRecordSoundReq;
121         bool bStartRecordMovieReq;
122         QString sStateFile;
123         QString lStateFile;
124
125 #if QT_VERSION >= 0x051400
126         QRecursiveMutex uiMutex;
127 #else
128         QMutex uiMutex;
129 #endif
130         char dbg_prev_command[MAX_COMMAND_LEN];
131
132 //      bool draw_timing;
133         bool doing_debug_command;
134         bool bUpdateVolumeReq[32];
135         int volume_balance[32];
136         int volume_avg[32];
137         int record_fps;
138         int  specialResetNum;
139
140         qint64 next_time;
141         qint64 update_fps_time;
142         bool prev_skip;
143         int total_frames;
144         int draw_frames;
145         int skip_frames;
146         QString qd_text[4];
147         QString fd_text[8];
148         QString fd_lamp[8];
149         QString hdd_text[8];
150         QString hdd_lamp[8];
151         QString cmt_text[4];
152         QString cdrom_text[4];
153         QString laserdisc_text[4];
154         QString bubble_text[16];
155
156         QString clipBoardText;
157         QStringList vMovieQueue;
158
159         // Standard 8 files.
160         void calc_volume_from_balance(int num, int balance);
161         void calc_volume_from_level(int num, int level);
162         int parse_command_queue(QStringList _l, int _begin);
163
164         void button_pressed_mouse_sub(Qt::MouseButton button);
165         void button_released_mouse_sub(Qt::MouseButton button);
166
167         void get_qd_string(void);
168         void get_fd_string(void);
169         void get_hdd_string(void);
170         void get_tape_string(void);
171         void get_cd_string(void);
172         void get_bubble_string(void);
173
174         const _TCHAR *get_emu_message(void);
175         double get_emu_frame_rate(void);
176         int get_message_count(void);
177         void dec_message_count(void);
178
179         virtual const _TCHAR *get_device_name(void);
180         virtual void resetEmu() { }
181         virtual void specialResetEmu(int num) { }
182         virtual void loadState() { }
183         virtual void saveState() { }
184
185         void enqueue_key_up(key_queue_t s) {
186                 QMutexLocker n(&keyMutex);
187                 key_fifo->write(KEY_QUEUE_UP);
188                 key_fifo->write(s.code);
189                 key_fifo->write(s.mod);
190                 key_fifo->write(s.repeat? 1 : 0);
191         };
192         void enqueue_key_down(key_queue_t s) {
193                 QMutexLocker n(&keyMutex);
194                 key_fifo->write(KEY_QUEUE_DOWN);
195                 key_fifo->write(s.code);
196                 key_fifo->write(s.mod);
197                 key_fifo->write(s.repeat? 1 : 0);
198         };
199         void dequeue_key(key_queue_t *s) {
200                 QMutexLocker n(&keyMutex);
201                 uint32_t _type = (uint32_t)key_fifo->read();
202                 if(_type ==     KEY_QUEUE_DOWN) {
203                         s->type = _type;
204                         s->code = (uint32_t)key_fifo->read();
205                         s->mod  = (uint32_t)key_fifo->read();
206                         if(key_fifo->read() != 0) {
207                                 s->repeat = true;
208                         } else {
209                                 s->repeat = false;
210                         }
211                 } else if(_type == KEY_QUEUE_UP) {
212                         s->type = _type;
213                         s->code = (uint32_t)key_fifo->read();
214                         s->mod  = (uint32_t)key_fifo->read();
215                         volatile uint32_t dummy = key_fifo->read();
216                         s->repeat = false;
217                 } else {
218                         s->type = 0;
219                         s->code = 0;
220                         s->mod = 0;
221                         s->repeat = false;
222                 }
223         };
224         bool is_empty_key() {
225                 QMutexLocker n(&keyMutex);
226                 bool f = key_fifo->empty();
227                 return f;
228         };
229         void clear_key_queue() {
230                 QMutexLocker n(&keyMutex);
231                 key_fifo->clear();
232         };
233         // Thread HOOK.
234         void sub_close_compact_disc_internal(int drv);
235         void sub_close_floppy_disk_internal(int drv);
236         void sub_close_hard_disk_internal(int drv);
237         void sub_close_laser_disc_internal(int drv);
238         void sub_close_quick_disk_internal(int drv);
239         void sub_close_tape_internal(int drv);
240 public:
241         EmuThreadClassBase(Ui_MainWindowBase *rootWindow, std::shared_ptr<USING_FLAGS> p, QObject *parent = 0);
242         ~EmuThreadClassBase();
243         virtual void run() {};
244         void set_tape_play(bool);
245         void resize_screen(int sw, int sh, int stw, int sth);
246         void sample_access_drv(void);
247         bool now_debugging();
248
249         EMU_TEMPLATE *get_emu() { return p_emu; }
250
251         int get_d88_file_cur_bank(int drive);
252         int get_d88_file_bank_num(int drive);
253         QString get_d88_file_disk_name(int drive, int banknum);
254         bool is_floppy_disk_protected(int drive);
255         void set_floppy_disk_protected(int drive, bool flag);
256         QString get_d88_file_path(int drive);
257
258 public slots:
259         void doExit(void);
260
261         void do_reset(void);
262         void do_notify_power_off(void);
263         void do_special_reset(void);
264         void do_load_state();
265         void do_save_state();
266         void do_update_config();
267         void do_start_record_sound();
268         void do_stop_record_sound();
269         void do_start_record_video();
270         void do_stop_record_video();
271         void do_update_volume_level(int num, int level);
272         void do_update_volume_balance(int num, int level);
273
274         void button_pressed_mouse(Qt::MouseButton);
275         void button_released_mouse(Qt::MouseButton);
276         void do_key_down(uint32_t vk, uint32_t mod, bool repeat);
277         void do_key_up(uint32_t vk, uint32_t mod);
278         void print_framerate(int frames);
279         void set_emu_thread_to_fixed_cpu(int cpunum);
280         void do_block();
281         void do_unblock();
282         void do_start_emu_thread();
283         void do_set_emu_thread_to_fixed_cpu_from_action();
284         // From emu_thread_slots.cpp .
285         void do_set_display_size(int w, int h, int ww, int wh);
286         void moved_mouse(double x, double y, double globalx, double globaly);
287
288         void do_write_protect_floppy_disk(int drv, bool flag);
289         void do_close_floppy_disk();
290         void do_open_floppy_disk(int drive, QString fname, int slot);
291         void do_close_floppy_disk_ui(int drive);
292
293         void do_close_hard_disk();
294         void do_open_hard_disk(int, QString);
295
296         void do_play_tape(int drv, QString name);
297         void do_rec_tape(int drv, QString name);
298         void do_close_tape();
299
300         void do_cmt_push_play();
301         void do_cmt_push_stop();
302         void do_cmt_push_fast_forward();
303         void do_cmt_push_fast_rewind();
304         void do_cmt_push_apss_forward();
305         void do_cmt_push_apss_rewind();
306         void do_cmt_direct_load_from_mzt(bool stat);
307         void do_cmt_wave_shaper(bool stat);
308
309         void do_write_protect_quick_disk(int drv, bool flag);
310         void do_close_quick_disk();
311         void do_close_quick_disk_ui(int drv);
312         void do_open_quick_disk(int drv, QString path);
313
314         void do_close_cart(int drv);
315         void do_open_cart(int drv, QString path);
316
317         void do_open_laser_disc(int drv, QString path);
318         void do_close_laser_disc();
319         void do_close_laser_disc_ui(int drive);
320
321         void do_eject_compact_disc_ui(int drv);
322         void do_eject_compact_disc();
323         void do_open_compact_disc(int drv, QString path);
324
325         void do_load_binary(int drv, QString path);
326         void do_save_binary(int drv, QString path);
327
328         void do_write_protect_bubble_casette(int drv, bool flag);
329         void do_close_bubble_casette(int);
330         void do_open_bubble_casette(int, QString, int);
331         void do_select_floppy_disk_d88(int drive, int slot);
332
333         void do_start_auto_key(QString text);
334         void do_stop_auto_key(void);
335         void set_romakana(bool flag);
336         void do_close_debugger(void);
337
338
339 signals:
340         int message_changed(QString);
341         int window_title_changed(QString);
342         int sig_draw_thread(bool);
343         int quit_draw_thread(void);
344         int sig_screen_aspect(int);
345         int sig_screen_size(int, int);
346         int sig_finished(void);
347         int sig_mouse_enable(bool);
348         int sig_update_recent_hard_disk(int);
349
350         int sig_change_osd(int, int, QString);
351         int sig_change_access_lamp(int, int, QString);
352         int sig_change_virtual_media(int, int, QString);
353
354         int sig_ui_update_config();
355
356         int sig_update_recent_bubble(int);
357         int sig_change_osd_bubble(int, QString);
358         int sig_set_grid_vertical(int, bool);
359         int sig_set_grid_horizonal(int, bool);
360         int sig_send_data_led(quint32);
361         int sig_resize_screen(int, int);
362         int sig_resize_uibar(int, int);
363         int sig_resize_osd(int);
364         int sig_is_enable_mouse(bool);
365         int sig_debugger_input(QString);
366         int sig_quit_debugger();
367         int sig_romakana_mode(bool);
368         int sig_set_access_lamp(int, bool);
369
370         // ToDo: Make deprecated.
371         int sig_open_binary_load(int, QString);
372         int sig_open_binary_save(int, QString);
373         int sig_open_cart(int, QString);
374         int sig_open_cmt_load(int, QString);
375         int sig_open_cmt_write(int, QString);
376         int sig_open_fd(int, QString);
377         int sig_open_d88_fd(int, QString, int);
378         int sig_open_hdd(int, QString);
379
380         int sig_open_quick_disk(int, QString);
381         int sig_open_bubble(int, QString);
382         int sig_open_b77_bubble(int, QString, int);
383         int sig_open_cdrom(int, QString);
384         int sig_open_laser_disc(int, QString);
385
386         int sig_set_b77_num(int, int);
387
388         // From emu_thread_slots.cpp .
389         int sig_set_draw_fps(double);
390         int sig_draw_one_turn(bool);
391
392 // Signal from (EMU:: -> OSD:: ->) EMU_THREAD -> GUI(menu_foo[bar])
393         int sig_ui_update_quick_disk_list(int, QStringList);
394         int sig_ui_close_quick_disk(int);
395
396         int sig_ui_update_compact_disc_list(int, QStringList);
397         int sig_ui_close_compact_disc(int);
398
399         int sig_ui_update_cart_list(int, QStringList);
400         int sig_ui_close_cart(int);
401
402         int sig_ui_update_binary_list(int, QStringList);
403         int sig_ui_close_binary(int);
404
405         int sig_ui_update_bubble_casette_list(int, QStringList);
406         int sig_ui_close_bubble_casette(int);
407         int sig_ui_clear_b77(int);
408         int sig_ui_update_b77(int, int, QString);
409         int sig_ui_select_b77(int, int);
410
411 };
412
413 QT_END_NAMESPACE
414
415 #endif