1 #pragma once
2 
3 #include <QImage>
4 #include <QVector>
5 #include <QString>
6 #include <QByteArray>
7 
8 #include <thread>
9 #include <atomic>
10 #include <stdint.h>
11 
12 #include "../../src/emulator.h"
13 
14 class EmuWrapper{
15 private:
16    EmuWrapper(const EmuWrapper&) = delete;//non construction copyable
17    EmuWrapper& operator=(const EmuWrapper&) = delete;//non copyable
18 
19    bool              emuInited;
20    std::thread       emuThread;
21    std::atomic<bool> emuThreadJoin;
22    std::atomic<bool> emuRunning;
23    std::atomic<bool> emuPaused;
24    std::atomic<bool> emuNewFrameReady;
25    QString           emuOsName;
26    QString           emuRamFilePath;
27    QString           emuSdCardFilePath;
28    QString           emuSaveStatePath;
29    input_t           emuInput;
30 
31    void emuThreadRun();
32    void writeOutSaves();
33 
34 public:
35    enum{
36       BUTTON_UP = 0,
37       BUTTON_DOWN,
38       BUTTON_LEFT,
39       BUTTON_RIGHT,
40       BUTTON_CENTER,
41       BUTTON_CALENDAR,
42       BUTTON_ADDRESS,
43       BUTTON_TODO,
44       BUTTON_NOTES,
45       BUTTON_VOICE_MEMO,
46       BUTTON_POWER,
47       BUTTON_TOTAL_COUNT
48    };
49 
50    EmuWrapper();
51    ~EmuWrapper();
52 
53    uint32_t init(const QString& assetPath, const QString& osVersion, bool syncRtc = false, bool allowInvalidBehavior = false, bool fastBoot = false);
54    void exit();
55    void pause();
56    void resume();
57    void reset(bool hard);
58    void setCpuSpeed(double speed);
59    uint32_t bootFromFile(const QString& mainPath);
60    uint32_t installApplication(const QString& path);
getStatePath()61    const QString& getStatePath() const{return emuSaveStatePath;}//needed for looking up state pictures in the GUI
62    uint32_t saveState(const QString& name);
63    uint32_t loadState(const QString& name);
isInited()64    bool isInited() const{return emuInited;}
isRunning()65    bool isRunning() const{return emuRunning;}
isPaused()66    bool isPaused() const{return emuPaused;}
isTungstenT3()67    bool isTungstenT3() const{return palmEmulatingTungstenT3;}
68    void setPenValue(float x, float y, bool touched);
69    void setKeyValue(uint8_t key, bool pressed);
70 
screenWidth()71    uint16_t screenWidth() const{return palmFramebufferWidth;}
screenHeight()72    uint16_t screenHeight() const{return palmFramebufferHeight;}
newFrameReady()73    bool newFrameReady() const{return emuNewFrameReady;}
frameHandled()74    void frameHandled(){emuNewFrameReady = false;}
75 
76    //calling these while newFrameReady() == false is undefined behavior, the other thread may be writing to them
getFramebufferImage()77    const QImage getFramebufferImage(){return QImage((uchar*)palmFramebuffer, palmFramebufferWidth, palmFramebufferHeight, palmFramebufferWidth * sizeof(uint16_t), QImage::Format_RGB16);}
getAudioSamples()78    const int16_t* getAudioSamples() const{return palmAudio;}
getPowerButtonLed()79    bool getPowerButtonLed() const{return palmMisc.greenLed;}
80 
81    QVector<QString>& debugLogEntrys();
82    QVector<uint64_t>& debugDuplicateLogEntryCount();
83    uint64_t& debugDeletedLogEntryCount();
84    QString debugGetCpuRegisterString();
85    uint64_t debugGetEmulatorMemory(uint32_t address, uint8_t size);
86    QString debugDisassemble(uint32_t address, uint32_t opcodes);
87 };
88