Autonomous LC100 Calgary, AB — Since 2012
WestNet City Wi-Fi Wireless car magnet — 2012
WestNet — Calgary Autonomous Research

2000 Toyota Land Cruiser 100
Level 2 Autonomous System

An in-house Calgary innovation since 2012. Real-time autonomous control via analog mechanical feedback, AVC-LAN bus integration, Ladar ranging, Sony CMOS vision, and WestNetV2 city-wide WiFi telemetry.

Level 2 Autonomous 4.7L 2UZ-FE V8 AVC-LAN Bus WestNetV2 WiFi J2534 OBD Intel QX9650

Project Overview

WestNet's autonomous Land Cruiser project retrofits a stock 2000 Toyota Land Cruiser 100 Series (4.7L 2UZ-FE, VIN JTEHT05JX02039475) with a full Level 2 autonomous capability stack — all engineered in-house in Calgary without factory drive-by-wire.

The LC100 generation predates Toyota's adoption of ISO 11898 CAN. Its infotainment and climate systems communicate over Toyota AVC-LAN (Audio Visual Communication – Local Area Network), a proprietary differential serial bus operating at roughly 17.2 kbps. Vehicle telemetry (speed, odometer, fuel level, HVAC state) is decoded in real time by the aftermarket Android PX6 head unit's Luzheng / LZ CAN decoder box, which bridges AVC-LAN frames to a 115,200 baud serial stream on /dev/ttyS3.

Decoded telemetry is pushed every 2 seconds over WestNetV2 WiFi to the WestNet server (Intel QX9650, Windows 7) where it feeds both the real-time web dashboard and the main autonomous decision loop running at 0.002 ms cycle time. Legacy OBD-II diagnostics are accessed via the J2534 passthrough API (J2534.dll / J2534Ctrl.dll).

WestNet LC100 parked in Calgary — driver's side with magnet
LC100 on deployment — Calgary, 2012
WestNet LC100 rear — Beltline, 12 Ave SW, Calgary 2012
LC100 in downtown Calgary — WestNet magnet on rear, 2012 (XO2-PBX)
🔌
Live vehicle telemetry dashboard: westnet.ca/autonomous/status/ — real-time speed, odometer, fuel, HVAC, and GPS via WestNetV2.

Vehicle

  • Model: 2000 Toyota LC100
  • Engine: 4.7L 2UZ-FE V8
  • VIN: JTEHT05JX02039475
  • Bus: Toyota AVC-LAN
  • OBD: ISO 9141-2 / J2534

Compute

  • CPU: Intel QX9650 Quad-core
  • OS: Windows 7 (real-time tuned)
  • Loop: 0.002 ms control cycle
  • Head Unit: Android PX6 (RK3399)
  • Android: 9.0, rooted (SuperSU)

Sensors

  • Ranging: Ladar (laser radar)
  • Vision: Sony CMOS camera array
  • Telemetry: AVC-LAN decoded
  • Network: WestNetV2 WiFi
  • Diagnostics: J2534 passthrough

🔌 Toyota AVC-LAN Bus Integration

The 2000 LC100 predates Toyota's widespread CAN adoption. Its A/V, climate, and instrument systems communicate over AVC-LAN — Toyota's proprietary serial multiplex bus. This is NOT ISO 11898 CAN. The aftermarket Luzheng / LZ decoder box bridges AVC-LAN to a 115,200 baud UART stream consumed by the Android PX6 head unit's CamryService.

Bus Characteristics

ProtocolToyota AVC-LAN (proprietary)
Physical layerDifferential serial, ~17.2 kbps
DecoderLuzheng / LZ serial bridge
Bridge output/dev/ttyS3 @ 115200 baud
Android serviceCamryService (PID 1462)
MiddlewareEventCenter (PID 1126, AIDL)
OBD accessJ2534 passthrough (ISO 9141-2)

Decoded Packet Types

Three active message types are decoded by CamryService and logged via logcat:

MileFuelInfo0x2E 0x70 0x09 (13 B)
AirCmd0x2E 0x28 0x0B (15 B)
DiscInfo10x2E 0x61 0x08 (12 B)
DiscInfo20x2E 0x62 0x03 (7 B)
HVAC command0x0D 0x08 0x2E 0xE0 (8 B)

Packet Field Map

Message Header Bytes Key Fields Decode
MileFuelInfo 2E 70 09 BYTE[6]=speed, BYTE[7-9]=odo, BYTE[10]=fuel speed km/h = raw×0.5; odo=BCD×3; fuel=(raw/255)×100%
AirCmd 2E 28 0B BYTE[3]=flags, BYTE[4]=fan, BYTE[5]=temp_L flags bit7=blower, bit6=AC; fan: 0x20=off, 0x21-0x24=spd 1-4
sendBuickAirkey
(HVAC command)
0D 08 2E E0 02 BYTE[5]=CMD, BYTE[6]=VAL (0x01 press / 0x00 release) CKSUM = (0x1D − CMD − VAL) & 0xFF; wrapped in transport frame for ttyS3
# Real logcat output from CamryService (PID 1462) — live AVC-LAN frames
I/CamryService(1462): OnHandleCanMileFuelInfoCmd: 0x2e 0x70 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x86
I/CamryService(1462): ******OnHandleCanAirCmd*****: 0x2e 0x28 0x0b 0xc0 0x21 0x1f 0x1f 0x02 0x00 0x00 0x00 0x00 0x00 0x02 0xa9
I/CamryService(1462): sendBuickAirkey: 0x0d 0x08 0x2e 0xe0 0x02 0x0a 0x01 0x12   # Fan UP press
I/CamryService(1462): sendBuickAirkey: 0x0d 0x08 0x2e 0xe0 0x02 0x0a 0x00 0x13   # Fan UP release

# AirCmd byte[3]=0xC0 means: bit7=1 (blower ON), bit6=1 (AC compressor ON)
# byte[4]=0x21 = fan speed 1;  byte[5]=0x1F = 31°C left zone setpoint

Real-Time Data Pipeline

Telemetry flows from the AVC-LAN bus on the vehicle through the Android PX6 head unit, across WestNetV2 WiFi, into the WestNet server and on to the live dashboard. The full chain has a post interval of 2 seconds with sub-100 ms server processing.

🚗 LC100 Vehicle AVC-LAN bus ~17.2 kbps

Luzheng LZ
decoder
📱 Android PX6 RK3399, Android 9 CamryService /dev/ttyS3

logcat
pipe
📄 lc100_pusher.sh parses packets builds JSON

HTTP POST
nc / busybox
🌐 WestNetV2 WiFi 10.10.247.60 → 10.10.10.190

push.php
data.php
💻 WestNet Server QX9650 / Win7 push.php

SSE / JSON
poll
📊 Dashboard status/index.htm live telemetry
## lc100_pusher.sh — core decode loop (running on Android PX6)
# Reads CamryService logcat, decodes AVC-LAN packet fields, POSTs JSON

PUSH_URL="http://10.10.10.190/autonomous/status/push.php"
POST_INTERVAL=2
LOGCAT_PID=1462                  # CamryService PID on Android

# MileFuelInfo: 0x2E 0x70 0x09  (13 bytes)
# BYTE[6] = speed raw  → km/h = raw × 0.5
# BYTE[7..9] = odometer BCD-encoded × 3 bytes
# BYTE[10]   = fuel raw 0-255  → pct = (raw/255)×100
SPEED=$(awk '{printf "%.1f",$1*0.5}' <<< "$MB_6_dec")

# HVAC command transport frame (EventCenter → /dev/ttyS3):
# [0x0D][0x0A][LEN][0x0D][0x08][0x2E][0xE0][0x02][CMD][VAL][APP_CKSUM][TRANSPORT_CKSUM][0x00]
# Fan UP wire bytes: 0d0a090d082ee0020a0112b400  (press)
#                   0d0a090d082ee0020a0013b400  (release)

Android Side

  • IP: 10.10.247.60, SSH port 2222
  • CamryService reads AVC-LAN via ttyS3
  • lc100_pusher.sh parses logcat output
  • ncpost.sh handles HTTP POST (busybox nc)
  • State files: /data/local/tmp/lc100_state/

Server Side

  • IP: 10.10.10.190, Windows 7 / Apache
  • push.php — receives JSON POST, writes state
  • data.php — serves telemetry JSON to dashboard
  • command.php — queues HVAC commands back
  • sse.php — Server-Sent Events stream

Mechanical Controls

The LC100's size and mechanical robustness make it ideal for autonomous retrofit. Rather than relying on factory drive-by-wire, WestNet's system exerts direct mechanical authority through electro-hydraulic steering override, dual-channel vacuum brake boost, and an analog throttle feedback loop.

Custom PID algorithms read sub-millimeter position sensors at 500 Hz and issue corrections within the 0.002 ms main loop. The result is precise trajectory control that degrades gracefully — if any compute link is interrupted, the vehicle returns to full manual driver authority.

// Mechanical control cycle — runs on QX9650, Windows 7
// PID loops operate at 500 Hz sensor update rate
void executeMechanicalControl() {
    SensorFrame sf = readAnalogFeedback();   // steering angle, throttle pos, brake pressure
    PIDOutput cmd  = pidController.update(sf, targetTrajectory);
    applyActuation(cmd);                     // electro-hydraulic + servo outputs
}

// Analog feedback — NO drive-by-wire dependency
// Fail-safe: driver can override with full mechanical authority at any time

Steering Controls

The WestNet steering control module intercepts the LC100's hydraulic power steering with an electro-hydraulic actuator driven by the autonomous system. Real-time steering angle data is read back through a dedicated position sensor, closing the loop through the PID controller. The module interfaces with Windows 7 via the J2534 serial channel.

WestNet LC100 Steering Control Module
// Steering sensor integration — WestNet proprietary module
SteeringData readSteeringSensors() {
    RawData raw = j2534Channel.readSteeringPosition();  // via J2534 passthrough
    return processWithKalmanFilter(raw);                // smooth + correct latency
}

void integrateSteeringControl() {
    SteeringData input = readSteeringSensors();
    trajectoryPlanner.update(input);                    // Ladar + CMOS inform heading
    actuator.setAngle(trajectoryPlanner.targetAngle()); // electro-hydraulic output
}

🔌 Sensor Stack & Hardware

All sensing hardware is custom-integrated — no third-party autonomous platforms. Every component was selected for compatibility with the LC100 chassis and WestNet's real-time Windows 7 control stack.

Ranging — Ladar

Laser radar (Ladar) provides the primary forward-range map used by the obstacle-avoidance and path-planning algorithms. Point data feeds into the main QX9650 loop via a dedicated serial channel and is fused with Sony CMOS frame data at 500 Hz.

Vision — Sony CMOS

Sony CMOS sensors provide lane-edge and object-classification data. Frames are processed in real time on the QX9650 using WestNet's C++ vision pipeline. The analog video path eliminates USB/PCIe latency common in off-the-shelf camera modules.

Connectivity — WestNetV2 WiFi

WestNet's proprietary city-wide WiFi network (WestNetV2) provides the telemetry uplink from the vehicle to the command server. The Android PX6 head unit posts JSON state every 2 seconds; the server can send HVAC and diagnostic commands in return.

OBD / Diagnostics — J2534

The J2534 passthrough API (J2534.dll, J2534Ctrl.dll) provides a standards-compliant bridge for OBD-II and Toyota-proprietary diagnostic commands over ISO 9141-2. Used for fault-code reading and ECU parameter access independent of the AVC-LAN channel.

📄 System Architecture

Full hardware and software architecture of the WestNet LC100 autonomous stack. The system is split into three layers: vehicle interface (AVC-LAN + J2534), edge compute (Android PX6), and cloud compute (QX9650 server).

VEHICLE LAYER EDGE COMPUTE (ANDROID PX6) SERVER / CLOUD 2000 TOYOTA LC100 4.7L 2UZ-FE V8 AVC-LAN Bus Toyota proprietary ~17.2kbps HVAC / Instruments Speed, odo, fuel, A/C OBD-II Port ISO 9141-2 / J2534 Steering / Brakes Electro-hydraulic actuators Ladar + Sony CMOS Ranging + vision 500 Hz sensor fusion Luzheng LZ ttyS3 115200 J2534.dll OBD passthru ANDROID PX6 RK3399, Android 9 (rooted) CamryService (PID 1462) AVC-LAN packet decoder EventCenter (PID 1126) AIDL middleware, ttyS3 writes lc100_pusher.sh logcat → JSON → HTTP POST ncpost.sh busybox nc HTTP transport State: lc100_state/ speed, odo, fuel_pct, hvac_fan, hvac_temp, ac_on WestNetV2 WiFi HTTP POST / 2s WESTNET SERVER QX9650 Quad-core / Windows 7 push.php Receives & stores telemetry JSON data.php / sse.php JSON + SSE stream to dashboard command.php HVAC command queue → Android Autonomous Decision Loop C++ / PHP / Bash @ 0.002ms Live Dashboard status/index.htm Leaflet map + telemetry cards

System Identification

Vehicle

VINJTEHT05JX02039475
Model year2000 Toyota LC100
Engine4.7L 2UZ-FE V8
BusToyota AVC-LAN
Autonomy levelSAE L2

Edge Node (Android PX6)

ChipRockchip RK3399
OSAndroid 9 (rooted, SuperSU 2.45)
IP10.10.247.60 (SSH :2222)
CAN APKcom.szchoiceway.canbus
Serial/dev/ttyS3 @ 115200 baud

Server Compute

CPUIntel QX9650 Quad-core
OSWindows 7 (real-time tuned)
Loop rate0.002 ms control cycle
SW stackC++, PHP, Bash
IP10.10.10.190

WestNet Version

HW RevisionWN-ALU-100-2025
SW VersionWestNetOS 4.2.1b
WiFi ProtocolWestNetV2
OBD InterfaceJ2534.dll / J2534Ctrl.dll
Project start2012, Calgary AB

📡 WestNetV2 WiFi Infrastructure

WestNet's proprietary city-wide WiFi (WestNetV2) serves as the telemetry backhaul for the LC100 project. The Android PX6 head unit connects to WestNetV2 and POSTs a JSON telemetry payload every 2 seconds using ncpost.sh (a busybox nc-based HTTP POST script that replaced broken wget on the Android build).

The command channel runs in the opposite direction: command.php on the server queues HVAC commands (fan speed, temperature setpoint, A/C toggle) which lc100_pusher.sh polls and executes by writing the AVC-LAN transport frame directly to /dev/ttyS3.

// Telemetry POST — every 2 seconds from Android PX6
{
  "speed":     "68.5",          // km/h (AVC-LAN MileFuelInfo BYTE[6] × 0.5)
  "odometer":  "187432",        // km (BCD-decoded BYTE[7..9])
  "fuel_pct":  "74",            // % (BYTE[10] / 255 × 100)
  "hvac_fan":  "2",             // fan speed 1-4 (AirCmd BYTE[4])
  "hvac_temp": "22",            // °C setpoint (AirCmd BYTE[5])
  "ac_on":     "1",             // 1=compressor on (AirCmd BYTE[3] bit6)
  "ts":        "1743721486"     // Unix timestamp from Android
}

📊 Telemetry Simulation

The canvas below visualises synthetic telemetry streams — representative of the live AVC-LAN data decoded by CamryService on the Android PX6. The live dashboard at status/ shows real vehicle data with Leaflet GPS map, HVAC controls, and packet log.