void LEUART0_IRQHandler(void) { if (LEUART0->IF & LEUART_IF_RXDATAV) { uint8_t data = LEUART0->RXDATA; buf_write_byte(leu_rx_buf, data); if (leu_rx_buf->count == 0) LEUART0->IEN &= ~ LEUART_IEN_RXDATAV; // disable rx interrupt } if (LEUART0->IF & LEUART_IF_TXBL) { uint8_t data; if (buf_read_byte(leu_tx_buf, & data)) { while (LEUART0->SYNCBUSY) ; LEUART0->TXDATA = data; } else LEUART0->IEN &= ~ LEUART_IEN_TXBL; // disable tx interrupt } // XXX do we need to explicitly clear interrupts? //LEUART_IntClear(LEUART0, ???); }
int buf_vpack(Buf *self, char *fmt, va_list ap) { char *s; char *p; uint8_t u8; uint16_t u16; uint32_t u32; size_t len; int res; int bytes = 0; for (p = fmt; *p != '\0'; p++) { switch(*p) { case 'b': /* char */ u8 = va_arg(ap, int); res = buf_write_byte(self, u8); break; case 'h': /* short */ u16 = va_arg(ap, int); res = buf_write_short(self, u16); break; case 'u': /* uint */ u32 = va_arg(ap, uint32_t); res = buf_write_uint(self, u32); break; case 's': /* string */ s = va_arg(ap, char*); len = va_arg(ap, size_t); res = buf_write_string(self, s, len); break; case 'd': /* data */ s = va_arg(ap, char*); len = va_arg(ap, size_t); res = buf_write_data(self, s, len); break; default: /* illegal format */ res = -1; } if (res == -1) { return -1; } bytes += res; } return bytes; }
bool buf_write_char(buf_t *buf, const char c) { return buf_write_byte(buf, (uint8_t) c); }