sample C#
String PalSerialDataToString(String dataText)
{
System.Text.StringBuilder resultStr = new System.Text.StringBuilder(1024);
try
{
// dataText の文字列をバイト列に変換し、末尾を 0xD で終端する。
Byte[] b1 = System.Text.Encoding.ASCII.GetBytes(dataText);
Byte[] b2 = new byte[b1.Length + 1];
for(int i = 0; i < b1.Length + 1; i++)
{
if (i < b1.Length && b1[i] >= 0x20) b2[i] = b1[i];
else b2[i] = 0x0d;
}
// データの解釈
ITweDataPresentation dataArrival = PAL_Utils.genDataPresentation(ref b2);
// Pal形式の共通ヘッダオブジェクトの取得(ObjFormatが他の型の場合は例外)
ClsDataFormatPalApp dataFmt = (ClsDataFormatPalApp)dataArrival.ObjFormat;
// Pal形式のセンサー部オブジェクトの取得(objPayloadが他の方の場合例外)
ClsDataPayloadPalSensors dataPay = (ClsDataPayloadPalSensors)dataFmt.objPayload;
// PAL PCB 形式
int iPalPcb_CD = (int)dataFmt.BPalPcb & 0xf;
if (iPalPcb_CD > astrPalPcbNames.Length) iPalPcb_CD = -1; //範囲外は-1
string sPalPcb_Name = (iPalPcb_CD >= 0) ? astrPalPcbNames[iPalPcb_CD] : "UNKNOWN";
resultStr.Append(sPalPcb_Name);
resultStr.Append("/ad=");
resultStr.Append(Convert.ToString(dataFmt.UiSrcAddr, 16));
resultStr.Append(",");
resultStr.Append(dataFmt.BSrcAddr.ToString());
resultStr.Append("/lq=");
resultStr.Append(dataFmt.BLQI.ToString());
// 電圧
int iVolt = 0;
foreach(ClsDataPalSenseElement m in dataPay.SensorCode((uint)ClsDataPalSenseElement.E_SNSCD.VOLT))
{
// 拡張バイトによる判定
if((byte)(m.Ex) == (byte)ClsDataPalSenseElement.E_EXCD_VOLT.POWER) // ライブラリの戻し型が object になっているため byte にキャスト
{
if (m.Data is ushort[])
{
iVolt = ((ushort[])m.Data)[0];
}
}
}
resultStr.Append(",V=");
resultStr.Append(iVolt.ToString());
resultStr.Append("|");
//磁気センサー
uint uMagPol = 0;
bool bMagSense = false;
foreach (ClsDataPalSenseElement m in dataPay.SensorCode((uint)ClsDataPalSenseElement.E_SNSCD.HALL))
{
if (m.Data is byte[])
{
uint v = ((byte[])m.Data)[0];
uMagPol = (v & 0b11);
bMagSense = (v & 0x80) == 0x80 ? false : true; // false:定期送信 true:磁界の変化を検出
}
string strMagPol = "?";
switch(uMagPol)
{
case 0: strMagPol = "-"; break; // 磁石が遠く
case 1: strMagPol = "N"; break; // N極が近く
case 2: strMagPol = "S"; break; // S極が近く
}
resultStr.Append("MAG=");
if (bMagSense) resultStr.Append("!");
resultStr.Append(strMagPol);
resultStr.Append("|");
}
// MOT or CUE
if (iPalPcb_CD ==3 || iPalPcb_CD == 5)
{
const uint MAX_ENT_TABLE = 32;
short[] x = new short[MAX_ENT_TABLE]; // x,y,z各軸のデータとして一時格納
short[] y = new short[MAX_ENT_TABLE];
short[] z = new short[MAX_ENT_TABLE];
uint ent_max = 0; // 格納された最大エントリ番号(格納数は固定ではない場合があります)
foreach (ClsDataPalSenseElement m in dataPay.SensorCode((uint)ClsDataPalSenseElement.E_SNSCD.ACCEL))
{
uint ent = (uint)((byte)m.Ex & 0xF);
if (ent == 0 || ent > MAX_ENT_TABLE) continue; // not expected
if (ent > ent_max) ent_max = ent; // update ent_max
if (m.Data is short[]) // should be short[]
{
short[] v = (short[])m.Data;
x[ent - 1] = v[0];
y[ent - 1] = v[1];
z[ent - 1] = v[2];
}
}
// 結果文字列へ格納
for (int i = 1; i <= ent_max; i++)
{
resultStr.Append("(");
resultStr.Append(x[i].ToString());
resultStr.Append(",");
resultStr.Append(y[i].ToString());
resultStr.Append(",");
resultStr.Append(z[i].ToString());
resultStr.Append(")");
}
}
// AMB or ARIA
if (iPalPcb_CD == 2 || iPalPcb_CD == 6)
{
Double fTemp = 0.0, fHumid = 0.0;
// 温度データ (℃の100倍、符号あり16bit)
foreach (ClsDataPalSenseElement m in dataPay.SensorCode((uint)ClsDataPalSenseElement.E_SNSCD.TEMP))
{
if (m.Data is short[])
{
short[] v = (short[])m.Data;
fTemp = (Double)v[0] / 100.0;
}
}
// 温度データ (%の100倍、符号なし16bit)
foreach (ClsDataPalSenseElement m in dataPay.SensorCode((uint)ClsDataPalSenseElement.E_SNSCD.HUMD))
{
if (m.Data is ushort[])
{
ushort[] v = (ushort[])m.Data;
fHumid = (Double)v[0] / 100.0;
}
}
resultStr.Append("T=");
resultStr.Append(fTemp.ToString());
resultStr.Append("H=");
resultStr.Append(fHumid.ToString());
}
}
catch (Exception ex)
{
}
return resultStr.ToString();
}
}
最終更新