From 5b17682e09d129f4273b413455cada503e171f29 Mon Sep 17 00:00:00 2001 From: Ben Menking Date: Sat, 30 May 2026 00:16:44 -0400 Subject: [PATCH] Added CodeStatus models --- src/CoreParser.php | 119 ++++++++++++--------- src/Model/CodeStatusTypeCoreResponse.php | 12 +++ src/Model/CodeStatusTypePacketResponse.php | 15 +++ src/Model/CodeStatusTypeRadioResponse.php | 13 +++ 4 files changed, 107 insertions(+), 52 deletions(-) create mode 100644 src/Model/CodeStatusTypeCoreResponse.php create mode 100644 src/Model/CodeStatusTypePacketResponse.php create mode 100644 src/Model/CodeStatusTypeRadioResponse.php diff --git a/src/CoreParser.php b/src/CoreParser.php index be137fa..c7f1759 100644 --- a/src/CoreParser.php +++ b/src/CoreParser.php @@ -15,6 +15,9 @@ use Menking\Meshcore\Model\ErrorResponse; use Menking\Meshcore\Model\LoginResponse; use Menking\Meshcore\Model\LogReceiveResponse; 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\ContactsFullResponse; use Menking\Meshcore\Model\MessageResponse; @@ -376,57 +379,74 @@ class CoreParser { return $m; } - public static function parseCodeStatusResponse(string $payload) { - $info = [ - 'code'=>ord($payload[0]), - 'type'=>ord($payload[1]), - ]; + /** + * + * @param string $payload + * @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: - $info['battery_mv'] = unpack('v', substr($payload, 2, 2))[1]; - $info['uptime_secs'] = unpack('V', substr($payload, 4, 4))[1]; - $info['err_flags'] = unpack('v', substr($payload, 8, 2))[1]; - $info['queue_len'] = ord($payload[10]); + $m = new CodeStatusTypeCoreResponse(); + $m->code = ord($payload[0]); + $m->battery_mv = unpack('v', substr($payload, 2, 2))[1]; + $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; case CoreProtocol::STATS_TYPE_RADIO: - $info['noise_floor'] = unpack('v', substr($payload, 2, 2))[1]; - $info['last_rssi'] = (ord($payload[4]) >= 128) ? (ord($payload[4]) - 256): ord($payload[4]); - $info['last_snr'] = ord($payload[5]); - $info['tx_air_secs'] = unpack('V', substr($payload, 6, 4))[1]; - $info['rx_air_secs'] = unpack('V', substr($payload, 10, 4))[1]; + $m = new CodeStatusTypeRadioResponse(); + $m->code = ord($payload[0]); + $m->noise_floor = unpack('v', substr($payload, 2, 2))[1]; + $m->last_rssi = (ord($payload[4]) >= 128) ? (ord($payload[4]) - 256): ord($payload[4]); + $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; case CoreProtocol::STATS_TYPE_PACKETS: - $info['recv'] = unpack('V', substr($payload, 2, 4))[1]; - $info['sent'] = unpack('V', substr($payload, 6, 4))[1]; - $info['n_sent_flood'] = unpack('V', substr($payload, 10, 4))[1]; - $info['n_sent_direct'] = unpack('V', substr($payload, 14, 4))[1]; - $info['n_recv_flood'] = unpack('V', substr($payload, 18, 4))[1]; - $info['n_recv_direct'] = unpack('V', substr($payload, 22, 4))[1]; - $info['n_rec_errors'] = unpack('V', substr($payload, 26, 4))[1]; + $m = new CodeStatusTypePacketResponse(); + $m->code = ord($payload[0]); + $m->recv = unpack('V', substr($payload, 2, 4))[1]; + $m->sent = unpack('V', substr($payload, 6, 4))[1]; + $m->n_sent_flood = unpack('V', substr($payload, 10, 4))[1]; + $m->n_sent_direct = unpack('V', substr($payload, 14, 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; } - return $info; + return $m; } - public static function parseDeviceInfoResponse(string $payload) { - $info = [ - 'code'=>ord($payload[0]), - 'fw_ver_code'=>ord($payload[1]), - 'max_contacts'=>ord($payload[2]) * 2, - 'max_group_channels'=>ord($payload[3]), - 'ble_pin'=>unpack('V', substr($payload, 4, 4))[1], - 'fw_build_date'=>trim(substr($payload, 8, 12)), - 'manufacturer_name'=>trim(substr($payload, 20, 40)), - 'fw_version'=>trim(substr($payload, 60, 20)), - 'client_repeat'=>ord($payload[80]), - 'path_hash_mode'=>ord($payload[81]) - ]; + /** + * + * @param string $payload + * @return DeviceInfoResponse + */ + public static function parseDeviceInfoResponse(string $payload): DeviceInfoResponse { + $m = new DeviceInfoResponse(); + $m->code = ord($payload[0]); + $m->firmware_version = ord($payload[1]); + $m->max_contacts_raw = ord($payload[2]) * 2; + $m->max_channels = ord($payload[3]); + $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 { $m = new ChannelResponse(); @@ -438,21 +458,11 @@ class CoreParser { return $m; } - /* - public static function parseMessage(string $payload) { - $data = [ - 'code'=>ord($payload[0]), - '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; - } - */ - + /** + * + * @param mixed $str + * @return null|string + */ public static function readCstring($str) { $x = strpos($str, "\0"); @@ -464,6 +474,11 @@ class CoreParser { } } + /** + * + * @param string $pubkey + * @return string + */ public static function formatPublicKey(string $pubkey): string { return bin2hex($pubkey); } diff --git a/src/Model/CodeStatusTypeCoreResponse.php b/src/Model/CodeStatusTypeCoreResponse.php new file mode 100644 index 0000000..96eca58 --- /dev/null +++ b/src/Model/CodeStatusTypeCoreResponse.php @@ -0,0 +1,12 @@ +