{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "segments = [\n",
    "  \"d9df6f87e8feff94|2023-03-28--17-41-10/1:12\"\n",
    "]\n",
    "platform = \"SUBARU_OUTBACK\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import copy\n",
    "import numpy as np\n",
    "\n",
    "from opendbc.can.parser import CANParser\n",
    "\n",
    "from openpilot.selfdrive.car.subaru.values import DBC\n",
    "from openpilot.tools.lib.logreader import LogReader\n",
    "\n",
    "\"\"\"\n",
    "In this example, we plot the relationship between Cruise_Brake and Acceleration for stock eyesight.\n",
    "\"\"\"\n",
    "\n",
    "for segment in segments:\n",
    "  lr = LogReader(segment)\n",
    "\n",
    "  messages = [\n",
    "    (\"ES_Distance\", 20),\n",
    "    (\"ES_Brake\", 20),\n",
    "    (\"ES_Status\", 20),\n",
    "  ]\n",
    "\n",
    "  cp = CANParser(DBC[platform][\"pt\"], messages, 1)\n",
    "\n",
    "  es_distance_history = []\n",
    "  es_status_history = []\n",
    "  es_brake_history = []\n",
    "  acceleration_history = []\n",
    "\n",
    "  last_acc = 0\n",
    "\n",
    "  for msg in lr:\n",
    "    if msg.which() == \"can\":\n",
    "      cp.update_strings([msg.as_builder().to_bytes()])\n",
    "      es_distance_history.append(copy.copy(cp.vl[\"ES_Distance\"]))\n",
    "      es_brake_history.append(copy.copy(cp.vl[\"ES_Brake\"]))\n",
    "      es_status_history.append(copy.copy(cp.vl[\"ES_Status\"]))\n",
    "\n",
    "      acceleration_history.append(last_acc)\n",
    "\n",
    "    if msg.which() == \"carState\":\n",
    "      last_acc = msg.carState.aEgo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def process(history, func):\n",
    "  return np.array([func(h) for h in history])\n",
    "\n",
    "cruise_activated = process(es_status_history, lambda es_status: es_status[\"Cruise_Activated\"])\n",
    "cruise_throttle = process(es_distance_history, lambda es_distance: es_distance[\"Cruise_Throttle\"])\n",
    "cruise_rpm = process(es_status_history, lambda es_status: es_status[\"Cruise_RPM\"])\n",
    "cruise_brake = process(es_brake_history, lambda es_brake: es_brake[\"Brake_Pressure\"])\n",
    "acceleration = process(acceleration_history, lambda acc: acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "valid_brake = (cruise_activated==1) & (cruise_brake>0) # only when cruise is activated and eyesight is braking\n",
    "\n",
    "ax = plt.figure().add_subplot()\n",
    "\n",
    "ax.set_title(\"Brake_Pressure vs Acceleration\")\n",
    "ax.set_xlabel(\"Brake_Pessure\")\n",
    "ax.set_ylabel(\"Acceleration\")\n",
    "ax.scatter(cruise_brake[valid_brake], -acceleration[valid_brake])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
