示例#1
0
 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));
 }
示例#2
0
 //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));
   }
 }