//发送循环
func (r *Robot) SendLoop() {
	defer r.Close()
	elog.LogDebug(" robot %d  send  loop run  ", r.id)
	for {
		select {
		case msg := <-r.sendCh: //从发送通道取出待发送消息
			elog.LogInfo("  encode  msg :%d ", msg.id)
			binary.Write(r.sendBuf, binary.LittleEndian, msg.id)   //写ID
			binary.Write(r.sendBuf, binary.LittleEndian, msg.Data) //写数据
			byte := r.sendBuf.Bytes()
			n, err := r.tcpConn.Write(byte)
			if err != nil {
				elog.LogSysln(" conn ", r.id, " write data fail :", err)
				return
			}

			elog.LogInfo(" write  msg :%d ", n, hex.Dump(r.sendBuf.Bytes()))
		case <-r.closeCh: //机器人关闭信号
			elog.LogDebug(" send loop begin close ")
			return
		}
	}

	elog.LogDebug("send loop close  ")
}
//关闭机器人
func (r *Robot) Close() {

	if atomic.CompareAndSwapUint32(&r.state, kRobotActive, kRobotClose) { //如果状态为active,则返回true,并且设置状态为close
		r.delCh <- r.id  //这里告诉机器人管理器删除机器人
		close(r.closeCh) //通知关闭机器人
		elog.LogInfo(" robot:%d close ", r.id)
		r.ticker.Stop()   //关闭时钟
		r.tcpConn.Close() //关闭连接
	}
}
//接收消息
func (r *Robot) RecvMsg() (msg Message, err error) {
	select {
	case msg = <-r.recvCh: //从接收通道取出待接收消息
		elog.LogInfo("receieve msg :%s ", msg.id)
		err = nil
		return
	default:
	}
	err = errors.New(" not msg ")
	return
}
func main() {

	elog.InitLog(elog.INFO)
	elog.LogInfo(" --------------------- let go ------------------------")
	robotMng := robot.NewRobotMng() //创建机器人管理器
	robotMng.SetUpdateCb(process)   //设置更新回调
	robotMng.Run()                  //启动机器人管理器
	//系统退出信号处理
	ch := make(chan os.Signal)
	signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
	<-ch
	robotMng.Close() //关闭机器人管理器
}
//发送消息
func (r *Robot) SendMsg(msg Message) {
	r.sendCh <- msg //发送到通道
	elog.LogInfo(" send  msg : ", msg.id)
}