package communication 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 { escaped := false buffer := make([]byte, 0) for { octet := <-source if escaped { switch octet { case SLIP_ESC_END: buffer = append(buffer, SLIP_END) case SLIP_ESC_ESC: buffer = append(buffer, SLIP_ESC) } } else { switch octet { case SLIP_END: break case SLIP_ESC: escaped = true continue default: buffer = append(buffer, octet) continue } break } } return buffer }