using System;
using System.Collections.Generic;
using ORiN2.ManagedCAO;
namespace MurataWirelessGatewaySample
{
///
/// 温湿度計の測定情報を画面に表示するプログラム
///
class Program
{
///
/// メイン処理
///
///
static void Main(string[] args)
{
try
{
// CONN=に続くオプションを入力させる
string option = "CONN=";
Console.Write(option);
option += Console.ReadLine();
// CaoEngineの作成
// usingで囲うとスコープから抜けたときに自動的にDisposeが実行されて解放される
using (CCaoEngine engine = new CCaoEngine())
{
// CaoControllerの作成
// engine.Workspaces[0] は自動的に生成される
CCaoController controller = engine.Workspaces[0].AddController("Gateway", "CaoProv.Murata.WirelessGateway", null, option);
// OnMessageイベントハンドラの登録
controller.OnMessage += Controller_OnMessage;
Console.WriteLine("Hit any key to exit.");
Console.ReadKey();
// OnMessageイベントハンドラの解除
controller.OnMessage -= Controller_OnMessage;
}
}
catch(Exception ex)
{
// 例外の内容をコンソールに出力
Console.WriteLine(ex);
}
}
///
/// メッセージ処理関数
///
/// 送信元のオブジェクト
/// イベント引数
private static void Controller_OnMessage(object sender, OnMessageEventArgs e)
{
try
{
object[] values = e.Message.Value as object[];
// 目的以外のメッセージは処理しない
if (e.Message.Number != 0
|| values == null
|| values.Length != 5)
{
Console.WriteLine("invalid message.");
return;
}
switch (Convert.ToByte(values[2]))
{
case 0x01:
ShowTempAndHumidity(values);
break;
case 0x09:
ShowVibration(values);
break;
case 0x12:
ShowCT(values);
break;
case 0x10:
ShowCurrentPulse(values);
break;
case 0x18:
ShowVibrationSpeed(values);
break;
default:
Console.WriteLine("Not suported");
break;
}
}
catch (Exception ex)
{
// 例外の内容をコンソールに出力
Console.WriteLine(ex);
}
}
static void ShowTempAndHumidity(object[] values)
{
ViewData(values, "温湿度", new string[] { "電源電圧", "温度", "湿度" });
}
static void ShowVibration(object[] values)
{
ViewData(values, "振動", new string[]
{
"電源電圧",
"ピーク周波数1", "ピーク加速度1",
"ピーク周波数2", "ピーク加速度2",
"ピーク周波数3", "ピーク加速度3",
"ピーク周波数4", "ピーク加速度4",
"ピーク周波数5", "ピーク加速度5",
"加速度RMS", "尖り度", "温度"
});
}
static void ShowCT(object[] values)
{
ViewData(values, "CT", new string[] { "電源電圧", "カウンタ", "電流1", "電流2", "借電", "前回電流1", "前回電流2", "前回借電" });
}
static void ShowCurrentPulse(object[] values)
{
ViewData(values, "電流・パルス", new string[] { "電源電圧", "カウンタ", "電流", "パルスカウント", "前回電流", "前回パルスカウント" });
}
static void ShowVibrationSpeed(object[] values)
{
ViewData(values, "振動(速度)", new string[]
{
"電源電圧",
"ピーク周波数1", "ピーク加速度1",
"ピーク周波数2", "ピーク加速度2",
"加速度RMS",
"速度ピーク周波数1", "ピーク速度1",
"速度ピーク周波数2", "ピーク速度2",
"速度ピーク周波数3", "ピーク速度3",
"速度RMS", "尖り度", "温度"
});
}
static void ViewData(object[] values, string sensorType, string[] headers)
{
ushort sensorId = Convert.ToUInt16(values[0]);
short rssi = Convert.ToInt16(values[1]);
byte sensorTypeId = Convert.ToByte(values[2]);
object[] sensorValues = values[3] as object[];
byte[] unitValues = values[4] as byte[];
if (sensorValues == null || unitValues == null || headers.Length != sensorValues.Length || headers.Length != unitValues.Length)
{
Console.WriteLine("invalid message.");
return;
}
List displayValues = new List();
displayValues.Add($"sensorId:{sensorId:X4}");
displayValues.Add($"rssi:{rssi}");
displayValues.Add($"sensorType:{sensorTypeId:X2}");
for (int i = 0; i < headers.Length; i++)
{
displayValues.Add($"{headers[i]}:{sensorValues[i]}{unitMap[unitValues[i]]}");
}
Console.WriteLine($"{sensorType}: {string.Join(", ", displayValues)}");
}
static readonly Dictionary unitMap = new Dictionary()
{
{0x01, "%"},
{0x02, "Pa"},
{0x03, ""},
{0x04, ""},
{0x05, "H"},
{0x06, "J"},
{0x07, "Time"},
{0x08, "rad/s2"},
{0x09, "m2/s"},
{0x0A, "rad/s"},
{0x0B, "°"},
{0x0C, "m/s2"},
{0x0D, "cd/m2"},
{0x0E, "Gy"},
{0x0F, "Gy/s"},
{0x10, "-"},
{0x11, "kat"},
{0x12, "kat/m3"},
{0x13, "lm"},
{0x14, "cd"},
{0x15, "S"},
{0x16, "Byte"},
{0x17, "A/m"},
{0x18, "sec"},
{0x19, "Hour"},
{0x1A, "minute"},
{0x1B, "second"},
{0x1C, "millsecond"},
{0x1D, "W"},
{0x1E, "Wb"},
{0x1F, "T"},
{0x20, "kg"},
{0x21, "m2/kg"},
{0x22, "kg/m3"},
{0x23, "mol/kg"},
{0x24, "kg/s"},
{0x25, "kg/m2・s"},
{0x26, "Hz"},
{0x27, "C/kg"},
{0x28, "lx"},
{0x29, "-"},
{0x2A, "℃"},
{0x2B, "Sv"},
{0x2C, "%RH"},
{0x2D, "m3"},
{0x2E, "J/m3"},
{0x2F, "m3/s"},
{0x30, "N"},
{0x31, "N・m"},
{0x32, "V"},
{0x33, "C"},
{0x34, "V/m"},
{0x35, "C/m3"},
{0x36, "ohm"},
{0x37, "F"},
{0x38, "C/m2"},
{0x39, "A"},
{0x3A, "A/m2"},
{0x3B, "kWh"},
{0x3C, "H/m"},
{0x3D, "S/m"},
{0x3E, "m2/s"},
{0x3F, "m"},
{0x40, "kW/m2"},
{0x41, "W/(m・K)"},
{0x42, "J/K"},
{0x43, "K"},
{0x44, "W/m2"},
{0x45, "Pa・s"},
{0x46, "ppm"},
{0x47, "m-1"},
{0x48, "m/s"},
{0x49, "J/kg"},
{0x4A, "-"},
{0x4B, "J/(kg・K)"},
{0x4C, "m3/kg"},
{0x4D, "N/m"},
{0x4E, "C/m2"},
{0x4F, "mol"},
{0x50, "rad"},
{0x51, "W/(m2・sr)"},
{0x52, "W/sr"},
{0x53, "Bq"},
{0x54, "kg/m3"},
{0x55, "m2"},
{0x56, "kg/m2"},
{0x57, "J/mol"},
{0x58, "J/(mol・K)"},
{0x59, "m3/mol"},
{0x5A, "S・m2/mol"},
{0x5B, "F/m"},
{0x5C, "N・s"},
{0x5D, "sr"},
{0x5E, "mol/m3"},
{0x5F, "uSv"},
{0x60, "-"},
{0x61, "-"},
{0x62, "mA"},
{0x63, "m/s2"},
{0x64, "hPa"},
{0x65, "-"},
{0x66, "-"},
{0x68, "-"},
{0x69, "W"},
{0x6A, "L/min"},
{0x6B, "L"},
{0x71, "rad"},
{0x72, "mm/s"},
{0x73, "mm"},
{0x74, "mm/s"},
{0xFA, "-"},
{0xFE, "-"},
{0xFF, "-"}
};
}
}