Added CodeStatus models

This commit is contained in:
Ben Menking
2026-05-30 00:16:44 -04:00
parent 0b8e34832e
commit 5b17682e09
4 changed files with 107 additions and 52 deletions
+67 -52
View File
@@ -15,6 +15,9 @@ use Menking\Meshcore\Model\ErrorResponse;
use Menking\Meshcore\Model\LoginResponse; use Menking\Meshcore\Model\LoginResponse;
use Menking\Meshcore\Model\LogReceiveResponse; use Menking\Meshcore\Model\LogReceiveResponse;
use Menking\Meshcore\Model\BatteryStorageResponse; use Menking\Meshcore\Model\BatteryStorageResponse;
use Menking\Meshcore\Model\CodeStatusTypeCoreResponse;
use Menking\Meshcore\Model\CodeStatusTypePacketResponse;
use Menking\Meshcore\Model\CodeStatusTypeRadioResponse;
use Menking\Meshcore\Model\ContactResponse; use Menking\Meshcore\Model\ContactResponse;
use Menking\Meshcore\Model\ContactsFullResponse; use Menking\Meshcore\Model\ContactsFullResponse;
use Menking\Meshcore\Model\MessageResponse; use Menking\Meshcore\Model\MessageResponse;
@@ -376,57 +379,74 @@ class CoreParser {
return $m; return $m;
} }
public static function parseCodeStatusResponse(string $payload) { /**
$info = [ *
'code'=>ord($payload[0]), * @param string $payload
'type'=>ord($payload[1]), * @return CodeStatusTypeCoreResponse|CodeStatusTypeRadioResponse|CodeStatusTypePacketResponse
]; */
public static function parseCodeStatusResponse(string $payload): CodeStatusTypeCoreResponse|CodeStatusTypeRadioResponse|CodeStatusTypePacketResponse {
$m = null;
switch($info['type']) { switch(ord($payload[1])) {
case CoreProtocol::STATS_TYPE_CORE: case CoreProtocol::STATS_TYPE_CORE:
$info['battery_mv'] = unpack('v', substr($payload, 2, 2))[1]; $m = new CodeStatusTypeCoreResponse();
$info['uptime_secs'] = unpack('V', substr($payload, 4, 4))[1]; $m->code = ord($payload[0]);
$info['err_flags'] = unpack('v', substr($payload, 8, 2))[1]; $m->battery_mv = unpack('v', substr($payload, 2, 2))[1];
$info['queue_len'] = ord($payload[10]); $m->uptime_secs = unpack('V', substr($payload, 4, 4))[1];
$m->err_flags = unpack('v', substr($payload, 8, 2))[1];
$m->queue_len = ord($payload[10]);
break; break;
case CoreProtocol::STATS_TYPE_RADIO: case CoreProtocol::STATS_TYPE_RADIO:
$info['noise_floor'] = unpack('v', substr($payload, 2, 2))[1]; $m = new CodeStatusTypeRadioResponse();
$info['last_rssi'] = (ord($payload[4]) >= 128) ? (ord($payload[4]) - 256): ord($payload[4]); $m->code = ord($payload[0]);
$info['last_snr'] = ord($payload[5]); $m->noise_floor = unpack('v', substr($payload, 2, 2))[1];
$info['tx_air_secs'] = unpack('V', substr($payload, 6, 4))[1]; $m->last_rssi = (ord($payload[4]) >= 128) ? (ord($payload[4]) - 256): ord($payload[4]);
$info['rx_air_secs'] = unpack('V', substr($payload, 10, 4))[1]; $m->last_snr = ord($payload[5]);;
$m->tx_air_secs = unpack('V', substr($payload, 6, 4))[1];
$m->rx_air_secs = unpack('V', substr($payload, 10, 4))[1];
break; break;
case CoreProtocol::STATS_TYPE_PACKETS: case CoreProtocol::STATS_TYPE_PACKETS:
$info['recv'] = unpack('V', substr($payload, 2, 4))[1]; $m = new CodeStatusTypePacketResponse();
$info['sent'] = unpack('V', substr($payload, 6, 4))[1]; $m->code = ord($payload[0]);
$info['n_sent_flood'] = unpack('V', substr($payload, 10, 4))[1]; $m->recv = unpack('V', substr($payload, 2, 4))[1];
$info['n_sent_direct'] = unpack('V', substr($payload, 14, 4))[1]; $m->sent = unpack('V', substr($payload, 6, 4))[1];
$info['n_recv_flood'] = unpack('V', substr($payload, 18, 4))[1]; $m->n_sent_flood = unpack('V', substr($payload, 10, 4))[1];
$info['n_recv_direct'] = unpack('V', substr($payload, 22, 4))[1]; $m->n_sent_direct = unpack('V', substr($payload, 14, 4))[1];
$info['n_rec_errors'] = unpack('V', substr($payload, 26, 4))[1]; $m->n_recv_flood = unpack('V', substr($payload, 18, 4))[1];
$m->n_recv_direct = unpack('V', substr($payload, 22, 4))[1];
$m->n_recv_errors = unpack('V', substr($payload, 26, 4))[1];
break; break;
} }
return $info; return $m;
} }
public static function parseDeviceInfoResponse(string $payload) { /**
$info = [ *
'code'=>ord($payload[0]), * @param string $payload
'fw_ver_code'=>ord($payload[1]), * @return DeviceInfoResponse
'max_contacts'=>ord($payload[2]) * 2, */
'max_group_channels'=>ord($payload[3]), public static function parseDeviceInfoResponse(string $payload): DeviceInfoResponse {
'ble_pin'=>unpack('V', substr($payload, 4, 4))[1], $m = new DeviceInfoResponse();
'fw_build_date'=>trim(substr($payload, 8, 12)), $m->code = ord($payload[0]);
'manufacturer_name'=>trim(substr($payload, 20, 40)), $m->firmware_version = ord($payload[1]);
'fw_version'=>trim(substr($payload, 60, 20)), $m->max_contacts_raw = ord($payload[2]) * 2;
'client_repeat'=>ord($payload[80]), $m->max_channels = ord($payload[3]);
'path_hash_mode'=>ord($payload[81]) $m->ble_pin = unpack('V', substr($payload, 4, 4))[1];
]; $m->firmware_build = trim(substr($payload, 8, 12));
$m->model = trim(substr($payload, 20, 40));
$m->version =trim(substr($payload, 60, 20));
$m->client_repeat_enabled = ord($payload[80]);
$m->path_hash_mode = ord($payload[81]);
return $info; return $m;
} }
/**
*
* @param string $payload
* @return ChannelResponse
*/
public static function parseChannelInfoResponse(string $payload): ChannelResponse { public static function parseChannelInfoResponse(string $payload): ChannelResponse {
$m = new ChannelResponse(); $m = new ChannelResponse();
@@ -438,21 +458,11 @@ class CoreParser {
return $m; return $m;
} }
/* /**
public static function parseMessage(string $payload) { *
$data = [ * @param mixed $str
'code'=>ord($payload[0]), * @return null|string
'channel_idx'=>ord($payload[1]), */
'path_len'=>ord($payload[2]),
'type'=>ord($payload[3]),
'timestamp'=>date('r', unpack('V', substr($payload, 4, 4))[1]),
'message'=>substr($payload, 8, strlen($payload))
];
return $data;
}
*/
public static function readCstring($str) { public static function readCstring($str) {
$x = strpos($str, "\0"); $x = strpos($str, "\0");
@@ -464,6 +474,11 @@ class CoreParser {
} }
} }
/**
*
* @param string $pubkey
* @return string
*/
public static function formatPublicKey(string $pubkey): string { public static function formatPublicKey(string $pubkey): string {
return bin2hex($pubkey); return bin2hex($pubkey);
} }
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace Menking\Meshcore\Model;
class CodeStatusTypeCoreResponse extends Response {
public int $code;
public int $battery_mv;
public int $uptime_secs;
public int $err_flags;
public int $queue_len;
}
@@ -0,0 +1,15 @@
<?php
namespace Menking\Meshcore\Model;
class CodeStatusTypePacketResponse extends Response {
public int $code;
public int $recv;
public int $sent;
public int $n_sent_flood;
public int $n_sent_direct;
public int $n_recv_flood;
public int $n_recv_direct;
public int $n_recv_errors;
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace Menking\Meshcore\Model;
class CodeStatusTypeRadioResponse extends Response {
public int $code;
public int $noise_floor;
public int $last_rssi;
public int $last_snr;
public int $tx_air_secs;
public int $rx_air_secs;
}