示例#1
0
文件: decoder_buf.c 项目: emon/emon
/* read from socket and write to buffer */
int
decoder_buf_read(void)
{
	int             len = 0;
	int             count = 0;
	char header[PIPE_HEADER_LEN];
#define MAX_LOOP 1

#if 0
	fprintf(stderr, "decoder_buf_read\n");
#endif	
	len=0;
	memset(header, 0, PIPE_HEADER_LEN);
	while (fd_can_read(fd,1000) && count++ < MAX_LOOP) {
		if (BUFFER_NEXT(head) == tail) {	/* buffer full */
			return -1;
		}
		/* TODO:呼出す関数はfd_canでもブロックされ得る,要改良 */
		len = pipe_blocked_read_message(fd, header,dbuf[head].buf,buf_size);

#if 1
		{
			static int c=0;
			d3_printf(" (%3d): len=%d\n", c++, len);
		}
#endif
		if (len > 0) {
			dbuf[head].len = len;
			dbuf[head].ts=pipe_get_timestamp(header);
			d3_printf("     TS%8x\n",dbuf[head].ts);
			head = BUFFER_NEXT(head);
		}
#if 0
		else if (len < 0) {
			dbuf[head].len = -2;	/* end marker */
			head = BUFFER_NEXT(head);
			//sock_close();
		} else {	/* len == 0 */
			dbuf[head].len = 0;
			/* ????? */
			head = BUFFER_NEXT(head);
			break;
		}
#else
		else if(len==PIPE_END || len==PIPE_ERROR){
			len=0;
			dbuf[head].len = -1;	/* end marker */
			head = BUFFER_NEXT(head);
			break;
		}
#endif
		
	}
示例#2
0
int serial_get_event(struct wl_input_event *ev)
{
	if (BUFFER_EMPTY(console_write, console_read, console_buffer))
		return 0;

//	msg(MSG_INFO, " OUT. %d %d    %p %p\n", console_read, console_write,
//		ev, &ev->type);

	ev->type = WL_INPUT_EV_TYPE_KEYBOARD;
	if (0x7f == console_buffer[console_read]) {
		console_buffer[console_read] = 0x08;
	}
	ev->key_event.keycode = console_buffer[console_read];
	ev->key_event.value = 1;
	BUFFER_NEXT(console_read, console_buffer);

	/* Override for scrolling... */
	if ((ev->key_event.keycode == WL_KEY_PLUS) || (ev->key_event.keycode == WL_KEY_DOWN)) {
		ev->type = WL_INPUT_EV_TYPE_CURSOR;
		ev->key_event.keycode = WL_INPUT_KEY_CURSOR_DOWN;
	}
	else if ((ev->key_event.keycode == WL_KEY_MINUS) || (ev->key_event.keycode == WL_KEY_UP)) {
		ev->type = WL_INPUT_EV_TYPE_CURSOR;
		ev->key_event.keycode = WL_INPUT_KEY_CURSOR_UP;
	}

	return 1;
}
示例#3
0
// in interrupt state
void serial_filled_0(void)
{
	while (REG_EFSIF0_STATUS & RDBFx) {
		u8 c = REG_EFSIF0_RXD;
		if (c == 0)
			continue;

		console_buffer[console_write] = c;
		BUFFER_NEXT(console_write, console_buffer);
	}
}
示例#4
0
bool CTP_get(int *x, int *y, bool *pressed, unsigned long *ticks)
{
    if (BUFFER_EMPTY(CTPwrite, CTPread, CTPbuffer)) {
        return false;
    }

    *x = CTPbuffer[CTPread].x;
    *y = CTPbuffer[CTPread].y;
    *pressed = CTPbuffer[CTPread].pressed;
    *ticks = CTPbuffer[CTPread].ticks;
    BUFFER_NEXT(CTPread, CTPbuffer);
    return true;
}
示例#5
0
void CTP_interrupt(void)
{
    REG_INT_FSIF01 = FSRX1 | FSERR1; // clear the interrupt

    while (0 != (REG_EFSIF1_STATUS & RDBFx)) {
        register uint32_t c = REG_EFSIF1_RXD;

        if (0xaa == c) {
            touch_state = STATE_X_HIGH;
        } else if (0 != (0x80 & c) && (0xff != c)) {
            touch_state = STATE_WAITING;
        } else {
            switch (touch_state) {
            case STATE_WAITING:
                break;
            case STATE_X_HIGH:
                if (0xff != c) {
                    x = c << 7;
                }
                ++touch_state;
                break;
            case STATE_X_LOW:
                if (0xff != c) {
                    x |= c;
                }
                ++touch_state;
                break;
            case STATE_Y_HIGH:
                if (0xff != c) {
                    y = c << 7;
                }
                ++touch_state;
                break;
            case STATE_Y_LOW:
                if (0xff != c) {
                    y |= c;
                }
                ++touch_state;
                break;
            case STATE_TOUCH:
                if (!BUFFER_FULL(CTPwrite, CTPread, CTPbuffer)) {
                    if (0x01 == c) {
                        CTPbuffer[CTPwrite].x = x;
                        CTPbuffer[CTPwrite].y = y;
                        CTPbuffer[CTPwrite].pressed = true;
                        CTPbuffer[CTPwrite].ticks = Tick_get();
                        BUFFER_NEXT(CTPwrite, CTPbuffer);
                    } else if (0x00 == c) {
                        CTPbuffer[CTPwrite].x = x;
                        CTPbuffer[CTPwrite].y = y;
                        CTPbuffer[CTPwrite].pressed = false;
                        CTPbuffer[CTPwrite].ticks = Tick_get();
                        BUFFER_NEXT(CTPwrite, CTPbuffer);
                    }
                }
                touch_state = STATE_WAITING;
                break;
            }

        }
    }
    REG_EFSIF1_STATUS = 0; // clear errors
}