/* 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 }
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; }
// 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); } }
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; }
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 }