private void SetValue(STVar st, byte[] data) { object o; switch(st.dateType) { case 'z': o=(data[1]!=0); break; case 'b': o=(long)(sbyte)data[1]; break; case 'B': o=(long)data[1]; break; case 'w': o=(long)(short)((data[2]<<8) | data[1]); break; case 'W': o=(long)(ushort)((data[2]<<8) | data[1]); break; case 'd': o=(long)(int)((data[4]<<24) | (data[3]<<16) | (data[2]<<8) | data[1]); break; case 'D': o=(long)(uint)((data[4]<<24) | (data[3]<<16) | (data[2]<<8) | data[1]); break; case 'q': o=(long)((data[8]<<56) | (data[7]<<48) | (data[6]<<40) | (data[5]<<32) | (data[4]<<24) | (data[3]<<16) | (data[2]<<8) | data[1]); break; case 's': o=Encoding.Default.GetString(data, 1, data.Length-1); break; case 'a': o=new PLC.ByteArray(data.Skip(1).ToArray()); break; default: return; } st.ptr.SetValue(o, new TopicChanged(TopicChanged.ChangeArt.Value, _owner)); }
//TODO: Unsubscribe private void SetValue(TopicInfo ti, byte[] msgData) { if(ti!=null) { if(!ti.path.StartsWith(Owner.path)) { return; // not allow publish } object val; switch(Type.GetTypeCode(ti.topic.valueType)) { case TypeCode.Boolean: val=(msgData[0]!=0); break; case TypeCode.Int64: { long rv=(msgData[msgData.Length-1]&0x80)==0?0:-1; for(int i=msgData.Length-1; i>=0; i--) { rv<<=8; rv|=msgData[i]; } val=rv; //Log.Debug("{0}={1}, {2}", ti.path, rv, BitConverter.ToString(msgData)); } break; case TypeCode.String: val=Encoding.Default.GetString(msgData); break; case TypeCode.Object: if(ti.topic.valueType==typeof(PLC.ByteArray)) { val=new PLC.ByteArray(msgData); break; } else if(ti.topic.valueType==typeof(SmartTwi)) { var sa=(ti.topic.GetValue() as SmartTwi); if(sa==null) { sa=new SmartTwi(ti.topic); sa.Recv(msgData); val=sa; } else { sa.Recv(msgData); return; } break; } else { return; } default: return; } ti.topic.SetValue(val, new TopicChanged(TopicChanged.ChangeArt.Value, Owner)); } }