示例#1
0
        public void AddService <Argument, Result>(string topic, Func <Argument, Result> callback)
        {
            var argtype = typeof(Argument);
            var restype = typeof(Result);

            Func <object, object> converter = null;

            if (argtype == typeof(EmptySrv))
            {
                argtype   = typeof(Empty);
                converter = (object obj) => Conversions.ConvertTo((Empty)obj);
            }
            else if (argtype == typeof(SetBoolSrv))
            {
                argtype   = typeof(SetBool);
                converter = (object obj) => Conversions.ConvertTo((SetBool)obj);
            }

            Func <object, object> convertResult = null;

            if (restype == typeof(EmptySrv))
            {
                restype       = typeof(Empty);
                convertResult = (object obj) => Conversions.ConvertFrom((EmptySrv)obj);
            }
            else if (restype == typeof(SetBoolSrv))
            {
                restype       = typeof(SetBoolResponse);
                convertResult = (object obj) => Conversions.ConvertFrom((SetBoolSrv)obj);
            }
            else if (restype == typeof(TriggerSrv))
            {
                restype       = typeof(Trigger);
                convertResult = (object obj) => Conversions.ConvertFrom((TriggerSrv)obj);
            }

            var argType = GetMessageType(argtype);
            var resType = GetMessageType(restype);

            if (Services.ContainsKey(topic))
            {
                throw new Exception($"Topic {topic} already has service registered");
            }

            var sb = new StringBuilder(1024);

            sb.Append('{');
            {
                sb.Append("\"op\":\"advertise_service\",");

                sb.Append("\"type\":\"");
                sb.Append(argType);
                sb.Append("\",");

                sb.Append("\"service\":\"");
                sb.Append(topic);
                sb.Append("\"");
            }
            sb.Append('}');

            var data = sb.ToString();

            lock (Setup)
            {
                if (Status == Status.Connected)
                {
                    Socket.SendAsync(data, null);
                }
                Setup.Add(data);
            }

            lock (Services)
            {
                Services.Add(topic, Tuple.Create <Type, Type, Func <object, object> >(argtype, restype, (object argObj) => {
                    var argData = (Argument)converter(argObj);
                    var resData = callback(argData);
                    var resObj  = convertResult(resData);
                    return(resObj);
                }));
            }
        }
示例#2
0
        public void AddReader <T>(string topic, Action <T> callback) where T : class
        {
            var type = typeof(T);

            Func <JSONNode, object> converter;

            if (type == typeof(Detected3DObjectArray))
            {
                type      = typeof(Detection3DArray);
                converter = (JSONNode json) => Conversions.ConvertTo((Detection3DArray)Unserialize(json, type));
            }
            else if (type == typeof(Detected2DObjectArray))
            {
                type      = typeof(Detection2DArray);
                converter = (JSONNode json) => Conversions.ConvertTo((Detection2DArray)Unserialize(json, type));
            }
            else if (type == typeof(VehicleControlData))
            {
                if (Apollo)
                {
                    type      = typeof(Apollo.control_command);
                    converter = (JSONNode json) => Conversions.ConvertTo((Apollo.control_command)Unserialize(json, type));
                }
                else if (Version == 2)
                {
                    type      = typeof(TwistStamped);
                    converter = (JSONNode json) => Conversions.ConvertTo((TwistStamped)Unserialize(json, type));
                }
                else
                {
                    type      = typeof(Autoware.VehicleCmd);
                    converter = (JSONNode json) => Conversions.ConvertTo((Autoware.VehicleCmd)Unserialize(json, type));
                }
            }
            else
            {
                converter = (JSONNode json) => Unserialize(json, type);
            }

            var messageType = GetMessageType(type);

            var sb = new StringBuilder(1024);

            sb.Append('{');
            {
                sb.Append("\"op\":\"subscribe\",");

                sb.Append("\"topic\":\"");
                sb.Append(topic);
                sb.Append("\",");

                sb.Append("\"type\":\"");
                sb.Append(messageType);
                sb.Append("\"");
            }
            sb.Append('}');

            var data = sb.ToString();

            lock (Setup)
            {
                if (Status == Status.Connected)
                {
                    Socket.SendAsync(data, null);
                }
                Setup.Add(data);
            }

            lock (Readers)
            {
                if (!Readers.ContainsKey(topic))
                {
                    Readers.Add(topic,
                                Tuple.Create <Func <JSONNode, object>, List <Action <object> > >(
                                    msg => converter(msg),
                                    new List <Action <object> >())
                                );
                }
                Readers[topic].Item2.Add(msg => callback((T)msg));
            }
        }
示例#3
0
        public void AddReader <T>(string topic, Action <T> callback) where T : class
        {
            var type = typeof(T);

            Func <JSONNode, object> converter;

            if (type == typeof(Detected3DObjectArray))
            {
                type      = typeof(Detection3DArray);
                converter = (JSONNode json) => Conversions.ConvertTo((Detection3DArray)Unserialize(json, type));
            }
            else if (type == typeof(Detected2DObjectArray))
            {
                type      = typeof(Detection2DArray);
                converter = (JSONNode json) => Conversions.ConvertTo((Detection2DArray)Unserialize(json, type));
            }
            else if (type == typeof(VehicleControlData))
            {
                if (Apollo)
                {
                    type      = typeof(Apollo.control_command);
                    converter = (JSONNode json) => Conversions.ConvertTo((Apollo.control_command)Unserialize(json, type));
                }
                else if (Version == 2)
                {
                    // Since there is no mapping acceleration to throttle, VehicleControlCommand is not supported for now.
                    // After supporting it, VehicleControlCommand will replace RawControlCommand.
                    // type = typeof(Autoware.VehicleControlCommand);
                    // converter = (JSONNode json) => Conversions.ConvertTo((Autoware.VehicleControlCommand)Unserialize(json, type));

                    type      = typeof(Autoware.RawControlCommand);
                    converter = (JSONNode json) => Conversions.ConvertTo((Autoware.RawControlCommand)Unserialize(json, type));
                }
                else
                {
                    type      = typeof(Autoware.VehicleCmd);
                    converter = (JSONNode json) => Conversions.ConvertTo((Autoware.VehicleCmd)Unserialize(json, type));
                }
            }
            else if (type == typeof(VehicleStateData))
            {
                type      = typeof(Autoware.VehicleStateCommand);
                converter = (JSONNode json) => Conversions.ConvertTo((Autoware.VehicleStateCommand)Unserialize(json, type));
            }
            else if (BridgeConfig.bridgeConverters.ContainsKey(type))
            {
                converter = (JSONNode json) => (BridgeConfig.bridgeConverters[type] as IDataConverter <T>).GetConverter(this);
                type      = (BridgeConfig.bridgeConverters[type] as IDataConverter <T>).GetOutputType(this);
            }
            else
            {
                converter = (JSONNode json) => Unserialize(json, type);
            }

            var messageType = GetMessageType(type);

            var sb = new StringBuilder(1024);

            sb.Append('{');
            {
                sb.Append("\"op\":\"subscribe\",");

                sb.Append("\"topic\":\"");
                sb.Append(topic);
                sb.Append("\",");

                sb.Append("\"type\":\"");
                sb.Append(messageType);
                sb.Append("\"");
            }
            sb.Append('}');

            TopicSubscriptions.Add(new TopicUIData()
            {
                Topic     = topic,
                Type      = messageType,
                Frequency = 0f,
            });

            var data = sb.ToString();

            lock (Setup)
            {
                if (Status == Status.Connected)
                {
                    Socket.SendAsync(data, null);
                }
                Setup.Add(data);
            }

            lock (Readers)
            {
                if (!Readers.ContainsKey(topic))
                {
                    Readers.Add(topic,
                                Tuple.Create <Func <JSONNode, object>, List <Action <object> > >(
                                    msg => converter(msg),
                                    new List <Action <object> >())
                                );
                }
                Readers[topic].Item2.Add(msg => callback((T)msg));
            }
        }