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