/**
 * This implementation causes java stack to resume after
 * standard timeout after having been suspended.
 */
jboolean midp_checkResumeRequest() {
    static long lastSuspendStart = -1;
    long time_passed;
    jboolean result = KNI_FALSE;

    if (lastSuspendStart == -1) {
        REPORT_INFO(LC_LIFECYCLE, "midp_checkResumeRequest(): init timeout");
        lastSuspendStart = midp_getCurrentTime();
    }

    time_passed = midp_getCurrentTime() - lastSuspendStart;
    if (time_passed >= sr_resume_timeout) {
        lastSuspendStart = -1;
        sr_resume_timeout = DEFAULT_TIMEOUT;
        result = KNI_TRUE;
    }

    return result;
}
Ejemplo n.º 2
0
/*
 * This function is called by the VM periodically. It has to check if
 * system has sent a signal to MIDP and return the result in the
 * structs given.
 *
 * Values for the <timeout> paramater:
 *  >0 = Block until a signal sent to MIDP, or until <timeout> milliseconds
 *       has elapsed.
 *   0 = Check the system for a signal but do not block. Return to the
 *       caller immediately regardless of the if a signal was sent.
 *  -1 = Do not timeout. Block until a signal is sent to MIDP.
 */
void checkForSystemSignal(MidpReentryData* pNewSignal,
                          MidpEvent* pNewMidpEvent,
                          jlong timeout) {

    jboolean forever = 0;
    jlong end = midp_getCurrentTime() + timeout;

    if (timeout < 0) {
        forever == 1;
    }

    do {
        /* 
         * There's no easy way in ARMulator to suspend the CPU until
         * an event is fired from the keypad. However, the profiler
         * knows about this and does not count the time spent inside
         * this function. 
         */
        int key;
        int eventCHR = *EVENT_CHAR_REG;   /* This must be read first */
        int eventType = *EVENT_TYPE_REG;  /* This must be read last */

        switch (eventType) {
        case ADS_keyDownKVMEvent:
        case ADS_keyUpKVMEvent:
            switch (eventCHR) {
            case ADS_KEY_CLEAR:
                pNewMidpEvent->type = SELECT_FOREGROUND_EVENT;
                pNewSignal->waitingFor = AMS_SIGNAL;                
                break;
            case ADS_KEY_POWER:
                pNewMidpEvent->type = SHUTDOWN_EVENT;
                pNewSignal->waitingFor = AMS_SIGNAL;
                break;              
            default:
                pNewMidpEvent->type = MIDP_KEY_EVENT;
                pNewMidpEvent->ACTION = (eventType == ADS_keyDownKVMEvent) ?
                    KEYMAP_STATE_ PRESSED : KEYMAP_STATE_RELEASED;

                switch (eventCHR) {
                case ADS_KEY_0:        key = KEYMAP_KEY_0;         break;
                case ADS_KEY_1:        key = KEYMAP_KEY_1;         break;
                case ADS_KEY_2:        key = KEYMAP_KEY_2;         break;
                case ADS_KEY_3:        key = KEYMAP_KEY_3;         break;
                case ADS_KEY_4:        key = KEYMAP_KEY_4;         break;
                case ADS_KEY_5:        key = KEYMAP_KEY_5;         break;
                case ADS_KEY_6:        key = KEYMAP_KEY_6;         break;
                case ADS_KEY_7:        key = KEYMAP_KEY_7;         break;
                case ADS_KEY_8:        key = KEYMAP_KEY_8;         break;
                case ADS_KEY_9:        key = KEYMAP_KEY_9;         break;

                case ADS_KEY_ASTERISK: key = KEYMAP_KEY_ASTERISK;  break;
                case ADS_KEY_POUND:    key = KEYMAP_KEY_POUND;     break;

                case ADS_KEY_UP:       key = KEYMAP_KEY_UP;        break;
                case ADS_KEY_DOWN:     key = KEYMAP_KEY_DOWN;      break;
                case ADS_KEY_LEFT:     key = KEYMAP_KEY_LEFT;      break;
                case ADS_KEY_RIGHT:    key = KEYMAP_KEY_RIGHT;     break;
                case ADS_KEY_SELECT:   key = KEYMAP_KEY_SELECT;    break;

                case ADS_KEY_SOFT1:    key = KEYMAP_KEY_SOFT1;     break;
                case ADS_KEY_SOFT2:    key = KEYMAP_KEY_SOFT2;     break;
                case ADS_KEY_CLEAR:    key = KEYMAP_KEY_BACKSPACE; break;

                case ADS_KEY_SEND:     key = KEYMAP_KEY_SEND;      break;
                case ADS_KEY_END:      key = KEYMAP_KEY_END;       break;
                default:               key = KEYMAP_KEY_INVALID;
                }
                pNewMidpEvent->CHR = key;
                pNewSignal->waitingFor = UI_SIGNAL;
            }
            return; /* Received one key. Let's process it. */
        default:
            break;
        }
    } while (forever || midp_getCurrentTime() < end);
}