2 Skelton for retropc emulator
3 Author : Takeda.Toshiya
4 Port to Qt : K.Ohta <whatisthis.sowhat _at_ gmail.com>
7 History : 2015.11.10 Split from qt_main.h
8 [ win32 main ] -> [ Qt main ] -> [Emu Thread]
10 #ifndef _CSP_QT_EMU_THREAD_TMPL_H
11 #define _CSP_QT_EMU_THREAD_TMPL_H
16 #include <QStringList>
17 #include <QElapsedTimer>
18 #if QT_VERSION >= 0x051400
19 #include <QRecursiveMutex>
24 #include <QMutexLocker>
28 #include "commonclasses.h"
30 #include "emu_template.h"
32 //#include "menuclasses.h"
34 #include "mainwidget_base.h"
35 #include "commonclasses.h"
42 #define MAX_COMMAND_LEN 64
51 class Ui_MainWindowBase;
53 class VirtualFilesList;
54 class VirtualBanksList;
57 //class META_MainWindow;
61 KEY_QUEUE_DOWN = 0x10000000,
62 KEY_QUEUE_UP = 0x20000000,
72 class DLL_PREFIX EmuThreadClassBase : public QThread {
78 bool poweroff_notified;
92 QOpenGLContext *glContext;
93 bool is_shared_glcontext;
97 std::shared_ptr<USING_FLAGS> using_flags;
100 QWaitCondition *drawCond;
101 #if QT_VERSION >= 0x051400
102 QRecursiveMutex keyMutex;
103 QRecursiveMutex mouseMutex;
108 //class META_MainWindow *MainWindow;
109 Ui_MainWindowBase *MainWindow;
110 QElapsedTimer tick_timer;
115 bool bSpecialResetReq;
118 bool bUpdateConfigReq;
119 bool bStartRecordSoundReq;
120 bool bStopRecordSoundReq;
121 bool bStartRecordMovieReq;
125 #if QT_VERSION >= 0x051400
126 QRecursiveMutex uiMutex;
130 char dbg_prev_command[MAX_COMMAND_LEN];
133 bool doing_debug_command;
134 bool bUpdateVolumeReq[32];
135 int volume_balance[32];
141 qint64 update_fps_time;
152 QString cdrom_text[4];
153 QString laserdisc_text[4];
154 QString bubble_text[16];
156 QString clipBoardText;
157 QStringList vMovieQueue;
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);
164 void button_pressed_mouse_sub(Qt::MouseButton button);
165 void button_released_mouse_sub(Qt::MouseButton button);
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);
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);
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() { }
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);
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);
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) {
204 s->code = (uint32_t)key_fifo->read();
205 s->mod = (uint32_t)key_fifo->read();
206 if(key_fifo->read() != 0) {
211 } else if(_type == KEY_QUEUE_UP) {
213 s->code = (uint32_t)key_fifo->read();
214 s->mod = (uint32_t)key_fifo->read();
215 volatile uint32_t dummy = key_fifo->read();
224 bool is_empty_key() {
225 QMutexLocker n(&keyMutex);
226 bool f = key_fifo->empty();
229 void clear_key_queue() {
230 QMutexLocker n(&keyMutex);
234 void sub_close_floppy_disk_internal(int drv);
236 void sub_close_tape_internal(int drv);
239 EmuThreadClassBase(Ui_MainWindowBase *rootWindow, std::shared_ptr<USING_FLAGS> p, QObject *parent = 0);
240 ~EmuThreadClassBase();
241 virtual void run() {};
242 void set_tape_play(bool);
243 void resize_screen(int sw, int sh, int stw, int sth);
244 void sample_access_drv(void);
245 bool now_debugging();
247 EMU_TEMPLATE *get_emu() { return p_emu; }
249 int get_d88_file_cur_bank(int drive);
250 int get_d88_file_bank_num(int drive);
251 QString get_d88_file_disk_name(int drive, int banknum);
252 bool is_floppy_disk_protected(int drive);
253 void set_floppy_disk_protected(int drive, bool flag);
254 QString get_d88_file_path(int drive);
260 void do_notify_power_off(void);
261 void do_special_reset(void);
262 void do_load_state();
263 void do_save_state();
264 void do_update_config();
265 void do_start_record_sound();
266 void do_stop_record_sound();
267 void do_start_record_video();
268 void do_stop_record_video();
269 void do_update_volume_level(int num, int level);
270 void do_update_volume_balance(int num, int level);
272 void button_pressed_mouse(Qt::MouseButton);
273 void button_released_mouse(Qt::MouseButton);
274 void do_key_down(uint32_t vk, uint32_t mod, bool repeat);
275 void do_key_up(uint32_t vk, uint32_t mod);
276 void print_framerate(int frames);
277 void set_emu_thread_to_fixed_cpu(int cpunum);
280 void do_start_emu_thread();
281 void do_set_emu_thread_to_fixed_cpu_from_action();
282 // From emu_thread_slots.cpp .
283 void do_set_display_size(int w, int h, int ww, int wh);
284 void moved_mouse(double x, double y, double globalx, double globaly);
286 void do_write_protect_floppy_disk(int drv, bool flag);
287 void do_close_floppy_disk();
288 void do_open_floppy_disk(int, QString, int);
290 void do_close_hard_disk(int);
291 void do_open_hard_disk(int, QString);
293 void do_play_tape(int drv, QString name);
294 void do_rec_tape(int drv, QString name);
295 void do_close_tape();
297 void do_cmt_push_play();
298 void do_cmt_push_stop();
299 void do_cmt_push_fast_forward();
300 void do_cmt_push_fast_rewind();
301 void do_cmt_push_apss_forward();
302 void do_cmt_push_apss_rewind();
303 void do_cmt_direct_load_from_mzt(bool stat);
304 void do_cmt_wave_shaper(bool stat);
306 void do_write_protect_quickdisk(int drv, bool flag);
307 void do_close_quickdisk(int drv);
308 void do_open_quickdisk(int drv, QString path);
310 void do_close_cart(int drv);
311 void do_open_cart(int drv, QString path);
313 void do_close_laser_disc(int drv);
314 void do_open_laser_disc(int drv, QString path);
316 void do_eject_cdrom(int drv);
317 void do_open_cdrom(int drv, QString path);
319 void do_load_binary(int drv, QString path);
320 void do_save_binary(int drv, QString path);
322 void do_write_protect_bubble_casette(int drv, bool flag);
323 void do_close_bubble_casette(int);
324 void do_open_bubble_casette(int, QString, int);
326 void do_start_auto_key(QString text);
327 void do_stop_auto_key(void);
328 void set_romakana(bool flag);
329 void do_close_debugger(void);
332 void do_select_floppy_disk_d88(int drive, int slot);
333 // Signal from EMU:: -> OSD:: -> EMU_THREAD (-> GUI (menu_foo[bar]))
334 void done_open_tape(int drive, QString path);
335 void done_close_tape(int drive);
337 void done_open_quick_disk(int drive, QString path);
338 void done_close_quick_disk(int drive);
340 void done_open_compact_disc(int drive, QString path);
341 void done_close_compact_disc(int drive);
343 void done_open_hard_disk(int drive, QString path);
344 void done_close_hard_disk(int drive);
346 void done_open_cart(int drive, QString path);
347 void done_close_cart(int drive);
349 void done_open_laser_disc(int drive, QString path);
350 void done_close_laser_disc(int drive);
352 void done_open_binary(int drive, QString path);
353 void done_close_binary(int drive);
355 void done_open_bubble(int drive, QString path);
356 void done_close_bubble(int drive);
357 void done_select_b77(int drive, int slot);
360 int message_changed(QString);
361 int window_title_changed(QString);
362 int sig_draw_thread(bool);
363 int quit_draw_thread(void);
364 int sig_screen_aspect(int);
365 int sig_screen_size(int, int);
366 int sig_finished(void);
367 int sig_mouse_enable(bool);
368 int sig_update_recent_hard_disk(int);
370 int sig_change_osd(int, int, QString);
371 int sig_change_access_lamp(int, int, QString);
372 int sig_change_virtual_media(int, int, QString);
374 int sig_update_recent_bubble(int);
375 int sig_change_osd_bubble(int, QString);
376 int sig_set_grid_vertical(int, bool);
377 int sig_set_grid_horizonal(int, bool);
378 int sig_send_data_led(quint32);
379 int sig_resize_screen(int, int);
380 int sig_resize_uibar(int, int);
381 int sig_resize_osd(int);
382 int sig_is_enable_mouse(bool);
383 int sig_debugger_input(QString);
384 int sig_quit_debugger();
385 int sig_romakana_mode(bool);
386 int sig_set_access_lamp(int, bool);
388 int sig_open_binary_load(int, QString);
389 int sig_open_binary_save(int, QString);
390 int sig_open_cart(int, QString);
391 int sig_open_cmt_load(int, QString);
392 int sig_open_cmt_write(int, QString);
393 int sig_open_fd(int, QString);
394 int sig_open_d88_fd(int, QString, int);
395 int sig_open_hdd(int, QString);
397 int sig_open_quick_disk(int, QString);
398 int sig_open_bubble(int, QString);
399 int sig_open_b77_bubble(int, QString, int);
400 int sig_open_cdrom(int, QString);
401 int sig_open_laser_disc(int, QString);
403 int sig_set_b77_num(int, int);
405 // From emu_thread_slots.cpp .
406 int sig_set_draw_fps(double);
407 int sig_draw_one_turn(bool);
409 // Signal from (EMU:: -> OSD:: ->) EMU_THREAD -> GUI(menu_foo[bar])
410 int sig_ui_update_floppy_list(int, QStringList);
411 int sig_ui_close_floppy_disk(int);
412 int sig_ui_clear_d88(int);
413 int sig_ui_update_d88(int, int, QString);
414 int sig_ui_select_d88(int, int);
416 int sig_ui_update_tape_list(int, QStringList);
417 int sig_ui_close_tape(int);
419 int sig_ui_update_quick_disk_list(int, QStringList);
420 int sig_ui_close_quick_disk(int);
422 int sig_ui_update_compact_disc_list(int, QStringList);
423 int sig_ui_close_compact_disc(int);
425 int sig_ui_update_hard_disk_list(int, QStringList);
426 int sig_ui_close_hard_disk(int);
428 int sig_ui_update_cart_list(int, QStringList);
429 int sig_ui_close_cart(int);
431 int sig_ui_update_laser_disc_list(int, QStringList);
432 int sig_ui_close_laser_disc(int);
434 int sig_ui_update_binary_list(int, QStringList);
435 int sig_ui_close_binary(int);
437 int sig_ui_update_bubble_casette_list(int, QStringList);
438 int sig_ui_close_bubble_casette(int);
439 int sig_ui_clear_b77(int);
440 int sig_ui_update_b77(int, int, QString);
441 int sig_ui_select_b77(int, int);