ported to soso os
This commit is contained in:
parent
39a54f4574
commit
98e1f410a3
207
doomgeneric/doomgeneric_soso.c
Normal file
207
doomgeneric/doomgeneric_soso.c
Normal file
@ -0,0 +1,207 @@
|
||||
//doomgeneric for soso os
|
||||
|
||||
#include "doomkeys.h"
|
||||
|
||||
#include "doomgeneric.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sosousdk.h>
|
||||
#include "../kernel/termios.h"
|
||||
|
||||
static int FrameBufferFd = -1;
|
||||
static int* FrameBuffer = 0;
|
||||
|
||||
static int KeyboardFd = -1;
|
||||
|
||||
#define KEYQUEUE_SIZE 16
|
||||
|
||||
static unsigned short s_KeyQueue[KEYQUEUE_SIZE];
|
||||
static unsigned int s_KeyQueueWriteIndex = 0;
|
||||
static unsigned int s_KeyQueueReadIndex = 0;
|
||||
|
||||
static unsigned char convertToDoomKey(unsigned char scancode)
|
||||
{
|
||||
unsigned char key = 0;
|
||||
|
||||
switch (scancode)
|
||||
{
|
||||
case 0x9C:
|
||||
case 0x1C:
|
||||
key = KEY_ENTER;
|
||||
break;
|
||||
case 0x01:
|
||||
key = KEY_ESCAPE;
|
||||
break;
|
||||
case 0xCB:
|
||||
case 0x4B:
|
||||
key = KEY_LEFTARROW;
|
||||
break;
|
||||
case 0xCD:
|
||||
case 0x4D:
|
||||
key = KEY_RIGHTARROW;
|
||||
break;
|
||||
case 0xC8:
|
||||
case 0x48:
|
||||
key = KEY_UPARROW;
|
||||
break;
|
||||
case 0xD0:
|
||||
case 0x50:
|
||||
key = KEY_DOWNARROW;
|
||||
break;
|
||||
case 0x1D:
|
||||
key = KEY_FIRE;
|
||||
break;
|
||||
case 0x39:
|
||||
key = KEY_USE;
|
||||
break;
|
||||
case 0x2A:
|
||||
case 0x36:
|
||||
key = KEY_RSHIFT;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
static void addKeyToQueue(int pressed, unsigned char keyCode)
|
||||
{
|
||||
unsigned char key = convertToDoomKey(keyCode);
|
||||
|
||||
unsigned short keyData = (pressed << 8) | key;
|
||||
|
||||
s_KeyQueue[s_KeyQueueWriteIndex] = keyData;
|
||||
s_KeyQueueWriteIndex++;
|
||||
s_KeyQueueWriteIndex %= KEYQUEUE_SIZE;
|
||||
}
|
||||
|
||||
|
||||
struct termios orig_termios;
|
||||
|
||||
void disableRawMode() {
|
||||
//printf("returning original termios\n");
|
||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
|
||||
}
|
||||
|
||||
void enableRawMode() {
|
||||
tcgetattr(STDIN_FILENO, &orig_termios);
|
||||
atexit(disableRawMode);
|
||||
struct termios raw = orig_termios;
|
||||
raw.c_lflag &= ~(ECHO | ICANON);
|
||||
//raw.c_lflag &= ~(ECHO);
|
||||
raw.c_cc[VMIN] = 0;
|
||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
|
||||
}
|
||||
|
||||
void DG_Init()
|
||||
{
|
||||
FrameBufferFd = open("/dev/fb0", 0);
|
||||
|
||||
if (FrameBufferFd >= 0)
|
||||
{
|
||||
FrameBuffer = mmap(NULL, DOOMGENERIC_RESX * DOOMGENERIC_RESY * 4, 0, FrameBufferFd, 0);
|
||||
|
||||
if (FrameBuffer != (int*)-1)
|
||||
{
|
||||
printf("mmap success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("mmap failed\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("opening device failed!\n");
|
||||
}
|
||||
|
||||
enableRawMode();
|
||||
|
||||
KeyboardFd = open("/dev/keyboard", 0);
|
||||
|
||||
if (KeyboardFd >= 0)
|
||||
{
|
||||
//enter non-blocking mode
|
||||
syscall_ioctl(KeyboardFd, 1, (void*)1);
|
||||
}
|
||||
}
|
||||
|
||||
static void handleKeyInput()
|
||||
{
|
||||
if (KeyboardFd < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned char scancode = 0;
|
||||
|
||||
if (read(KeyboardFd, &scancode, 1) > 0)
|
||||
{
|
||||
unsigned char keyRelease = (0x80 & scancode);
|
||||
|
||||
scancode = (0x7F & scancode);
|
||||
|
||||
//printf("scancode:%x pressed:%d\n", scancode, 0 == keyRelease);
|
||||
|
||||
if (0 == keyRelease)
|
||||
{
|
||||
addKeyToQueue(1, scancode);
|
||||
}
|
||||
else
|
||||
{
|
||||
addKeyToQueue(0, scancode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DG_DrawFrame()
|
||||
{
|
||||
if (FrameBuffer)
|
||||
{
|
||||
//memcpy(FrameBuffer, DG_ScreenBuffer, DOOMGENERIC_RESX * DOOMGENERIC_RESY * 4);
|
||||
|
||||
const int screenWidth = 1024;
|
||||
|
||||
for (int i = 0; i < DOOMGENERIC_RESY; ++i)
|
||||
{
|
||||
memcpy(FrameBuffer + i * screenWidth, DG_ScreenBuffer + i * DOOMGENERIC_RESX, DOOMGENERIC_RESX * 4);
|
||||
}
|
||||
}
|
||||
|
||||
handleKeyInput();
|
||||
}
|
||||
|
||||
void DG_SleepMs(uint32_t ms)
|
||||
{
|
||||
sleepMilliseconds(ms);
|
||||
}
|
||||
|
||||
uint32_t DG_GetTicksMs()
|
||||
{
|
||||
return getUptimeMilliseconds();
|
||||
}
|
||||
|
||||
int DG_GetKey(int* pressed, unsigned char* doomKey)
|
||||
{
|
||||
if (s_KeyQueueReadIndex == s_KeyQueueWriteIndex)
|
||||
{
|
||||
//key queue is empty
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned short keyData = s_KeyQueue[s_KeyQueueReadIndex];
|
||||
s_KeyQueueReadIndex++;
|
||||
s_KeyQueueReadIndex %= KEYQUEUE_SIZE;
|
||||
|
||||
*pressed = keyData >> 8;
|
||||
*doomKey = keyData & 0xFF;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user