private string ParseNoMoreMessages(string inputLine, string command, IEnumerator token) { UnityEngine.Debug.Log("OCMessageHandler::ParseNoMoreMessages"); string answer = null; if (_state == READING_MESSAGES) { UnityEngine.Debug.Log("onLine: From [" + _messageFrom + "] to [" + _messageTo + "] Type [" + _messageType + "]: " + _message.ToString()); OCMessage message = OCMessage.CreateMessage(_messageFrom, _messageTo, _messageType, _message.ToString()); if (message == null) { UnityEngine.Debug.Log("Could not factory message from the following string: [" + _message.ToString() + "]"); } if (_useMessageBuffer) { UnityEngine.Debug.Log("Using message buffer..."); _messageBuffer.Add(message); _networkElement.PullMessage(_messageBuffer); _messageBuffer.Clear(); } else { UnityEngine.Debug.Log("Not using message buffer...pulling instead..."); _networkElement.PullMessage(message); } // reset variables to default values _lineCount = 0; _messageTo = ""; _messageFrom = ""; _messageType = OCMessage.MessageType.NONE; _message.Remove(0, _message.Length); _state = DOING_NOTHING; // quit reading state answer = OCNetworkElement.OK_MESSAGE; } else { UnityEngine.Debug.Log("onLine: Unexpected command [" + command + "]. Discarding line [" + inputLine + "]"); answer = OCNetworkElement.FAILED_MESSAGE; } return(answer); }
/// <summary> /// Pull a message from router. /// </summary> /// <param name="message">An unread message</param> public void PullMessage(OCMessage message) { // UnityEngine.Debug.Log ("OCNetworkElement::PullMessage(OCMessage)"); lock (_messageQueue) { // UnityEngine.Debug.Log ("Enqueueing a message (I hate this code!!)"); _messageQueue.Enqueue(message); } lock (_unreadMessagesLock) { // UnityEngine.Debug.Log ("Taking unreadMessagesCount from " + _unreadMessagesCount + " to " + (_unreadMessagesCount - 1).ToString() + "."); _unreadMessagesCount--; } }
protected bool SendMessage(OCMessage message) { string payload = message.ToString(); if (payload.Length == 0) { UnityEngine.Debug.LogError("Invalid empty command given."); return(false); } string[] lineArr = payload.Split('\n'); int numberOfLines = lineArr.Length; System.Text.StringBuilder command = new System.Text.StringBuilder("NEW_MESSAGE "); command.Append(message.SourceID + WHITESPACE); command.Append(message.TargetID + WHITESPACE); command.Append((int)message.Type + WHITESPACE); command.Append(numberOfLines + NEWLINE); command.Append(payload + NEWLINE); // if (message.Type != OCMessage.MessageType.TICK) // UnityEngine.Debug.Log ("Sending: " + command.ToString ()); bool result = Send(command.ToString()); if (result) { // UnityEngine.Debug.Log("Successful."); } else { UnityEngine.Debug.LogError("Failed to send messsage."); return(false); } return(true); }
/// <summary> /// Parse a text line from message received. /// </summary> /// <param name="inputLine"> /// The raw data that received by server socket. /// </param> /// <returns> /// An 'OK' string if the line was successfully parsed, /// a 'FAILED' string if something went wrong, /// null if there is still more to parse. /// </returns> public string parse(string inputLine) { // UnityEngine.Debug.Log("OldMessageHandler.parse(" + inputLine + ")"); string answer = null; char selector = inputLine[0]; string contents = inputLine.Substring(1); if (selector == 'c') { string[] tokenArr = contents.Split(' '); IEnumerator token = tokenArr.GetEnumerator(); token.MoveNext(); string command = token.Current.ToString(); if (command.Equals("NOTIFY_NEW_MESSAGE")) { UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "NOTIFY_NEW_MESSAGE!"); if (token.MoveNext()) // Has more elements { // Get new message number. int numberOfMessages = int.Parse(token.Current.ToString()); this.ne.NotifyNewMessages(numberOfMessages); answer = OCNetworkElement.OK_MESSAGE; UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "Notified about [" + numberOfMessages + "] messages in Router."); } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else if (command.Equals("UNAVAILABLE_ELEMENT")) { if (token.MoveNext()) // Has more elements { // Get unavalable element id. string id = token.Current.ToString(); System.Console.WriteLine(OCLogSymbol.DETAILEDINFO + "Unavailable element message received for [" + id + "]."); this.ne.MarkAsUnavailable(id); answer = OCNetworkElement.OK_MESSAGE; } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else if (command.Equals("AVAILABLE_ELEMENT")) { if (token.MoveNext()) // Has more elements { string id = token.Current.ToString(); UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "Available element message received for [" + id + "]."); this.ne.MarkAsAvailable(id); answer = OCNetworkElement.OK_MESSAGE; } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else if (command.Equals("START_MESSAGE")) // Parse a common message { if (this.state == READING_MESSAGES) { // A previous message was already read. UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "START_MESSAGE: From [" + this.currentMessageFrom + "] to [" + this.currentMessageTo + "] Type [" + this.currentMessageType + "]"); OCMessage message = OCMessage.CreateMessage(this.currentMessageFrom, this.currentMessageTo, this.currentMessageType, this.currentMessage.ToString()); if (message == null) { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Could not factory message from the following string: " + this.currentMessage.ToString()); } if (this.useMessageBuffer) { this.messageBuffer.Add(message); if (messageBuffer.Count > this.maxMessagesInBuffer) { this.ne.PullMessage(this.messageBuffer); this.messageBuffer.Clear(); } } else { this.ne.PullMessage(message); } this.lineCount = 0; this.currentMessageTo = ""; this.currentMessageFrom = ""; this.currentMessageType = OCMessage.MessageType.NONE; this.currentMessage.Remove(0, this.currentMessage.Length); } else { if (this.state == DOING_NOTHING) { // Enter reading state from idle state. this.state = READING_MESSAGES; } else { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Unexepcted command [" + command + "]. Discarding line [" + inputLine + "]"); } } if (token.MoveNext()) { this.currentMessageFrom = token.Current.ToString(); if (token.MoveNext()) { this.currentMessageTo = token.Current.ToString(); if (token.MoveNext()) { this.currentMessageType = (OCMessage.MessageType) int.Parse(token.Current.ToString()); } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else { answer = OCNetworkElement.FAILED_MESSAGE; } this.lineCount = 0; } else if (command.Equals("NO_MORE_MESSAGES")) { if (this.state == READING_MESSAGES) { // UnityEngine.Debug.Log("onLine (NO_MORE_LINES_IN_CURRENT_MESSAGE): From [" + this.currentMessageFrom + // "] to [" + this.currentMessageTo + // "] Type [" + this.currentMessageType + "]: " + this.currentMessage.ToString()); OCMessage message = OCMessage.CreateMessage(this.currentMessageFrom, this.currentMessageTo, this.currentMessageType, this.currentMessage.ToString()); if (message == null) { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Could not factory message from the following string: [" + this.currentMessage.ToString() + "]"); } if (this.useMessageBuffer) { this.messageBuffer.Add(message); this.ne.PullMessage(messageBuffer); this.messageBuffer.Clear(); } else { this.ne.PullMessage(message); } // reset variables to default values this.lineCount = 0; this.currentMessageTo = ""; this.currentMessageFrom = ""; this.currentMessageType = OCMessage.MessageType.NONE; this.currentMessage.Remove(0, this.currentMessage.Length); this.state = DOING_NOTHING; // quit reading state answer = OCNetworkElement.OK_MESSAGE; } else { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Unexpected command [" + command + "]. Discarding line [" + inputLine + "]"); answer = OCNetworkElement.FAILED_MESSAGE; } } else { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "onLine: Unexpected command [" + command + "]. Discarding line [" + inputLine + "]"); answer = OCNetworkElement.FAILED_MESSAGE; } // end processing command. } // end processing selector 'c' else if (selector == 'd') { if (this.state == READING_MESSAGES) { if (this.lineCount > 0) { this.currentMessage.Append("\n"); } this.currentMessage.Append(contents); this.lineCount++; } else { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Unexpected dataline. Discarding line [" + inputLine + "]"); answer = OCNetworkElement.FAILED_MESSAGE; } } // end processing selector 'd' else { UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Invalid selector [" + selector + "]. Discarding line [" + inputLine + "]."); answer = OCNetworkElement.FAILED_MESSAGE; } // end processing selector return(answer); }
/** * Process messages that are delivered by router, overriding the method in * NetworkElement. * * @param message A message to be handled. * * @return false if not an exit command. (this is obsolete in this unity game, but * it is OK to keep it) */ public override bool ProcessNextMessage(OCMessage message) { // UnityEngine.Debug.Log("OCConnectorSingleton::ProcessNextMessage: " + message.ToString()); if(message.Type == OCMessage.MessageType.FEEDBACK) { // e.g. we can append the information in the console. OCLogger.Error("Feedback " + message.ToString()); } else if(message.ToString().StartsWith(SUCCESS_LOAD)) { // Format: SUCCESS LOAD NetworkElement_id avatar_id char[] separator = { ' ' }; string[] tokens = message.ToString().Split(separator, System.StringSplitOptions.RemoveEmptyEntries); string neId = tokens[2]; OCLogger.Info("Successfully loaded '" + neId + "'."); _isInitialized = true; } else if(message.ToString().StartsWith(SUCCESS_UNLOAD)) { char[] separator = {' '}; string[] tokens = message.ToString().Split(separator, System.StringSplitOptions.RemoveEmptyEntries); // Format: SUCCESS UNLOAD NetworkElement_id avatar_id string neId = tokens[2]; UnityEngine.Debug.Log("!!! Successfully unloaded '" + neId + "'."); _isInitialized = false; } else { // UnityEngine.Debug.Log ("Processing an interesting message type!"); // Get the plain text of this message(in XML format) and parse it. if(_isInitialized) { // Parse the message only when oac is ready. ParseXML(message.ToString()); } } return false; }
private string ParseStartMessage(string inputLine, string command, IEnumerator token) { UnityEngine.Debug.Log("OCMessageHandler::ParseStartMessage"); string answer = null; if (_state == READING_MESSAGES) { // A previous message was already read. OCLogger.Debugging("onLine: From [" + _messageFrom + "] to [" + _messageTo + "] Type [" + _messageType + "]"); OCMessage message = OCMessage.CreateMessage(_messageFrom, _messageTo, _messageType, _message.ToString()); if (message == null) { OCLogger.Error("Could not factory message from the following string: " + _message.ToString()); } if (_useMessageBuffer) { _messageBuffer.Add(message); if (_messageBuffer.Count > _maxMessagesInBuffer) { _networkElement.PullMessage(_messageBuffer); _messageBuffer.Clear(); } } else { _networkElement.PullMessage(message); } _lineCount = 0; _messageTo = ""; _messageFrom = ""; _messageType = OCMessage.MessageType.NONE; _message.Remove(0, _message.Length); } else { if (_state == DOING_NOTHING) { // Enter reading state from idle state. _state = READING_MESSAGES; } else { OCLogger.Error("onLine: Unexepcted command [" + command + "]. Discarding line [" + inputLine + "]"); } } if (token.MoveNext()) { _messageFrom = token.Current.ToString(); if (token.MoveNext()) { _messageTo = token.Current.ToString(); if (token.MoveNext()) { _messageType = (OCMessage.MessageType) int.Parse(token.Current.ToString()); } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else { answer = OCNetworkElement.FAILED_MESSAGE; } } else { answer = OCNetworkElement.FAILED_MESSAGE; } _lineCount = 0; return(answer); }
/// <summary> /// Abstract method to be implemented by subclasses. /// </summary> /// <param name="message">OCMessage to be processed</param> /// <returns>True if the message is an "exit" command.</returns> public virtual bool ProcessNextMessage(OCMessage message) { UnityEngine.Debug.Log("OCNetworkElement::ProcessNextMessage (I DON'T WANT TO BE HERE!!)"); return(false); }
public void HandleOtherAgentActionResult(OCActionPlanStep step, bool status) { // don't report actions that game from us. // don't report actions without an action summary (these are from trying // to do non-existant actions). ///TODO: Find a different way to check for this... // if (ar.avatar == gameObject.GetComponent<Avatar>() || ar.action == null) { // //Debug.LogWarning("skipping action result from " + ar.avatar); // return; // } // the corresponding process within OpenCog's embodiment system is in PAI::processAgentActionWithParameters string timestamp = GetCurrentTimestamp(); XmlDocument doc = new XmlDocument(); XmlElement root = MakeXMLElementRoot(doc); XmlElement agentSignal = (XmlElement) root.AppendChild(doc.CreateElement("agent-signal")); agentSignal.SetAttribute("id", gameObject.GetInstanceID().ToString()); agentSignal.SetAttribute("type", OCEmbodimentXMLTags.AVATAR_OBJECT_TYPE); agentSignal.SetAttribute("timestamp", timestamp); XmlElement actionElement = (XmlElement)agentSignal.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.ACTION_ELEMENT)); // note that the name and the action-instance-name are different // ie: name = kick , while action-instance-name = kick2342 actionElement.SetAttribute("name", step.Arguments.ActionName); actionElement.SetAttribute("action-instance-name", step.Arguments.ActionName + step.ID); //bool result = (status == ActionResult.Status.SUCCESS ? true : false); actionElement.SetAttribute("result-state", status.ToString().ToLower()); //successful or failed if (step.Arguments.Source.GetInstanceID() == step.Arguments.StartTarget.GetInstanceID()) { actionElement.SetAttribute("target", _brainID); } else { actionElement.SetAttribute("target", step.Arguments.StartTarget.GetInstanceID().ToString()); } // currently we only process the avatar and ocobject type, other types in EmbodimentXMLTages can is to be added when needed. // if you add other types such as BLOCK_OBJECT_TYPE, you should also modify PAI::processAgentActionWithParameters in opencog string targetType = step.Arguments.StartTarget.tag; if (targetType == "OCA" || targetType == "Player" || targetType == "OCAGI")// it's an avatar actionElement.SetAttribute("target-type", OCEmbodimentXMLTags.AVATAR_OBJECT_TYPE); else if (targetType == "OCObject") // it's an object actionElement.SetAttribute("target-type",OCEmbodimentXMLTags.ORDINARY_OBJECT_TYPE); else Debug.LogWarning("Error target type: " + targetType + " in action: " + step.Arguments.ActionName); XmlElement param = (XmlElement)actionElement.AppendChild(doc.CreateElement("param")); if(step.Arguments.EndTarget != null) { if(step.Arguments.EndTarget.tag == "OCObject" || step.Arguments.EndTarget.tag == "Player") { param.SetAttribute("type", "entity"); param.SetAttribute("name", step.Arguments.EndTarget.name); XmlElement entityElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.ENTITY_ELEMENT)); entityElement.SetAttribute(OCEmbodimentXMLTags.ID_ATTRIBUTE, step.Arguments.EndTarget.GetInstanceID().ToString()); if(step.Arguments.EndTarget.tag == "OCObject") entityElement.SetAttribute(OCEmbodimentXMLTags.TYPE_ATTRIBUTE, OCEmbodimentXMLTags.ORDINARY_OBJECT_TYPE); else entityElement.SetAttribute(OCEmbodimentXMLTags.TYPE_ATTRIBUTE, OCEmbodimentXMLTags.AVATAR_OBJECT_TYPE); } else { UnityEngine.Vector3 vec = step.Arguments.EndTarget.transform.position; param.SetAttribute("type", "vector"); param.SetAttribute("name", "position"); XmlElement vectorElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.VECTOR_ELEMENT)); vectorElement.SetAttribute(OCEmbodimentXMLTags.X_ATTRIBUTE, vec.x.ToString()); vectorElement.SetAttribute(OCEmbodimentXMLTags.Y_ATTRIBUTE, vec.y.ToString()); vectorElement.SetAttribute(OCEmbodimentXMLTags.Z_ATTRIBUTE, vec.z.ToString()); } } // // we can only process the parameter type defined in class ActionParamType both in opencog and unity // // currently they are : boolean, int, float, string, vector, rotation, entity // // also see opencog/opencog/embodiment/control/perceptionActionInterface/BrainProxyAxon.xsd // ArrayList paramList = ar.parameters; // // if (paramList != null) // { // // int i; // if (targetType == "OCA" || targetType == "Player") // { // if (ar.action.objectID == ar.avatar.gameObject.GetInstanceID()) // i = -1; // else // i = 0; // } // else // { // i = 0; // } // // foreach (System.Object obj in paramList) // { // XmlElement param = (XmlElement)actionElement.AppendChild(doc.CreateElement("param")); // // // the first param in pinfo is usually the avator does this action, so we just skip it // string paratype = obj.GetType().ToString(); // if (paratype == "System.Int32") // it's a int // { // param.SetAttribute("type", "int"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // param.SetAttribute("value", obj.ToString()); // } // else if (paratype == "System.Single") // it's a float // { // param.SetAttribute("type", "float"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // param.SetAttribute("value", obj.ToString()); // } // else if (paratype == "System.Boolean") // it's a bool // { // param.SetAttribute("type", "boolean"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // // param.SetAttribute("value", obj.ToString().ToLower()); // } // else if (paratype == "System.String")// it's a string // { // param.SetAttribute("type", "string"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // param.SetAttribute("value", obj.ToString()); // } // // it's an entity, we only process the ActionTarget, // // if your parameter is an Entiy, please change it into ActionTarget type first // else if (paratype == "ActionTarget") // { // param.SetAttribute("type", "entity"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // XmlElement entityElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.ENTITY_ELEMENT)); // OCAction.Target entity = obj as OCAction.Target; // entityElement.SetAttribute(OCEmbodimentXMLTags.ID_ATTRIBUTE, entity.id.ToString()); // entityElement.SetAttribute(OCEmbodimentXMLTags.TYPE_ATTRIBUTE, entity.type); // // // currently it seems not use of OWNER_ID_ATTRIBUTE and OWNER_NAME_ATTRIBUTE, we just skip them // } // else if ( paratype == "UnityEngine.Vector3") // it's an vector // { // UnityEngine.Vector3 vec = (Vector3)obj ; // param.SetAttribute("type", "vector"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // XmlElement vectorElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.VECTOR_ELEMENT)); // vectorElement.SetAttribute(OCEmbodimentXMLTags.X_ATTRIBUTE, vec.x.ToString()); // vectorElement.SetAttribute(OCEmbodimentXMLTags.Y_ATTRIBUTE, vec.y.ToString()); // vectorElement.SetAttribute(OCEmbodimentXMLTags.Z_ATTRIBUTE, vec.z.ToString()); // // } // else if ( paratype == "IntVect") // it's an vector // { // Vector3i vec = (Vector3i)obj ; // param.SetAttribute("type", "vector"); // param.SetAttribute("name", ar.action.pinfo[i+1].Name); // XmlElement vectorElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.VECTOR_ELEMENT)); // vectorElement.SetAttribute(OCEmbodimentXMLTags.X_ATTRIBUTE, (vec.X + 0.5f).ToString()); // vectorElement.SetAttribute(OCEmbodimentXMLTags.Y_ATTRIBUTE, (vec.Y + 0.5f).ToString()); // vectorElement.SetAttribute(OCEmbodimentXMLTags.Z_ATTRIBUTE, (vec.Z + 0.5f).ToString()); // // } // // todo: we don't have a rotation type // else // { // // we can only process the type define in ActionParamType // continue; // } // // i++; // } // } OCMessage message = new OCMessage(_ID, _brainID, OCMessage.MessageType.STRING, BeautifyXmlText(doc)); OCLogger.Warn("sending action result from " + _ID + "\n" + BeautifyXmlText(doc)); lock (_messageSendingLock) { _messagesToSend.Add(message); } }