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);
235 EmuThreadClassBase(Ui_MainWindowBase *rootWindow, std::shared_ptr<USING_FLAGS> p, QObject *parent = 0);
236 ~EmuThreadClassBase();
237 virtual void run() {};
238 void set_tape_play(bool);
239 void resize_screen(int sw, int sh, int stw, int sth);
240 void sample_access_drv(void);
241 bool now_debugging();
243 EMU_TEMPLATE *get_emu() { return p_emu; }
245 int get_d88_file_cur_bank(int drive);
246 int get_d88_file_bank_num(int drive);
247 QString get_d88_file_disk_name(int drive, int banknum);
248 bool is_floppy_disk_protected(int drive);
249 void set_floppy_disk_protected(int drive, bool flag);
250 QString get_d88_file_path(int drive);
257 void do_notify_power_off(void);
258 void do_special_reset(void);
259 void do_load_state();
260 void do_save_state();
261 void do_update_config();
262 void do_start_record_sound();
263 void do_stop_record_sound();
264 void do_start_record_video();
265 void do_stop_record_video();
266 void do_update_volume_level(int num, int level);
267 void do_update_volume_balance(int num, int level);
269 void button_pressed_mouse(Qt::MouseButton);
270 void button_released_mouse(Qt::MouseButton);
271 void do_key_down(uint32_t vk, uint32_t mod, bool repeat);
272 void do_key_up(uint32_t vk, uint32_t mod);
273 void print_framerate(int frames);
274 void set_emu_thread_to_fixed_cpu(int cpunum);
277 void do_start_emu_thread();
278 void do_set_emu_thread_to_fixed_cpu_from_action();
279 // From emu_thread_slots.cpp .
280 void do_set_display_size(int w, int h, int ww, int wh);
281 void moved_mouse(double x, double y, double globalx, double globaly);
283 void do_write_protect_floppy_disk(int drv, bool flag);
284 void do_close_floppy_disk(int);
285 void do_open_floppy_disk(int, QString, int);
287 void do_close_hard_disk(int);
288 void do_open_hard_disk(int, QString);
290 void do_play_tape(int drv, QString name);
291 void do_rec_tape(int drv, QString name);
292 void do_close_tape(int drv);
293 void do_cmt_push_play(int drv);
294 void do_cmt_push_stop(int drv);
295 void do_cmt_push_fast_forward(int drv);
296 void do_cmt_push_fast_rewind(int drv);
297 void do_cmt_push_apss_forward(int drv);
298 void do_cmt_push_apss_rewind(int drv);
300 void do_write_protect_quickdisk(int drv, bool flag);
301 void do_close_quickdisk(int drv);
302 void do_open_quickdisk(int drv, QString path);
304 void do_close_cart(int drv);
305 void do_open_cart(int drv, QString path);
307 void do_close_laser_disc(int drv);
308 void do_open_laser_disc(int drv, QString path);
310 void do_eject_cdrom(int drv);
311 void do_open_cdrom(int drv, QString path);
313 void do_load_binary(int drv, QString path);
314 void do_save_binary(int drv, QString path);
316 void do_write_protect_bubble_casette(int drv, bool flag);
317 void do_close_bubble_casette(int);
318 void do_open_bubble_casette(int, QString, int);
320 void do_start_auto_key(QString text);
321 void do_stop_auto_key(void);
322 void set_romakana(bool flag);
323 void do_close_debugger(void);
326 void do_select_floppy_disk_d88(int drive, int slot);
327 // Signal from EMU:: -> OSD:: -> EMU_THREAD (-> GUI (menu_foo[bar]))
328 void done_open_tape(int drive, QString path);
329 void done_close_tape(int drive);
331 void done_open_quick_disk(int drive, QString path);
332 void done_close_quick_disk(int drive);
334 void done_open_compact_disc(int drive, QString path);
335 void done_close_compact_disc(int drive);
337 void done_open_hard_disk(int drive, QString path);
338 void done_close_hard_disk(int drive);
340 void done_open_cart(int drive, QString path);
341 void done_close_cart(int drive);
343 void done_open_laser_disc(int drive, QString path);
344 void done_close_laser_disc(int drive);
346 void done_open_binary(int drive, QString path);
347 void done_close_binary(int drive);
349 void done_open_bubble(int drive, QString path);
350 void done_close_bubble(int drive);
351 void done_select_b77(int drive, int slot);
354 int message_changed(QString);
355 int window_title_changed(QString);
356 int sig_draw_thread(bool);
357 int quit_draw_thread(void);
358 int sig_screen_aspect(int);
359 int sig_screen_size(int, int);
360 int sig_finished(void);
361 int sig_mouse_enable(bool);
362 int sig_update_recent_hard_disk(int);
364 int sig_change_osd(int, int, QString);
365 int sig_change_access_lamp(int, int, QString);
366 int sig_change_virtual_media(int, int, QString);
368 int sig_update_recent_bubble(int);
369 int sig_change_osd_bubble(int, QString);
370 int sig_set_grid_vertical(int, bool);
371 int sig_set_grid_horizonal(int, bool);
372 int sig_send_data_led(quint32);
373 int sig_resize_screen(int, int);
374 int sig_resize_uibar(int, int);
375 int sig_resize_osd(int);
376 int sig_is_enable_mouse(bool);
377 int sig_debugger_input(QString);
378 int sig_quit_debugger();
379 int sig_romakana_mode(bool);
380 int sig_set_access_lamp(int, bool);
382 int sig_open_binary_load(int, QString);
383 int sig_open_binary_save(int, QString);
384 int sig_open_cart(int, QString);
385 int sig_open_cmt_load(int, QString);
386 int sig_open_cmt_write(int, QString);
387 int sig_open_fd(int, QString);
388 int sig_open_d88_fd(int, QString, int);
389 int sig_open_hdd(int, QString);
391 int sig_open_quick_disk(int, QString);
392 int sig_open_bubble(int, QString);
393 int sig_open_b77_bubble(int, QString, int);
394 int sig_open_cdrom(int, QString);
395 int sig_open_laser_disc(int, QString);
397 int sig_set_b77_num(int, int);
399 // From emu_thread_slots.cpp .
400 int sig_set_draw_fps(double);
401 int sig_draw_one_turn(bool);
403 // Signal from (EMU:: -> OSD:: ->) EMU_THREAD -> GUI(menu_foo[bar])
404 int sig_ui_update_floppy_list(int, QStringList);
405 int sig_ui_close_floppy_disk(int);
406 int sig_ui_clear_d88(int);
407 int sig_ui_update_d88(int, int, QString);
408 int sig_ui_select_d88(int, int);
410 int sig_ui_update_tape_list(int, QStringList);
411 int sig_ui_close_tape(int);
413 int sig_ui_update_quick_disk_list(int, QStringList);
414 int sig_ui_close_quick_disk(int);
416 int sig_ui_update_compact_disc_list(int, QStringList);
417 int sig_ui_close_compact_disc(int);
419 int sig_ui_update_hard_disk_list(int, QStringList);
420 int sig_ui_close_hard_disk(int);
422 int sig_ui_update_cart_list(int, QStringList);
423 int sig_ui_close_cart(int);
425 int sig_ui_update_laser_disc_list(int, QStringList);
426 int sig_ui_close_laser_disc(int);
428 int sig_ui_update_binary_list(int, QStringList);
429 int sig_ui_close_binary(int);
431 int sig_ui_update_bubble_casette_list(int, QStringList);
432 int sig_ui_close_bubble_casette(int);
433 int sig_ui_clear_b77(int);
434 int sig_ui_update_b77(int, int, QString);
435 int sig_ui_select_b77(int, int);