This commit is contained in:
dgis 2018-12-02 23:30:56 +00:00
parent c6d1648cd7
commit 0ad9b3b54c
3 changed files with 92 additions and 21 deletions

View file

@ -2154,8 +2154,12 @@ BOOL emu48Start()
hWindowDC = CreateCompatibleDC(NULL);
// initialization
LARGE_INTEGER lAppStart2; // high performance counter value at Appl. start
QueryPerformanceFrequency(&lFreq); // init high resolution counter
QueryPerformanceCounter(&lAppStart);
QueryPerformanceCounter(&lAppStart);
Sleep(1000);
QueryPerformanceCounter(&lAppStart2);
szCurrentKml[0] = 0; // no KML file selected
SetSpeed(bRealSpeed); // set speed

View file

@ -9,18 +9,28 @@
#include "pch.h"
JavaVM *java_machine;
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
java_machine = vm;
return JNI_VERSION_1_6;
}
extern void emu48Start();
extern AAssetManager * assetManager;
static jobject viewToUpdate = NULL;
jobject bitmapMainScreen;
AndroidBitmapInfo androidBitmapInfo;
extern void win32Init();
extern void draw();
extern void buttonDown(int x, int y);
extern void buttonUp(int x, int y);
extern void keyDown(int virtKey);
extern void keyUp(int virtKey);
JavaVM *java_machine;
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
java_machine = vm;
win32Init();
return JNI_VERSION_1_6;
}
// https://stackoverflow.com/questions/9630134/jni-how-to-callback-from-c-or-c-to-java
void mainViewUpdateCallback() {
if (viewToUpdate) {
@ -76,12 +86,6 @@ JNIEXPORT void JNICALL Java_com_regis_cosnier_emu48_NativeLib_resize(JNIEnv *env
}
extern void draw();
extern void buttonDown(int x, int y);
extern void buttonUp(int x, int y);
extern void keyDown(int virtKey);
extern void keyUp(int virtKey);
JNIEXPORT void JNICALL Java_com_regis_cosnier_emu48_NativeLib_draw(JNIEnv *env, jobject thisz) {
draw();
}

View file

@ -472,9 +472,11 @@ BOOL WINAPI CloseHandle(HANDLE hObject) {
void Sleep(int ms)
{
struct timespec timeOut,remains;
timeOut.tv_sec = 0;
timeOut.tv_nsec = ms * 1000000; /* 50 milliseconds */
time_t seconds = ms / 1000;
long milliseconds = ms - 1000 * seconds;
struct timespec timeOut, remains;
timeOut.tv_sec = seconds;
timeOut.tv_nsec = milliseconds * 1000000; /* 50 milliseconds */
nanosleep(&timeOut, &remains);
}
@ -495,7 +497,7 @@ BOOL QueryPerformanceCounter(PLARGE_INTEGER l)
long tv_nsec; /* nanoseconds */
} time;
int result = clock_gettime(CLOCK_MONOTONIC, &time);
l->QuadPart = 1e9 * time.tv_sec + time.tv_nsec;
l->QuadPart = (1e9 * time.tv_sec + time.tv_nsec) / 1000;
return TRUE;
}
void EnterCriticalSection(CRITICAL_SECTION *lock)
@ -970,16 +972,77 @@ HANDLE WINAPI GetClipboardData(UINT uFormat) {
return NULL;
}
struct timerEvent {
BOOL valid;
int timerId;
LPTIMECALLBACK fptc;
DWORD_PTR dwUser;
timer_t timer;
};
#define MAX_TIMER 10
struct timerEvent timerEvents[MAX_TIMER];
void win32Init() {
for (int i = 0; i < MAX_TIMER; ++i) {
timerEvents[i].valid = FALSE;
}
}
void timerCallback(int timerId) {
if(timerId >= 0 && timerId < MAX_TIMER && timerEvents[timerId].valid) {
timerEvents[timerId].fptc(timerId + 1, 0, timerEvents[timerId].dwUser, 0, 0);
}
}
MMRESULT timeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) {
//TODO
return 0; //No error
// Find a timer id
int timerId = -1;
for (int i = 0; i < MAX_TIMER; ++i) {
if(!timerEvents[i].valid) {
timerId = i;
break;
}
}
timerEvents[timerId].timerId = timerId;
timerEvents[timerId].fptc = fptc;
timerEvents[timerId].dwUser = dwUser;
struct sigevent sev;
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = timerCallback; //this function will be called when timer expires
sev.sigev_value.sival_int = timerEvents[timerId].timerId;//this argument will be passed to cbf
sev.sigev_notify_attributes = NULL;
timer_t * timer = &(timerEvents[timerId].timer);
//if (timer_create(CLOCK_REALTIME, &sev, &timer) == -1)
if (timer_create(CLOCK_REALTIME, &sev, timer) == -1)
return NULL;
long long freq_nanosecs = uDelay * 1000000;
struct itimerspec its;
its.it_value.tv_sec = freq_nanosecs / 1000000000;
its.it_value.tv_nsec = freq_nanosecs % 1000000000;
its.it_interval.tv_sec = its.it_value.tv_sec;
its.it_interval.tv_nsec = its.it_value.tv_nsec;
if (timer_settime(timerEvents[timerId].timer, 0, &its, NULL) == -1) {
timer_delete(timerEvents[timerId].timer);
return NULL;
}
timerEvents[timerId].valid = TRUE;
return timerId + 1; //No error
}
MMRESULT timeKillEvent(UINT uTimerID) {
//TODO
timer_delete(timerEvents[uTimerID - 1].timer);
timerEvents[uTimerID - 1].valid = FALSE;
return 0; //No error
}
MMRESULT timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc) {
//TODO
if(ptc) {
ptc->wPeriodMin = 1; // ms
ptc->wPeriodMax = 1000000; // ms -> 1000s
}
return 0; //No error
}
MMRESULT timeBeginPeriod(UINT uPeriod) {