wxThread::ExitCode CEventLoop::Entry() { scoped_lock l(sync_); while (!quit_) { if (!signalled_) { int wait = GetNextWaitInterval(); if (wait == std::numeric_limits<int>::max()) { cond_.wait(l); } else if (wait) { cond_.wait(l, wait); } } signalled_ = false; if (!ProcessTimers(l)) { if (ProcessEvent(l)) { signalled_ = true; } } } return 0; }
wxThread::ExitCode CEventLoop::Entry() { scoped_lock l(sync_); while (!quit_) { CMonotonicClock const now(CMonotonicClock::now()); if (ProcessTimers(l, now)) { continue; } if (ProcessEvent(l)) { continue; } // Nothing to do, now we wait if (deadline_) { int wait = static_cast<int>((deadline_ - now).get_milliseconds()); cond_.wait(l, wait); } else { cond_.wait(l); } } return 0; }
void glutMainLoop(void) { int idleiters; if(ReshapeFunc) ReshapeFunc(VarInfo.xres, VarInfo.yres); if(!DisplayFunc) { sprintf(exiterror, "Fatal Error: No Display Function registered\n"); exit(0); } for(;;) { ProcessTimers(); if(Active) ReceiveInput(); else if(VisiblePoll) TestVisible(); if(IdleFunc) IdleFunc(); if(VisibleSwitch) { VisibleSwitch = 0; if(VisibilityFunc) VisibilityFunc(Visible ? GLUT_VISIBLE : GLUT_NOT_VISIBLE); } if(Resized) { SetVideoMode(); CreateBuffer(); if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) { sprintf(exiterror, "Failure to Make Current\n"); exit(0); } InitializeMenus(); if(ReshapeFunc) ReshapeFunc(VarInfo.xres, VarInfo.yres); Redisplay = 1; Resized = 0; } if(Visible && Redisplay) { Redisplay = 0; EraseCursor(); DisplayFunc(); if(!(DisplayMode & GLUT_DOUBLE)) { if(ActiveMenu) DrawMenus(); DrawCursor(); } idleiters = 0; } else { /* we sleep if not receiving redisplays, and the main loop is running faster than 2khz */ static int lasttime; int time = glutGet(GLUT_ELAPSED_TIME); if(time > lasttime) { if(idleiters >= 2) usleep(100); idleiters = 0; lasttime = time; } idleiters++; } } }
int main(void) { //STATIC_ASSERT(sizeof(uint16_t) == 2); InitGPIO(); InitSPI_soft(); InitI2C_soft(); InitADC(); InitSystemTimer(); InitTimers(); InitMessages(); InitCC2500(preferredSettings); //(const uint8_t **)conf(+6bytes of code), preferredSettings uart0_init( UART_BAUD_SELECT(RS485_BAUDRATE, F_CPU) ); //_delay_ms(5000); //InitEXTI(); //MCUCR |= (_BV(ISC11) | _BV(ISC01)); /*check Watchdog reset flag*/ if(bit_is_set(MCUCSR, WDRF)) { //increase wathcdog reset counter and save in eeprom } set_sleep_mode(SLEEP_MODE_IDLE); //варианты SLEEP_MODE_PWR_SAVE SLEEP_MODE_IDLE SLEEP_MODE_ADC //wdt_enable(WDTO_2S); sei(); //enable interrupts for (uint8_t i = 0; i<0x05; i++) { //_spi_start(); //spi_TxRx(0x9D); //_spi_stop(); _delay_ms(100); PORTC |= _BV(PC2); //blink for test _delay_ms(100); PORTC &= ~_BV(PC2); _delay_ms(100); RS485_DE_HIGH; uart0_putc(0xba); _delay_ms(2); RS485_DE_LOW; } RS485_DE_LOW; while(1) { cc_table_state[CC_state](); ProcessTimers(&sys_timer); ProcessMessages(); wdt_reset(); /*enter in sleep mode until interrupts occured*/ // cli(); //disable interrupts // if (some_condition) // { // sleep_enable(); // sei(); // sleep_cpu(); // sleep_disable(); // } // sei(); } return 0; }
/* * RawInputThreadMain * * Reads data from input devices and supports win32 timers */ VOID NTAPI RawInputThreadMain() { NTSTATUS MouStatus = STATUS_UNSUCCESSFUL, KbdStatus = STATUS_UNSUCCESSFUL, Status; IO_STATUS_BLOCK MouIosb, KbdIosb; PFILE_OBJECT pKbdDevice = NULL, pMouDevice = NULL; LARGE_INTEGER ByteOffset; //LARGE_INTEGER WaitTimeout; PVOID WaitObjects[3], pSignaledObject = NULL; ULONG cWaitObjects = 0, cMaxWaitObjects = 1; MOUSE_INPUT_DATA MouseInput; KEYBOARD_INPUT_DATA KeyInput; ByteOffset.QuadPart = (LONGLONG)0; //WaitTimeout.QuadPart = (LONGLONG)(-10000000); ptiRawInput = GetW32ThreadInfo(); ptiRawInput->TIF_flags |= TIF_SYSTEMTHREAD; ptiRawInput->pClientInfo->dwTIFlags = ptiRawInput->TIF_flags; TRACE("Raw Input Thread %p\n", ptiRawInput); KeSetPriorityThread(&PsGetCurrentThread()->Tcb, LOW_REALTIME_PRIORITY + 3); UserEnterExclusive(); StartTheTimers(); UserLeave(); for (;;) { if (!ghMouseDevice) { /* Check if mouse device already exists */ Status = OpenInputDevice(&ghMouseDevice, &pMouDevice, L"\\Device\\PointerClass0" ); if (NT_SUCCESS(Status)) { ++cMaxWaitObjects; TRACE("Mouse connected!\n"); } } if (!ghKeyboardDevice) { /* Check if keyboard device already exists */ Status = OpenInputDevice(&ghKeyboardDevice, &pKbdDevice, L"\\Device\\KeyboardClass0"); if (NT_SUCCESS(Status)) { ++cMaxWaitObjects; TRACE("Keyboard connected!\n"); // Get and load keyboard attributes. UserInitKeyboard(ghKeyboardDevice); UserEnterExclusive(); // Register the Window hotkey. UserRegisterHotKey(PWND_BOTTOM, IDHK_WINKEY, MOD_WIN, 0); // Register the debug hotkeys. StartDebugHotKeys(); UserLeave(); } } /* Reset WaitHandles array */ cWaitObjects = 0; WaitObjects[cWaitObjects++] = MasterTimer; if (ghMouseDevice) { /* Try to read from mouse if previous reading is not pending */ if (MouStatus != STATUS_PENDING) { MouStatus = ZwReadFile(ghMouseDevice, NULL, NULL, NULL, &MouIosb, &MouseInput, sizeof(MOUSE_INPUT_DATA), &ByteOffset, NULL); } if (MouStatus == STATUS_PENDING) WaitObjects[cWaitObjects++] = &pMouDevice->Event; } if (ghKeyboardDevice) { /* Try to read from keyboard if previous reading is not pending */ if (KbdStatus != STATUS_PENDING) { KbdStatus = ZwReadFile(ghKeyboardDevice, NULL, NULL, NULL, &KbdIosb, &KeyInput, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL); } if (KbdStatus == STATUS_PENDING) WaitObjects[cWaitObjects++] = &pKbdDevice->Event; } /* If all objects are pending, wait for them */ if (cWaitObjects == cMaxWaitObjects) { Status = KeWaitForMultipleObjects(cWaitObjects, WaitObjects, WaitAny, UserRequest, KernelMode, TRUE, NULL,//&WaitTimeout, NULL); if ((Status >= STATUS_WAIT_0) && (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects))) { /* Some device has finished reading */ pSignaledObject = WaitObjects[Status - STATUS_WAIT_0]; /* Check if it is mouse or keyboard and update status */ if (pSignaledObject == &pMouDevice->Event) MouStatus = MouIosb.Status; else if (pSignaledObject == &pKbdDevice->Event) KbdStatus = KbdIosb.Status; else if (pSignaledObject == MasterTimer) { ProcessTimers(); } else ASSERT(FALSE); } } /* Have we successed reading from mouse? */ if (NT_SUCCESS(MouStatus) && MouStatus != STATUS_PENDING) { TRACE("MouseEvent\n"); /* Set LastInputTick */ IntLastInputTick(TRUE); /* Process data */ UserEnterExclusive(); UserProcessMouseInput(&MouseInput); UserLeave(); } else if (MouStatus != STATUS_PENDING) ERR("Failed to read from mouse: %x.\n", MouStatus); /* Have we successed reading from keyboard? */ if (NT_SUCCESS(KbdStatus) && KbdStatus != STATUS_PENDING) { TRACE("KeyboardEvent: %s %04x\n", (KeyInput.Flags & KEY_BREAK) ? "up" : "down", KeyInput.MakeCode); /* Set LastInputTick */ IntLastInputTick(TRUE); /* Process data */ UserEnterExclusive(); UserProcessKeyboardInput(&KeyInput); UserLeave(); } else if (KbdStatus != STATUS_PENDING) ERR("Failed to read from keyboard: %x.\n", KbdStatus); } ERR("Raw Input Thread Exit!\n"); }