static int lua_circlepad(lua_State *L) { int argc = lua_gettop(L); #ifndef SKIP_ERROR_HANDLING if (lua_gettop(L) != 0) return luaL_error(L, "wrong number of arguments."); #endif circlePosition cpos; hidCircleRead(&cpos); lua_pushnumber(L, cpos.dx); lua_pushnumber(L, cpos.dy); return 2; }
int joystickGetAxes(lua_State *L) { love_joystick *self = luaobj_checkudata(L, 1, CLASS_TYPE); int numAxesCheck = lua_gettop(L); for (int i = 2; i <= numAxesCheck; i++) { int axisId = luaL_checkinteger(L, i); if( axisId < 5 ) { // Circle Axes circlePosition circleData; hidCircleRead(&circleData); if( axisId == 1 ) lua_pushinteger(L, circleData.dx); if( axisId == 2 ) lua_pushinteger(L, circleData.dy); circlePosition cStickData; irrstCstickRead(&cStickData); if( axisId == 3 ) lua_pushinteger(L, cStickData.dx); if( axisId == 4 ) lua_pushinteger(L, cStickData.dy); } else if( axisId < 8 ) { // Gyro Axes HIDUSER_EnableGyroscope(); angularRate gyroData; hidGyroRead(&gyroData); if( axisId == 5 ) lua_pushinteger(L, gyroData.x); if( axisId == 6 ) lua_pushinteger(L, gyroData.y); if( axisId == 7 ) lua_pushinteger(L, gyroData.z); } else if ( axisId < 11 ) { // Accelloremeter Axes HIDUSER_EnableAccelerometer(); accelVector accelData; hidAccelRead(&accelData); if( axisId == 8 ) lua_pushinteger(L, accelData.x); if( axisId == 9 ) lua_pushinteger(L, accelData.y); if( axisId == 10 ) lua_pushinteger(L, accelData.z); } else { luaError(L, "AxisId out of bounds"); } } return numAxesCheck-1; }
int hidCollectData(struct hidInfo *info) { info->keys.up = hidKeysUp(); info->keys.down = hidKeysDown(); info->keys.held = hidKeysHeld(); hidTouchRead(&info->touchscreen); hidCircleRead(&info->circlepad); hidGyroRead(&info->gyro); hidCstickRead(&info->cstick); return 0; }
static void ctr_joypad_poll(void) { int32_t ret; uint32_t state_tmp; circlePosition state_tmp_analog; global_t *global = global_get_ptr(); uint64_t *lifecycle_state = (uint64_t*)&global->lifecycle_state; hidScanInput(); state_tmp = hidKeysHeld(); hidCircleRead(&state_tmp_analog); analog_state[0][0][0] = analog_state[0][0][1] = analog_state[0][1][0] = analog_state[0][1][1] = 0; pad_state = 0; pad_state |= (state_tmp & KEY_DLEFT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; pad_state |= (state_tmp & KEY_DDOWN) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; pad_state |= (state_tmp & KEY_DRIGHT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; pad_state |= (state_tmp & KEY_DUP) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_UP) : 0; pad_state |= (state_tmp & KEY_START) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_START) : 0; pad_state |= (state_tmp & KEY_SELECT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; pad_state |= (state_tmp & KEY_X) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_X) : 0; pad_state |= (state_tmp & KEY_Y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_Y) : 0; pad_state |= (state_tmp & KEY_B) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_B) : 0; pad_state |= (state_tmp & KEY_A) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_A) : 0; pad_state |= (state_tmp & KEY_R) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_R) : 0; pad_state |= (state_tmp & KEY_L) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L) : 0; analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = (state_tmp_analog.dx * 200); analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -(state_tmp_analog.dy * 200); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) if (analog_state[0][i][j] == -0x8000) analog_state[0][i][j] = -0x7fff; *lifecycle_state &= ~((1ULL << RARCH_MENU_TOGGLE)); if(state_tmp & KEY_TOUCH) *lifecycle_state |= (1ULL << RARCH_MENU_TOGGLE); /* panic button */ if((state_tmp & KEY_START) && (state_tmp & KEY_SELECT) && (state_tmp & KEY_L) && (state_tmp & KEY_R)) event_command(EVENT_CMD_QUIT); }
static void ctr_joypad_poll(void) { int32_t ret; unsigned i, j; uint32_t state_tmp; circlePosition state_tmp_analog; hidScanInput(); state_tmp = hidKeysHeld(); hidCircleRead(&state_tmp_analog); analog_state[0][0][0] = analog_state[0][0][1] = analog_state[0][1][0] = analog_state[0][1][1] = 0; pad_state = 0; pad_state |= (state_tmp & KEY_DLEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; pad_state |= (state_tmp & KEY_DDOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; pad_state |= (state_tmp & KEY_DRIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; pad_state |= (state_tmp & KEY_DUP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; pad_state |= (state_tmp & KEY_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; pad_state |= (state_tmp & KEY_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; pad_state |= (state_tmp & KEY_X) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; pad_state |= (state_tmp & KEY_Y) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; pad_state |= (state_tmp & KEY_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; pad_state |= (state_tmp & KEY_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; pad_state |= (state_tmp & KEY_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; pad_state |= (state_tmp & KEY_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = (state_tmp_analog.dx * 200); analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -(state_tmp_analog.dy * 200); for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) if (analog_state[0][i][j] == -0x8000) analog_state[0][i][j] = -0x7fff; BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); if(state_tmp & KEY_TOUCH) BIT64_SET(lifecycle_state, RARCH_MENU_TOGGLE); /* panic button */ if((state_tmp & KEY_START) && (state_tmp & KEY_SELECT) && (state_tmp & KEY_L) && (state_tmp & KEY_R)) event_command(EVENT_CMD_QUIT); }
static void ctr_joypad_poll(void) { uint32_t state_tmp; circlePosition state_tmp_left_analog, state_tmp_right_analog; touchPosition state_tmp_touch; hidScanInput(); state_tmp = hidKeysHeld(); hidCircleRead(&state_tmp_left_analog); irrstCstickRead(&state_tmp_right_analog); hidTouchRead(&state_tmp_touch); pad_state = 0; pad_state |= (state_tmp & KEY_DLEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; pad_state |= (state_tmp & KEY_DDOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; pad_state |= (state_tmp & KEY_DRIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; pad_state |= (state_tmp & KEY_DUP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; pad_state |= (state_tmp & KEY_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; pad_state |= (state_tmp & KEY_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; pad_state |= (state_tmp & KEY_X) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; pad_state |= (state_tmp & KEY_Y) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; pad_state |= (state_tmp & KEY_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; pad_state |= (state_tmp & KEY_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; pad_state |= (state_tmp & KEY_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; pad_state |= (state_tmp & KEY_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; pad_state |= (state_tmp & KEY_ZR) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; pad_state |= (state_tmp & KEY_ZL) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = ctr_joypad_fix_range(state_tmp_left_analog.dx); analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -ctr_joypad_fix_range(state_tmp_left_analog.dy); analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = ctr_joypad_fix_range(state_tmp_right_analog.dx); analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = -ctr_joypad_fix_range(state_tmp_right_analog.dy); BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); if((state_tmp & KEY_TOUCH) && (state_tmp_touch.py > 120)) BIT64_SET(lifecycle_state, RARCH_MENU_TOGGLE); /* panic button */ if((state_tmp & KEY_START) && (state_tmp & KEY_SELECT) && (state_tmp & KEY_L) && (state_tmp & KEY_R)) command_event(CMD_EVENT_QUIT, NULL); }
void CtrUi::ProcessEvents() { hidScanInput(); u32 input = hidKeysHeld(); keys[Input::Keys::Z] = (input & KEY_A); keys[Input::Keys::X] = (input & KEY_B); keys[Input::Keys::N8] = (input & KEY_X); keys[Input::Keys::SHIFT] = (input & KEY_Y); keys[Input::Keys::F12] = (input & KEY_SELECT); keys[Input::Keys::ESCAPE] = (input & KEY_START); keys[Input::Keys::RIGHT] = (input & KEY_DRIGHT); keys[Input::Keys::LEFT] = (input & KEY_DLEFT); keys[Input::Keys::UP] = (input & KEY_DUP); keys[Input::Keys::DOWN] = (input & KEY_DDOWN); keys[Input::Keys::F2] = (input & KEY_L); //Fullscreen mode support bool old_state = trigger_state; trigger_state = (input & KEY_R); if ((trigger_state != old_state) && trigger_state) fullscreen = !fullscreen; //CirclePad support circlePosition circlepad; hidCircleRead(&circlepad); if (circlepad.dy > 25) keys[Input::Keys::UP] = true; else if (circlepad.dy < -25) keys[Input::Keys::DOWN] = true; else if (circlepad.dx > 25) keys[Input::Keys::RIGHT] = true; else if (circlepad.dx < -25) keys[Input::Keys::LEFT] = true; #ifdef NO_DEBUG //Touchscreen support if (input & KEY_TOUCH){ touchPosition pos; hidTouchRead(&pos); u8 row = pos.px>>6; u8 col = pos.py / 60; u32 keys_tbl[16] = {Input::Keys::N7, Input::Keys::N8, Input::Keys::N9, Input::Keys::DIVIDE, Input::Keys::N4, Input::Keys::N5, Input::Keys::N6, Input::Keys::MULTIPLY, Input::Keys::N1, Input::Keys::N2, Input::Keys::N3, Input::Keys::SUBTRACT, Input::Keys::N0, Input::Keys::N0, Input::Keys::PERIOD, Input::Keys::ADD }; keys[keys_tbl[row + (col*4)]] = true; }else{
void IN_Move (usercmd_t *cmd) { if(hidKeysHeld() & KEY_TOUCH){ hidTouchRead(&touch); touch.px = (touch.px + oldtouch.px) / 2; touch.py = (touch.py + oldtouch.py) / 2; cl.viewangles[YAW] -= (touch.px - oldtouch.px) * sensitivity.value/2; if(in_mlook.state & 1) cl.viewangles[PITCH] += (touch.py - oldtouch.py) * sensitivity.value/2; oldtouch = touch; } hidCircleRead(&circlepad); //CirclePad deadzone to fix ghost movements if(abs(circlepad.dy) > 15){ cmd->forwardmove += m_forward.value * circlepad.dy * 2; } if(abs(circlepad.dx) > 15){ if((in_strafe.state & 1) || (lookstrafe.value)) cmd->sidemove += m_side.value * circlepad.dx * 2; else cl.viewangles[YAW] -= m_side.value * circlepad.dx * 0.03; } //cStick is only available on N3DS... Until libctru implements support for circlePad Pro if(isN3DS){ hidCstickRead(&cstick); if(m_pitch.value < 0) cstick.dy = -cstick.dy; cstick.dx = abs(cstick.dx) < 10 ? 0 : cstick.dx * csensitivity.value * 0.01; cstick.dy = abs(cstick.dy) < 10 ? 0 : cstick.dy * csensitivity.value * 0.01; cl.viewangles[YAW] -= cstick.dx; cl.viewangles[PITCH] -= cstick.dy; } V_StopPitchDrift (); }
int joystickGetAxis(lua_State *L) { love_joystick *self = luaobj_checkudata(L, 1, CLASS_TYPE); int axisId = luaL_checkinteger(L, 2); if( axisId < 3 ) { // Circle Axes circlePosition circleData; hidCircleRead(&circleData); if( axisId == 1 ) lua_pushinteger(L, circleData.dx); if( axisId == 2 ) lua_pushinteger(L, circleData.dy); } else if( axisId < 6 ) { // Gyro Axes HIDUSER_EnableGyroscope(); angularRate gyroData; hidGyroRead(&gyroData); if( axisId == 3 ) lua_pushinteger(L, gyroData.x); if( axisId == 4 ) lua_pushinteger(L, gyroData.y); if( axisId == 5 ) lua_pushinteger(L, gyroData.z); } else if ( axisId < 9 ) { // Accelloremeter Axes HIDUSER_EnableAccelerometer(); accelVector accelData; hidAccelRead(&accelData); if( axisId == 6 ) lua_pushinteger(L, accelData.x); if( axisId == 7 ) lua_pushinteger(L, accelData.y); if( axisId == 8 ) lua_pushinteger(L, accelData.z); } else { luaError(L, "AxisId out of bounds"); } return 1; }
static void eventThreadFunc(void *arg) { OSystem_3DS *osys = (OSystem_3DS *)g_system; auto eventQueue = (Common::Queue<Common::Event> *)arg; uint32 touchStartTime = osys->getMillis(); touchPosition lastTouch = {0, 0}; bool isRightClick = false; float cursorX = 0; float cursorY = 0; float cursorDeltaX = 0; float cursorDeltaY = 0; int circleDeadzone = 20; int borderSnapZone = 6; Common::Event event; while (!osys->exiting) { do { osys->delayMillis(10); } while (osys->sleeping && !osys->exiting); hidScanInput(); touchPosition touch; circlePosition circle; u32 held = hidKeysHeld(); u32 keysPressed = hidKeysDown(); u32 keysReleased = hidKeysUp(); // C-Pad used to control the cursor hidCircleRead(&circle); if (circle.dx < circleDeadzone && circle.dx > -circleDeadzone) circle.dx = 0; if (circle.dy < circleDeadzone && circle.dy > -circleDeadzone) circle.dy = 0; cursorDeltaX = (0.0002f + config.sensitivity / 100000.f) * circle.dx * abs(circle.dx); cursorDeltaY = (0.0002f + config.sensitivity / 100000.f) * circle.dy * abs(circle.dy); // Touch screen events if (held & KEY_TOUCH) { hidTouchRead(&touch); if (config.snapToBorder) { if (touch.px < borderSnapZone) touch.px = 0; if (touch.px > 319 - borderSnapZone) touch.px = 319; if (touch.py < borderSnapZone) touch.py = 0; if (touch.py > 239 - borderSnapZone) touch.py = 239; } cursorX = touch.px; cursorY = touch.py; osys->transformPoint(touch); osys->warpMouse(touch.px, touch.py); event.mouse.x = touch.px; event.mouse.y = touch.py; if (keysPressed & KEY_TOUCH) { touchStartTime = osys->getMillis(); isRightClick = (held & KEY_X || held & KEY_DUP); if (inputMode == MODE_DRAG) { event.type = isRightClick ? Common::EVENT_RBUTTONDOWN : Common::EVENT_LBUTTONDOWN; pushEventQueue(eventQueue, event); } } else if (touch.px != lastTouch.px || touch.py != lastTouch.py) { event.type = Common::EVENT_MOUSEMOVE; pushEventQueue(eventQueue, event); } lastTouch = touch; } else if (keysReleased & KEY_TOUCH) { event.mouse.x = lastTouch.px; event.mouse.y = lastTouch.py; if (inputMode == MODE_DRAG) { event.type = isRightClick ? Common::EVENT_RBUTTONUP : Common::EVENT_LBUTTONUP; pushEventQueue(eventQueue, event); } else if (osys->getMillis() - touchStartTime < 200) { // Process click in MODE_HOVER event.type = Common::EVENT_MOUSEMOVE; pushEventQueue(eventQueue, event); event.type = isRightClick ? Common::EVENT_RBUTTONDOWN : Common::EVENT_LBUTTONDOWN; pushEventQueue(eventQueue, event); event.type = isRightClick ? Common::EVENT_RBUTTONUP : Common::EVENT_LBUTTONUP; pushEventQueue(eventQueue, event); } } else if (cursorDeltaX != 0 || cursorDeltaY != 0) { cursorX += cursorDeltaX; cursorY -= cursorDeltaY; if (cursorX < 0) cursorX = 0; if (cursorY < 0) cursorY = 0; if (cursorX > 320) cursorX = 320; if (cursorY > 240) cursorY = 240; lastTouch.px = cursorX; lastTouch.py = cursorY; osys->transformPoint(lastTouch); osys->warpMouse(lastTouch.px, lastTouch.py); event.mouse.x = lastTouch.px; event.mouse.y = lastTouch.py; event.type = Common::EVENT_MOUSEMOVE; pushEventQueue(eventQueue, event); } // Button events if (keysPressed & KEY_R) { if (inputMode == MODE_DRAG) { inputMode = MODE_HOVER; osys->displayMessageOnOSD("Hover Mode"); } else { inputMode = MODE_DRAG; osys->displayMessageOnOSD("Drag Mode"); } } if (keysPressed & KEY_A || keysPressed & KEY_DLEFT || keysReleased & KEY_A || keysReleased & KEY_DLEFT) { // SIMULATE LEFT CLICK event.mouse.x = lastTouch.px; event.mouse.y = lastTouch.py; if (keysPressed & KEY_A || keysPressed & KEY_DLEFT) event.type = Common::EVENT_LBUTTONDOWN; else event.type = Common::EVENT_LBUTTONUP; pushEventQueue(eventQueue, event); } if (keysPressed & KEY_X || keysPressed & KEY_DUP || keysReleased & KEY_X || keysReleased & KEY_DUP) { // SIMULATE RIGHT CLICK event.mouse.x = lastTouch.px; event.mouse.y = lastTouch.py; if (keysPressed & KEY_X || keysPressed & KEY_DUP) event.type = Common::EVENT_RBUTTONDOWN; else event.type = Common::EVENT_RBUTTONUP; pushEventQueue(eventQueue, event); } if (keysPressed & KEY_L) { event.type = Common::EVENT_VIRTUAL_KEYBOARD; pushEventQueue(eventQueue, event); } if (keysPressed & KEY_START) { event.type = Common::EVENT_MAINMENU; pushEventQueue(eventQueue, event); } if (keysPressed & KEY_SELECT) { if (!optionMenuOpened) optionMenuOpening = true; } if (keysPressed & KEY_B || keysReleased & KEY_B || keysPressed & KEY_DDOWN || keysReleased & KEY_DDOWN) { if (keysPressed & KEY_B || keysPressed & KEY_DDOWN) event.type = Common::EVENT_KEYDOWN; else event.type = Common::EVENT_KEYUP; event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = Common::ASCII_ESCAPE; event.kbd.flags = 0; pushEventQueue(eventQueue, event); } // TODO: EVENT_PREDICTIVE_DIALOG // EVENT_SCREEN_CHANGED } }
int main() { // Set the random seed based on the time srand(time(NULL)); sf2d_init(); sf2d_set_clear_color(RGBA8(0x40, 0x40, 0x40, 0xFF)); sf2d_texture *tex1 = sf2d_create_texture_mem_RGBA8(dice_img.pixel_data, dice_img.width, dice_img.height, TEXFMT_RGBA8, SF2D_PLACE_RAM); sf2d_texture *tex2 = sf2d_create_texture_mem_RGBA8(citra_img.pixel_data, citra_img.width, citra_img.height, TEXFMT_RGBA8, SF2D_PLACE_RAM); float rad = 0.0f; u16 touch_x = 320/2; u16 touch_y = 240/2; touchPosition touch; circlePosition circle; u32 held; while (aptMainLoop()) { hidScanInput(); hidCircleRead(&circle); held = hidKeysHeld(); if (held & KEY_START) { break; } else if (held & KEY_TOUCH) { hidTouchRead(&touch); touch_x = touch.px; touch_y = touch.py; } else if (held & (KEY_L | KEY_R)) { sf2d_set_clear_color(RGBA8(rand()%255, rand()%255, rand()%255, 255)); } sf2d_start_frame(GFX_TOP, GFX_LEFT); sf2d_draw_rectangle_rotate(260, 20, 40, 40, RGBA8(0xFF, 0xFF, 0x00, 0xFF), -2.0f*rad); sf2d_draw_rectangle(20, 60, 40, 40, RGBA8(0xFF, 0x00, 0x00, 0xFF)); sf2d_draw_rectangle(5, 5, 30, 30, RGBA8(0x00, 0xFF, 0xFF, 0xFF)); sf2d_draw_texture_rotate(tex1, 400/2 + circle.dx, 240/2 - circle.dy, rad); sf2d_end_frame(); sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); sf2d_draw_rectangle_rotate(190, 160, 70, 60, RGBA8(0xFF, 0xFF, 0xFF, 0xFF), 3.0f*rad); sf2d_draw_rectangle(30, 100, 40, 60, RGBA8(0xFF, 0x00, 0xFF, 0xFF)); sf2d_draw_texture_rotate(tex2, touch_x, touch_y, -rad); sf2d_draw_rectangle(160-15 + cosf(rad)*50.0f, 120-15 + sinf(rad)*50.0f, 30, 30, RGBA8(0x00, 0xFF, 0xFF, 0xFF)); sf2d_draw_fill_circle(40, 40, 35, RGBA8(0x00, 0xFF, 0x00, 0xFF)); sf2d_end_frame(); rad += 0.2f; sf2d_swapbuffers(); } sf2d_free_texture(tex1); sf2d_free_texture(tex2); sf2d_fini(); return 0; }
int main() { gfxInitDefault(); gfxSet3D(true); // uncomment if using stereoscopic 3D gfxFlushBuffers(); transparent = BLACK; gfxSetScreenFormat(GFX_TOP, GSP_BGR8_OES); gfxSetScreenFormat(GFX_BOTTOM, GSP_BGR8_OES); InitParx(BLACK); /* ParxLeft = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); ParxRight = gfxGetFramebuffer(GFX_TOP, GFX_RIGHT, NULL, NULL); ParxBot = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); ClrParx(ParxLeft, BLACK); ClrParx(ParxRight, BLACK); ClrParx(ParxBot, BLACK); */ char* str[256]; int l, k, j, i=20, posx = 100, posy = 100; TBGR rgbsam; TBGR rgb; u64 time; u8* tempScr; bool Dbuf; circlePosition pos; touchPosition touch; // Main loop while (aptMainLoop()) { // gspWaitForVBlank(); // ParxLeft = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); // ParxRight = gfxGetFramebuffer(GFX_TOP, GFX_RIGHT, NULL, NULL); // ParxBot = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); hidScanInput(); u32 kDown = hidKeysHeld(); //Read the CirclePad position hidCircleRead(&pos); //Print the CirclePad position //- printf("\x1b[2;0H%04d; %04d", pos.dx, pos.dy); //Read the touch screen coordinates hidTouchRead(&touch); //Print the touch screen coordinates // printf("\x1b[2;0H%03d; %03d", touch.px, touch.py); if (kDown & KEY_START) break; // break in order to return to hbmenu if (kDown & KEY_A) { CanvasString(ParxBot, CopyRight(), 10,10, LIGHT_GREEN); } if (kDown & KEY_B) { time= osGetTime(); rgb.r= 0xCC; rgb.g= 0x33; rgb.b= 0xCC; for (k=0;k<400;k++) for (l=0;l<240;l++) { SetPixL(k,l,rgb); //TopLCD SetPixR(k,l,rgb); if (k<320) SetPixB(k,l,rgb); //BotLCD } time = osGetTime() - time; sprintf(str, "%i:ms ParxPro SetPix L/R/B,kdl", time); CanvasString(ParxBot, str, 10,10, GREEN); } if (kDown & KEY_X) { TestPattern(); } if (kDown & KEY_Y) { InitParx(BLACK); // PasBotfill(ParxBot); rgb.r= 0xFF; rgb.g= 0x00; rgb.b= 0x8F; PasClrSrc(ParxBot, rgb); CanvasString(ParxBot, "InitParx", 10,10, GREEN); } if(kDown & KEY_CPAD_DOWN) { rgb.r= 0x00; rgb.g= 0x00; rgb.b= 0XFF; PasTopfill(ParxLeft, rgb); PasTopfill(ParxRight, rgb); } if(kDown & KEY_CPAD_UP) { rgb.r= 0xFF; rgb.g= 0x00; rgb.b= 0x00; PasTopfill(ParxLeft, rgb); PasTopfill(ParxRight, rgb); } if(kDown & KEY_CPAD_RIGHT) { rgb.r= 0x00; rgb.g= 0xFF; rgb.b= 0x00; time= osGetTime(); PasTopfill(ParxLeft, rgb); PasTopfill(ParxRight, rgb); time = osGetTime() - time; sprintf(str, "%i:ms L&R BGRTop,kdl", time); CanvasString(ParxBot, str, 10,10, GREEN); } if(kDown & KEY_CPAD_LEFT) { rgb.r= 0x00; rgb.g= 0x11; rgb.b= 0x00; time= osGetTime(); HexTopfill(ParxLeft); HexTopfill(ParxRight); time = osGetTime() - time; sprintf(str, "%i:ms L&R TopMapLED,kdl", time); CanvasString(ParxBot, str, 10,10, GREEN); } if(kDown & KEY_R) { //InitBufSingle(BLACK); ClrParx(ParxBot, BLACK); //i of linearSpaceFree(); //no effect //i of vramSpaceFree(); //reads as Zero //i of mappableSpaceFree(); //no change in alloc & free sprintf(str, "v:%i m:%i l:%i", vramSpaceFree, mappableSpaceFree, linearSpaceFree); CanvasString(ParxBot, str, 0, 10, RED); Topfill2; sprintf(str, "v:%i m:%i l:%i", vramSpaceFree, mappableSpaceFree, linearSpaceFree); CanvasString(ParxBot, str, 0, 20, RED); // Topfill3; // sprintf(str, "Topfill3 Free :%i", vramSpaceFree); //CanvasString(ParxBot, str, 0, 40, RED); //sprintf(str, "Topfill3 Free :%i", ); //CanvasString(ParxBot, str, 0, 40, RED); } if(kDown & KEY_L) { if (Dbuf) InitBufDub(BLACK); else InitBufSingle(BLACK); Topfill1; ClrParx(ParxBot, BLACK); // sprintf(str, "Dergibal Rad:%i X:%i Y:%i", i, posx, posy); if (Dbuf) CanvasString(ParxBot, "InitBufDub", 0, 40, RED); else CanvasString(ParxBot, "InitBufSingle", 0, 40, RED); (BLACK); Dbuf = !Dbuf; } if(kDown & KEY_DUP) { for (k=0;k<400;k++) for (l=0;l<240;l++) { if (k<320) PSetPixT(ParxRight,k,l, GetPixB(k,l)); } } if(kDown & KEY_DDOWN) { time= osGetTime(); rgb.r= 0xCC; rgb.g= 0x11; rgb.b= 0xCC; for (k=0;k<400;k++) for (l=0;l<240;l++) { PSetPixT(ParxRight,k,l, rgb); //TopLCD PSetPixT(ParxLeft,k,l, rgb); if (k<320) PSetPixB(ParxBot,k,l, rgb); //BotLCD } time = osGetTime() - time; sprintf(str, "%i:ms ParxPro,kdl", time); CanvasString(ParxBot, str, 10,10, GREEN); } if(kDown & KEY_DRIGHT) { ClrParx(ParxBot, BLACK); rgb.r= 0xEE; rgb.g= 0x00; rgb.b= 0xCC; time= osGetTime(); for (k=0;k<400;k++) for (l=0;l<240;l++) SetPixL(k,l,rgb); //TopLCD time = osGetTime() - time; sprintf(str, "Left %i:ms ParxPro,kdl", time); CanvasString(ParxBot, str, 10,10, LIGHT_GREEN); time= osGetTime(); //ParxLeft = GetSrcL(-1); // good!! //tempScr = GetSrcL(0); // good!! //tempScr = GetSrcL(1); // good!! // for (k=0;k<400;k++) // { // ParxLeft = GetSrcL(-1); // good!! // for (l=0;l<80;l++) PSetPixT(ParxRight,k,l, GetPixL(k,l)); // // ParxLeft = GetSrcL(0); // good!! // for (l=80;l<160;l++) PSetPixT(ParxRight,k,l, GetPixL(k,l)); // ParxLeft = GetSrcL(1); // good!! // for (l=160;l<240;l++) PSetPixT(ParxRight,k,l, GetPixL(k,l)); // //assignment to eg PSetPixT(GetSrcR(-1),k,l, GetPixL(k,l)) poops out // } time = osGetTime() - time; sprintf(str, "ParxLeft = GetSrcL(-1&0&1); %i:ms ,kdl", time); CanvasString(ParxBot, str, 10,20, LIGHT_GREEN); time= osGetTime(); //SetSrcR(0,tempScr); // No Good //SetSrcL(-1,ParxLeft); // //sprintf(str, "SetSrcL(-1,ParxLeft); %i:ms ,kdl", time); //CanvasString(ParxBot, str, 10,40, LIGHT_GREEN); //BufSub(-1); //BufSub(-2); //BufSub(-3); //SetSrcL(-1,ParxLeft); // sprintf(str, "SetSrcL(1,ParxLeft); %i:ms ,kdl", time); CanvasString(ParxBot, str, 10,50, LIGHT_GREEN); //SetSrcR(0,ParxRight); // //sprintf(str, "SetSrcR(0,ParxRight) %i:ms ,kdl", time); //CanvasString(ParxBot, str, 10,60, LIGHT_GREEN); // for (k=0;k<400;k++) // for (l=0;l<240;l++) PSetPixT(GetSrcR(0),k,l,rgb); //GetSrcR(0) works time = osGetTime() - time; sprintf(str, "SetSrc L&R(-1,(ParxLeft & ParxRight); %i:ms ,kdl", time); CanvasString(ParxBot, str, 10,30, LIGHT_GREEN); } if(kDown & KEY_DLEFT) { // SetTopFramebuffers(0); time= osGetTime(); for (k=0;k<400;k++) for (l=0;l<240;l++) { SetPix(ParxRight,k,l,BLACK); SetPix(ParxLeft,k,l,BLACK); if (k<320) SetPix(ParxBot,k,l,BLACK); } time = osGetTime() - time; sprintf(str, "%i:ms Parx-GDI,kdl", time); CanvasString(ParxBot, str, 10,10, GREEN); } //gfxString(ParxRight, str, 30,30, 3, rgb); //gfxString(ParxLeft, str, 30,30, 3, rgb); //for (l=1;l<16;l++) print3d(rgb,10*l,10*l,l-1,3,str); //render rainbow // renderEffect(); //copy buffer to lower screen (don't have to do it every frame) // memcpy(gfxGetFramebuffer(GFX_BOTTOM, GFX_BOTTOM, NULL, NULL), buffer, size); //wait & swap // gfxSwapBuffersGpu(); // gspWaitForEvent(GSPGPU_EVENT_VBlank0, false); // Flush and swap framebuffers // gfxFlushBuffers(); // gfxSwapBuffers(); RefreshBuffer(); //Wait for VBlank gspWaitForVBlank(); } gfxExit(); return 0; }
void updateControls(player_s* p) { circlePosition cpad; circlePosition cstick; hidCircleRead(&cpad); irrstCstickRead(&cstick); rotatePlayer(p, vect3Df((abs(cstick.dy)<5)?0:(-cstick.dy*0.001f), (abs(cstick.dx)<5)?0:(cstick.dx*0.001f), 0.0f)); if(abs(cpad.dx) > 15 || abs(cpad.dy) > 15) //dead zone { float factor = 0.0015f; if(p->flying)factor*=2; else if(!p->object.contact)factor*=0.06f; else updatePlayerWalk(p, cpad.dy*factor*2, cpad.dx*factor); movePlayer(p, vect3Df(cpad.dx*factor, 0.0f, -cpad.dy*factor)); } if(keysDown()&KEY_ZL) { // "USE" key vect3Df_s u = moveCameraVector(&p->camera, vect3Df(0.0f, 0.0f, -1.0f), true); timedButton_s* tb = collideRayTimedButtons(p->object.position, u, TILESIZE_FLOAT*2); if(tb) { activateTimedButton(tb); }else{ OBB_s* o = collideRayBoxes(p->object.position, u, TILESIZE_FLOAT*4); if(o) { gravityGunObject = o; } } } if(keysDown()&KEY_ZR) { // JUMP key if(p->object.contact) { p->object.speed.y += 0.6f; } } if(gravityGunObject) { if(!(keysHeld()&KEY_ZL)) { gravityGunObject = NULL; md2InstanceChangeAnimation(&p->gunInstance, 0, false); md2InstanceChangeAnimation(&p->gunInstance, 1, true); }else{ const vect3Df_s u = moveCameraVector(&p->camera, vect3Df(0.0f, 0.0f, -5.0f), true); const vect3Df_s t = vaddf(u, p->object.position); const vect3Df_s v = vmulf(vsubf(t, gravityGunObject->position), 1.75f); setObbVelocity(gravityGunObject, v); md2InstanceChangeAnimation(&p->gunInstance, 2, false); } }else if(p->gunInstance.currentAnim == 2){ md2InstanceChangeAnimation(&p->gunInstance, 0, false); md2InstanceChangeAnimation(&p->gunInstance, 1, true); } }
//--------------------------------------------------------------------------- int main(int argc, char** argv) { touchPosition lastTouch; int frame=0,lp_frame=0; CWebRequest::InitializeClient(); gfxInitDefault(); GPU_Init(NULL); gfxSet3D(false); srand(svcGetSystemTick()); CFBClient::Initialize(); while(aptMainLoop()){ hidScanInput(); u32 press = hidKeysDown(); u32 held = hidKeysHeld(); u32 release = hidKeysUp(); if((press & ~KEY_TOUCH)){ CFBClient::onKeysPressEvent(press,1); hidCircleRead(&lcp); } if((release & ~KEY_TOUCH)){ CFBClient::onKeysUpEvent(press,1); hidCircleRead(&lcp); } if (held & KEY_TOUCH){ hidTouchRead(<); if(!lp_frame){ lastTouch=lt; lp_frame++; } else{ int i=0; if(abs(lt.px-lastTouch.px) <= 5){ if(abs(lt.py-lastTouch.py) <= 5) i = 1; } if(i) lp_frame++; else{ lp_frame = 0; CFBClient::onTouchEvent(<,2); } } if(!frame) CFBClient::onTouchEvent(<,1); frame++; } else{ if(frame) CFBClient::onTouchEvent(<,lp_frame > 120 ? 8 : 4); frame = 0; lp_frame = 0; } CFBClient::main(0); gfxFlushBuffers(); gfxSwapBuffers(); gspWaitForVBlank(); } CFBClient::Destroy(); CWebRequest::DestroyClient(); fsExit(); hidExit(); gfxExit(); aptExit(); srvExit(); return 0; }
int main(void) { irmemloc = (u32*) memalign(0x1000, 0x1000); resultStartup = IRU_Initialize(irmemloc, 0x1000); resultSetBit = IRU_SetBitRate(0xB); recordedIR = (u32*) malloc(REC_SIZE * NUM_OF_BUTTONS); //Currently there are 11(NUM_OF_BUTTONS) recordable buttons. (start switches mode) recentIR = (u32*) calloc(REC_SIZE, 0x1); //Whatever was last viewed in memory resultGetStatus = irucmd_GetTransferState(&StatusIR); srvInit(); // services aptInit(); // applets hidInit(NULL); // input gfxInitDefault(); // gfx gfxSetDoubleBuffering(GFX_TOP, true); gfxSetDoubleBuffering(GFX_BOTTOM, true); bot = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); top = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); if(setjmp(exitJmp)) goto exit; clearScreen(); gfxFlushBuffers(); gfxSwapBuffers(); bool startToggle = false; bool upToggle = false; bool downToggle = false; while(aptMainLoop()) { bot = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); top = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); hidScanInput(); irrstScanInput(); u32 kHeld = hidKeysHeld(); circlePosition circlePad; circlePosition cStick; hidCstickRead(&cStick); hidCircleRead(&circlePad); touchPosition touch; touchRead(&touch); clearScreen(); char keys[30] = "ABXY URDL SEST LR ZLZR"; if(kHeld & KEY_A) { keys[0] = '*'; ir('A'); } if(kHeld & KEY_B) { keys[1] = '*'; ir('B'); } if(kHeld & KEY_X) { keys[2] = '*'; ir('X'); } if(kHeld & KEY_Y) { keys[3] = '*'; ir('Y'); } if(kHeld & KEY_DUP) { keys[5] = '*'; if(upToggle) { if(bitrate < 18) { bitrate++; resultSetBit = IRU_SetBitRate(bitrate); } upToggle = false; } } else { upToggle = true; } if(kHeld & KEY_DRIGHT) { keys[6] = '*'; ir('R'); } if(kHeld & KEY_DDOWN) { keys[7] = '*'; if(downToggle) { if(bitrate > 3) { bitrate--; resultSetBit = IRU_SetBitRate(bitrate); } downToggle = false; } } else { downToggle = true; } if(kHeld & KEY_DLEFT) { keys[8] = '*'; ir('L'); } if(kHeld & KEY_SELECT) { keys[10] = '*'; keys[11] = '*'; ir('S'); } if(kHeld & KEY_START) { keys[12] = '*'; keys[13] = '*'; if(startToggle) { rec = !rec; startToggle = false; } } else { startToggle = true; } if(kHeld & KEY_L) { keys[15] = '*'; ir('L'); } if(kHeld & KEY_R) { keys[16] = '*'; ir('R'); } if(kHeld & KEY_ZL) { keys[18] = '*'; keys[19] = '*'; ir('1'); } if(kHeld & KEY_ZR) { keys[20] = '*'; keys[21] = '*'; ir('2'); } drawString(top, 10, 10, keys); drawString(top, 10, 20, "Circle Pad x: %04+d, y: %04+d", circlePad.dx, circlePad.dy); drawString(top, 10, 30, "Touch x: %04d, y: %04d", touch.px, touch.py ); if(resultStartup == 0) { drawString(top, 10, 40, "IR started!"); } else { drawString(top, 10, 40, "IR Init |Error: %x", resultStartup); } if(resultSetBit == 0) { drawString(top, 10, 50, "IR bit rate works!"); } else { drawString(top, 10, 50, "IR bit rate |Error: %x", resultSetBit); } if(resultTransferIR == 0) { drawString(top, 10, 60, "IR transfer works!"); } else { drawString(top, 10, 60, "IR transfer |Error: %x", resultTransferIR); } irucmd_GetTransferState(&StatusIR); drawString(top, 10, 70, "IR mode: %x", StatusIR); drawString(top, 10, 80, "Got %d bytes", TransIR); drawString(top, 10, 90, "Bitrate: %d (see IRU:SetBitRate)", bitrate); printMemory(NULL,REC_SIZE,10, false); //might be dangerous? if(rec) { drawString(top, 10, 210, "Recording mode active."); }else{ drawString(top, 10, 210, "Sending mode active."); } drawString(top, 10, 220, "Start + Select to exit."); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); gfxFlushBuffers(); gspWaitForVBlank(); gfxSwapBuffers(); } exit: //I should really be fixing these. free(recordedIR); //Crashes the program. Should free on release. free(irmemloc); //Crashes the program. Should free on release. free(recentIR); //Crashes the program. Should free on release. IRU_Shutdown(); //Crashes the program. Should free on release. gfxExit(); hidExit(); aptExit(); srvExit(); return 0; }
int main(int argc, char **argv) { gfxInitDefault(); socInit((u32 *)memalign(0x1000, 0x100000), 0x100000); // Check wifi status u32 wifiStatus = 0; ACU_GetWifiStatus(&wifiStatus); if (!wifiStatus) { printf("\x1b[1;1HNo WiFi! Is your wireless slider on?"); } // Use printf on top screen consoleInit(GFX_TOP, NULL); // Stuff for network magic int recvlen; unsigned char buf[BUFSIZE]; unsigned char IDBuf[BUFSIZE]; // Try create socket int err = 0; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { err = 1; } // Setup socket addresses out.sin_family = in.sin_family = AF_INET; out.sin_port = in.sin_port = htons(PORT); // Set port in.sin_addr.s_addr = INADDR_ANY; // Try to bind socket to port if (err == 0 && bind(sock, (struct sockaddr *)&in, sizeof(in)) < 0) err = 2; // If any errors if (err != 0) printf("\x1b[4;1HError opening connection: %i", err); // Set socket receive to non-blocking to be able to exit while listening for broadcast fcntl(sock, F_SETFL, O_NONBLOCK); bool connected = false; // Main loop while (aptMainLoop()) { if (err == 0) { // If not connected, listen for broadcast if (!connected) { printf("\x1b[1;1HListening for broadcast on port %d", PORT); // Listen for packets. Returns packet size recvlen = recvfrom(sock, buf, BUFSIZE, 0, (struct sockaddr *)&out, &addrlen); // Check if correct packet. recvlen < 0 -> Error if (recvlen > 0) { printf("\x1b[2;1Hr"); // Debug print. Writes r for any packet received buf[recvlen] = 0; // Don't remember what this is for. Oops // Check if message is connection port (Broadcast sends out port number as broadcast) int i = atoi(buf); if (i == PORT) { // If broadcast message, assign send address to received address in.sin_addr.s_addr = out.sin_addr.s_addr; // Prepare program; Setting flag, turning of backlight, etc connected = true; consoleClear(); printf("\x1b[1;1HConnected"); if (backlightOff == false) disableBacklight(); backlightOff = true; } } } } printf("\x1b[28;1HPlayer ID: %i", playerID); printf("\x1b[29;1HPress START and SELECT to exit"); // Scan input hidScanInput(); // Save keystate u32 kDown = hidKeysHeld(); if ((kDown & KEY_START) && (kDown & KEY_SELECT)) break; // break in order to return to hbmenu // If no errors and connected. Contruct input message if (err == 0 && connected) { // Get circle pad state circlePosition pos; hidCircleRead(&pos); // Construct message message.ID = playerID; message.pdx = pos.dx; message.pdy = pos.dy; message.btn = kDown; // Query for touchscreen information touchPosition touch; hidTouchRead(&touch); message.touch_px = touch.px; message.touch_py = touch.py; // Send packet to address broadcast came from sendto(sock, &message, sizeof(message), 0, (struct sockaddr *)&in, sizeof(in)); int recv = 0; int count = 0; do { count++; // Send packet to address broadcast came from sendto(sock, &message, sizeof(message), 0, (struct sockaddr *)&in, sizeof(in)); // Listen for packet to get player ID and check if server is alive //int recv = read(sock, IDBuf, sizeof(IDBuf)); recv = recvfrom(sock, IDBuf, BUFSIZE, 0, (struct sockaddr *)&out, &addrlen); } while (atoi(IDBuf) == PORT && count < 5); if (count < 5 && recv > 0) playerID = IDBuf[0] | IDBuf[1] << 1; else { connected = false; playerID = 0; consoleClear(); printf("\x1b[2;1HDisconnected"); if (backlightOff == true) { enableBacklight(); backlightOff = false; } } } u64 sleepDuration = 16000000ULL; svcSleepThread(sleepDuration); // Draw stuff gfxFlushBuffers(); gfxSwapBuffers(); gspWaitForVBlank(); } // On exit if (backlightOff == true) enableBacklight(); socExit(); gfxExit(); return 0; }
int main(void) { acInit(); gfxInitDefault(); gfxSetDoubleBuffering(GFX_TOP, false); gfxSetDoubleBuffering(GFX_BOTTOM, false); if(setjmp(exitJmp)) goto exit; preRenderKeyboard(); clearScreen(); drawString(10, 10, "Initing FS..."); gfxFlushBuffers(); gfxSwapBuffers(); fsInit(); clearScreen(); drawString(10, 10, "Initing SOC..."); gfxFlushBuffers(); gfxSwapBuffers(); SOC_Initialize((u32 *)memalign(0x1000, 0x100000), 0x100000); u32 wifiStatus = 0; ACU_GetWifiStatus(NULL, &wifiStatus); if(!wifiStatus) { hang("No WiFi! Is your wireless slider on?"); } clearScreen(); drawString(10, 10, "Reading settings..."); gfxFlushBuffers(); gfxSwapBuffers(); if(!readSettings()) { hang("Could not read 3DSController.ini!"); } clearScreen(); drawString(10, 10, "Connecting to %s on port %d...", settings.IPString, settings.port); gfxFlushBuffers(); gfxSwapBuffers(); openSocket(settings.port); sendConnectionRequest(); clearScreen(); gfxFlushBuffers(); gfxSwapBuffers(); disableBacklight(); while(aptMainLoop()) { hidScanInput(); irrstScanInput(); u32 kHeld = hidKeysHeld(); circlePosition circlePad; circlePosition cStick; hidCstickRead(&cStick); hidCircleRead(&circlePad); touchPosition touch; touchRead(&touch); clearScreen(); if((kHeld & KEY_L) && (kHeld & KEY_R) && (kHeld & KEY_X)) { if(keyboardToggle) { keyboardActive = !keyboardActive; keyboardToggle = false; if(keyboardActive) enableBacklight(); } } else keyboardToggle = true; if(keyboardActive) { drawKeyboard(); if(touch.px >= 1 && touch.px <= 312 && touch.py >= 78 && touch.py <= 208) { int x = (int)((float)touch.px * 12.0f / 320.0f); int y = (int)((float)(touch.py - 78) * 12.0f / 320.0f); int width = 24; int height = 24; if(keyboardChars[x + y * 12] == ' ') { while(keyboardChars[(x - 1) + y * 12] == ' ') x--; width = (int)(5.0f * 320.0f / 12.0f) - 1; } else if(keyboardChars[x + y * 12] == '\13') { while(keyboardChars[(x - 1) + y * 12] == '\13') x--; while(keyboardChars[x + (y - 1) * 12] == '\13') y--; width = (int)(2.0f * 320.0f / 12.0f) - 1; height = (int)(3.0f * 320.0f / 12.0f) - 1; } if(keyboardChars[x + y * 12]) drawBox((int)((float)x * 320.0f / 12.0f) + 1, (int)(78.0f + (float)y * 320.0f / 12.0f) + 1, width, height, 31, 31, 0); } } sendKeys(kHeld, circlePad, touch, cStick); //receiveBuffer(sizeof(struct packet)); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); gfxFlushBuffers(); gspWaitForVBlank(); gfxSwapBuffers(); } exit: enableBacklight(); SOC_Shutdown(); svcCloseHandle(fileHandle); fsExit(); gfxExit(); acExit(); return 0; }