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_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);
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();
249 EMU_TEMPLATE *get_emu() { return p_emu; }
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);
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);
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);
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);
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);
293 void do_close_hard_disk();
294 void do_open_hard_disk(int, QString);
296 void do_play_tape(int drv, QString name);
297 void do_rec_tape(int drv, QString name);
298 void do_close_tape();
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);
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);
314 void do_close_cart(int drv);
315 void do_open_cart(int drv, QString path);
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);
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);
325 void do_load_binary(int drv, QString path);
326 void do_save_binary(int drv, QString path);
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);
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);
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);
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);
354 int sig_ui_update_config();
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);
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);
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);
386 int sig_set_b77_num(int, int);
388 // From emu_thread_slots.cpp .
389 int sig_set_draw_fps(double);
390 int sig_draw_one_turn(bool);
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);
396 int sig_ui_update_compact_disc_list(int, QStringList);
397 int sig_ui_close_compact_disc(int);
399 int sig_ui_update_cart_list(int, QStringList);
400 int sig_ui_close_cart(int);
402 int sig_ui_update_binary_list(int, QStringList);
403 int sig_ui_close_binary(int);
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);