int putchar(int c) { #define SLIP_END 0300 static char debug_frame = 0; if(!debug_frame) { /* Start of debug output */ slip_arch_writeb(SLIP_END); slip_arch_writeb('\r'); /* Type debug line == '\r' */ debug_frame = 1; } /* Need to also print '\n' because for example COOJA will not show any output before line end */ slip_arch_writeb((char)c); /* * Line buffered output, a newline marks the end of debug output and * implicitly flushes debug output. */ if(c == '\n') { slip_arch_writeb(SLIP_END); debug_frame = 0; } return c; }
/*---------------------------------------------------------------------------*/ static int slip_putchar(char c, FILE *stream) { #define SLIP_END 0300 static char debug_frame = 0; if(!debug_frame) { /* Start of debug output */ slip_arch_writeb(SLIP_END); slip_arch_writeb('\r'); /* Type debug line == '\r' */ debug_frame = 1; } slip_arch_writeb((unsigned char)c); /* * Line buffered output, a newline marks the end of debug output and * implicitly flushes debug output. */ if(c == '\n') { slip_arch_writeb(SLIP_END); debug_frame = 0; } return c; }
/* * The serial line is used to transfer IP packets using slip. To make * it possible to send debug output over the same line we send debug * output as slip frames (i.e delimeted by SLIP_END). * */ int putchar(int c) { #define SLIP_END 0300 static char debug_frame = 0; if(!debug_frame) { /* Start of debug output */ slip_arch_writeb(SLIP_END); slip_arch_writeb('\r'); /* Type debug line == '\r' */ debug_frame = 1; } slip_arch_writeb((char)c); /* * Line buffered output, a newline marks the end of debug output and * implicitly flushes debug output. */ if(c == '\n') { slip_arch_writeb(SLIP_END); debug_frame = 0; } clock_delay(100); return c; }
//#if WITH_UIP uint8_t slip_send(void) { uint16_t i; uint8_t *ptr; uint8_t c; slip_arch_writeb(SLIP_END); ptr = &uip_buf[UIP_LLH_LEN]; for(i = 0; i < uip_len; ++i) { if(i == UIP_TCPIP_HLEN) { ptr = (uint8_t *)uip_appdata; } c = *ptr++; if(c == SLIP_END) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_END; } else if(c == SLIP_ESC) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_ESC; } slip_arch_writeb(c); } slip_arch_writeb(SLIP_END); return UIP_FW_OK; }
/*---------------------------------------------------------------------------*/ void slip_send_packet(const uint8_t *ptr, int len) { uint16_t i; uint8_t c; #if !SLIP_RADIO_CONF_NO_PUTCHAR if(slip_debug_frame) { slip_debug_frame = 0; } #endif slip_arch_writeb(SLIP_END); for(i = 0; i < len; ++i) { c = *ptr++; if(c == SLIP_END) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_END; } else if(c == SLIP_ESC) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_ESC; } slip_arch_writeb(c); } slip_arch_writeb(SLIP_END); }
/* Upper half does the polling. */ static uint16_t slip_poll_handler(uint8_t *outbuf, uint16_t blen) { /* This is a hack and won't work across buffer edge! */ #if 0 if(rxbuf[begin] == 'C') { int i; if(begin < end && (end - begin) >= 6 && memcmp(&rxbuf[begin], "CLIENT", 6) == 0) { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ memset(&rxbuf[begin], 0x0, 6); rxbuf_init(); for(i = 0; i < 13; i++) { slip_arch_writeb("CLIENTSERVER\300"[i]); } return 0; } } #endif if(rxbuf[begin] == '?' || rxbuf[begin] == '!') { // Should this characters be escaped? uint8_t tmpbuf[14]; from_slipbuffer(tmpbuf, 14); if(tmpbuf[0] == '?') { int j; char* hexchar = "0123456789abcdef"; if(tmpbuf[1] == 'M') { /* this is just a test so far... just to see if it works */ slip_arch_writeb('!'); slip_arch_writeb('M'); for(j = 0; j < LINKADDR_SIZE; j++) { slip_arch_writeb(hexchar[linkaddr_node_addr.u8[j] >> 4]); slip_arch_writeb(hexchar[linkaddr_node_addr.u8[j] & 15]); } slip_arch_writeb(SLIP_END); return 0; }
/* Upper half does the polling. */ static uint16_t slip_poll_handler(uint8_t *outbuf, uint16_t blen) { /* This is a hack and won't work across buffer edge! */ if(rxbuf[begin] == 'C') { int i; if(begin < end && (end - begin) >= 6 && memcmp(&rxbuf[begin], "CLIENT", 6) == 0) { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ memset(&rxbuf[begin], 0x0, 6); rxbuf_init(); for(i = 0; i < 13; i++) { slip_arch_writeb("CLIENTSERVER\300"[i]); } return 0; } } #ifdef SLIP_CONF_ANSWER_MAC_REQUEST else if(rxbuf[begin] == '?') { /* Used by tapslip6 to request mac for auto configure */ int i, j; char* hexchar = "0123456789abcdef"; if(begin < end && (end - begin) >= 2 && rxbuf[begin + 1] == 'M') { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ rxbuf[begin] = 0; rxbuf[begin + 1] = 0; rxbuf_init(); rimeaddr_t addr = get_mac_addr(); /* this is just a test so far... just to see if it works */ slip_arch_writeb('!'); slip_arch_writeb('M'); for(j = 0; j < 8; j++) { slip_arch_writeb(hexchar[addr.u8[j] >> 4]); slip_arch_writeb(hexchar[addr.u8[j] & 15]); } slip_arch_writeb(SLIP_END); return 0; }
/*---------------------------------------------------------------------------*/ void slip_send_packet(const uint8_t *ptr, int len) { uint16_t i; uint8_t c; slip_arch_writeb(SLIP_END); for(i = 0; i < len; ++i) { c = *ptr++; if(c == SLIP_END) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_END; } else if(c == SLIP_ESC) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_ESC; } slip_arch_writeb(c); } slip_arch_writeb(SLIP_END); }
/*---------------------------------------------------------------------------*/ void slip_radio_cmd_output(const uint8_t *data, int data_len) { #if !SLIP_RADIO_CONF_NO_PUTCHAR if(slip_debug_frame) { slip_arch_writeb(SLIP_END); slip_debug_frame = 0; } #endif slip_send_packet(data, data_len); }
/* Upper half does the polling. */ static uint16_t slip_poll_handler(uint8_t *outbuf, uint16_t blen) { /* This is a hack and won't work across buffer edge! */ if(rxbuf[begin] == 'C') { int i; if(begin < end && (end - begin) >= 6 && memcmp(&rxbuf[begin], "CLIENT", 6) == 0) { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ memset(&rxbuf[begin], 0x0, 6); rxbuf_init(); for(i = 0; i < 13; i++) { slip_arch_writeb("CLIENTSERVER\300"[i]); } return 0; } } else if(rxbuf[begin] == '?') { int j; char* hexchar = "0123456789abcdef"; if(begin < end && (end - begin) >= 2 && rxbuf[begin + 1] == 'M') { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ rxbuf[begin] = 0; rxbuf[begin + 1] = 0; rxbuf_init(); /* this is just a test so far... just to see if it works */ slip_arch_writeb('!'); slip_arch_writeb('M'); for(j = 0; j < 8; j++) { slip_arch_writeb(hexchar[ds2411_id.raw[j] >> 4]); slip_arch_writeb(hexchar[ds2411_id.raw[j] & 15]); } slip_arch_writeb(SLIP_END); return 0; }
/*---------------------------------------------------------------------------*/ uint8_t slip_write(const void *_ptr, int len) { const uint8_t *ptr = _ptr; uint16_t i; uint8_t c; slip_arch_writeb(SLIP_END); for(i = 0; i < len; ++i) { c = *ptr++; if(c == SLIP_END) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_END; } else if(c == SLIP_ESC) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_ESC; } slip_arch_writeb(c); } slip_arch_writeb(SLIP_END); return len; }
/* Upper half does the polling. */ static u16_t slip_poll_handler(u8_t *outbuf, u16_t blen) { /* This is a hack and won't work across buffer edge! */ if(rxbuf[begin] == 'C') { int i; if(begin < end && (end - begin) >= 6 && memcmp(&rxbuf[begin], "CLIENT", 6) == 0) { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ memset(&rxbuf[begin], 0x0, 6); rxbuf_init(); for(i = 0; i < 13; i++) { slip_arch_writeb("CLIENTSERVER\300"[i]); } return 0; } } /* * Interrupt can not change begin but may change pkt_end. * If pkt_end != begin it will not change again. */ if(begin != pkt_end) { u16_t len; if(begin < pkt_end) { len = pkt_end - begin; if(len > blen) { len = 0; } else { memcpy(outbuf, &rxbuf[begin], len); } } else { len = (RX_BUFSIZE - begin) + (pkt_end - 0); if(len > blen) { len = 0; } else { unsigned i; for(i = begin; i < RX_BUFSIZE; i++) { *outbuf++ = rxbuf[i]; } for(i = 0; i < pkt_end; i++) { *outbuf++ = rxbuf[i]; } } } /* Remove data from buffer together with the copied packet. */ begin = pkt_end; if(state == STATE_TWOPACKETS) { pkt_end = end; state = STATE_OK; /* Assume no bytes where lost! */ /* One more packet is buffered, need to be polled again! */ process_poll(&slip_process); } return len; } return 0; }
int UART_out(char out){ slip_arch_writeb(out); return 1; }
/*---------------------------------------------------------------------------*/ uint8_t slip_write(const void *_ptr, int len) { const uint8_t *ptr = _ptr; uint16_t i; uint8_t c; #if 0 //ndef GREENTAG slip_arch_writeb(SLIP_END); slip_arch_writeb('S'); slip_arch_writeb('N'); slip_arch_writeb('I'); slip_arch_writeb('F'); slip_arch_writeb('F'); #endif slip_arch_writeb(SLIP_END); for(i = 0; i < len; ++i) { c = *ptr++; if(c == SLIP_END) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_END; } else if(c == SLIP_ESC) { slip_arch_writeb(SLIP_ESC); c = SLIP_ESC_ESC; } slip_arch_writeb(c); } slip_arch_writeb(SLIP_END); return len; }