package communication import ( "log" ) const ( SLIP_END = 0xC0 SLIP_ESC = 0xDB SLIP_ESC_END = 0xDC SLIP_ESC_ESC = 0xDD SLIP_MAX_PAYLOAD = 1500 ) type dataLink struct { rx chan []byte } func newDataLink() dataLink { dl := dataLink{} dl.rx = make(chan []byte) return dl } func (dl *dataLink) start(source chan byte) { go dl.receive(source) } func (dl *dataLink) receive(source chan byte) { for { frame := unslip(source) dl.rx <- frame } } func unslip(source chan byte) []byte { buffer := make([]byte, 0) for { octet := <-source switch octet { case SLIP_ESC: escaped := <-source switch escaped { case SLIP_ESC_END: buffer = append(buffer, SLIP_END) case SLIP_ESC_ESC: buffer = append(buffer, SLIP_ESC) default: log.Printf("SLIP: Invalid 0x%x followed an escape byte", escaped) } case SLIP_END: return buffer default: buffer = append(buffer, octet) } } }