Last active
May 28, 2020 11:35
-
-
Save romanroibu/960c0f8b30d2b42177291a4339eece4d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import collections\n", | |
"import sys\n", | |
"import time\n", | |
"\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"from IPython.display import display, clear_output\n", | |
"\n", | |
"def update(*args):\n", | |
" clear_output(wait=True)\n", | |
" display(*args)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"sys.path.append(\"/Users/rom/work/pupil/pupil_src/shared_modules/\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import file_methods as fm\n", | |
"import zmq_tools" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Load recording" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Visualize calibration timestamps" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def load_recording_messages(rec_dir):\n", | |
" N = fm.load_pldata_file(rec_dir, \"notify\")\n", | |
" P = fm.load_pldata_file(rec_dir, \"pupil\")\n", | |
"\n", | |
" messages = []\n", | |
" messages.extend(N.data)\n", | |
" messages.extend(P.data)\n", | |
"\n", | |
" # Filter 3d data\n", | |
" def is_not_pupil(msg):\n", | |
" return not msg[\"topic\"].startswith(\"pupil\")\n", | |
"\n", | |
" def is_pupil_3d(msg):\n", | |
"\n", | |
" return \"3d\" in msg[\"method\"]\n", | |
"\n", | |
"\n", | |
" messages = filter(lambda m: is_not_pupil(m) or is_pupil_3d(m), messages)\n", | |
"\n", | |
" # Filter calibration data\n", | |
" start, stop = N.timestamps[[0, -1]]\n", | |
" messages = filter(lambda m: start <= m[\"timestamp\"] <= stop, messages)\n", | |
"\n", | |
" # Sort by time\n", | |
" messages = sorted(messages, key=lambda m: m[\"timestamp\"])\n", | |
"\n", | |
" return messages" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"messages = load_recording_messages(\"hmd_gazer_4\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def visualize_calibration_timestamps(messages):\n", | |
" ts = [m[\"timestamp\"] for m in messages]\n", | |
" topics_all = [m[\"topic\"] for m in messages]\n", | |
" topics = sorted(set(topics_all), reverse=True)\n", | |
" topic_idc = [topics.index(t) for t in topics_all]\n", | |
"\n", | |
" plt.scatter(ts, topic_idc)\n", | |
" plt.yticks(range(len(topics)), topics)\n", | |
" pass" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"visualize_calibration_timestamps(messages)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Replay recording" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def enumerate_notifications(messages):\n", | |
" replay_speed = 2 # increasing too much might drop packages\n", | |
" first_ts = messages[0][\"timestamp\"]\n", | |
" last_ts = first_ts\n", | |
"\n", | |
" for idx, msg in enumerate(messages):\n", | |
" msg = msg._deep_copy_dict()\n", | |
" new_ts = msg[\"timestamp\"]\n", | |
"\n", | |
" yield idx, msg, new_ts\n", | |
"\n", | |
" time_to_sleep = max(0.0, new_ts - last_ts)\n", | |
" time_to_sleep /= replay_speed\n", | |
" time.sleep(time_to_sleep)\n", | |
" last_ts = new_ts" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class NetworkInterface:\n", | |
" def __init__(self, req_port: int = 50020):\n", | |
" zmq = zmq_tools.zmq\n", | |
" addr = \"tcp://localhost:{}\"\n", | |
"\n", | |
" self.ctx = zmq.Context.instance()\n", | |
"\n", | |
" self.req = self.ctx.socket(zmq.REQ)\n", | |
" self.req.connect(addr.format(req_port))\n", | |
"\n", | |
" self.req.send_string(\"SUB_PORT\")\n", | |
" sub_port = self.req.recv_string()\n", | |
"\n", | |
" self.req.send_string(\"PUB_PORT\")\n", | |
" pub_port = self.req.recv_string()\n", | |
"\n", | |
" self.pub_msg_streamer = zmq_tools.Msg_Streamer(\n", | |
" self.ctx,\n", | |
" addr.format(pub_port),\n", | |
" )\n", | |
"\n", | |
" self.log_msg_receiver = zmq_tools.Msg_Receiver(\n", | |
" self.ctx,\n", | |
" addr.format(sub_port),\n", | |
" topics=(\"logging.\",),\n", | |
" )\n", | |
"\n", | |
" self.calibration_msg_receiver = zmq_tools.Msg_Receiver(\n", | |
" self.ctx,\n", | |
" addr.format(sub_port),\n", | |
" topics=(\"notify.calibration.\",)\n", | |
" )\n", | |
"\n", | |
" def sync_time(self, timestamp):\n", | |
" self.req.send_string(f\"T {timestamp}\")\n", | |
" response_string = self.req.recv_string()\n", | |
" return response_string\n", | |
"\n", | |
" def send_start_plugin_notification(self, plugin_name: str):\n", | |
" self.pub_msg_streamer.send(\n", | |
" {\n", | |
" \"topic\": \"notify.start_plugin\",\n", | |
" \"subject\": \"start_plugin\",\n", | |
" \"name\": \"HMD3DChoreographyPlugin\",\n", | |
" }\n", | |
" )" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Service v1.23" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# replay_speed = 2 # increasing too much might drop packages\n", | |
"\n", | |
"# pub = zmq_tools.Msg_Streamer(ctx, addr.format(pub_port))\n", | |
"# logs = zmq_tools.Msg_Receiver(\n", | |
"# ctx,\n", | |
"# addr.format(sub_port),\n", | |
"# topics=(\"logging.\", \"notify.calibration.successful\"))\n", | |
"\n", | |
"# try:\n", | |
"# first_ts = messages[0][\"timestamp\"]\n", | |
" \n", | |
"# pub.send(\n", | |
"# {\n", | |
"# \"topic\": \"notify.start_plugin\",\n", | |
"# \"subject\": \"start_plugin\",\n", | |
"# \"name\": \"HMD_Calibration_3D\",\n", | |
"# }\n", | |
"# )\n", | |
" \n", | |
"# req.send_string(f\"T {first_ts}\")\n", | |
"# print(req.recv_string())\n", | |
"\n", | |
"# last_ts = first_ts\n", | |
"# for idx, msg in enumerate(messages):\n", | |
"# msg = msg._deep_copy_dict()\n", | |
"# new_ts = msg[\"timestamp\"]\n", | |
"# time_to_sleep = max(0.0, new_ts - last_ts)\n", | |
"# time_to_sleep /= replay_speed\n", | |
"# time.sleep(time_to_sleep)\n", | |
"# last_ts = new_ts\n", | |
"\n", | |
"# pub.send(msg)\n", | |
" \n", | |
"# if idx % 100 == 0:\n", | |
"# update(f\"({idx}) Sending {msg['topic']}\")\n", | |
"\n", | |
"# update(f\"(Finished) Sending {msg['topic']}\")\n", | |
" \n", | |
"# except KeyboardInterrupt:\n", | |
"# del pub\n", | |
"\n", | |
"# # Flush all recent logs\n", | |
"# while logs.new_data:\n", | |
"# topic, payload = logs.recv()\n", | |
"# print(f'[{payload[\"levelname\"]}] {payload[\"name\"]} - {payload[\"msg\"]}')\n", | |
"\n", | |
"# try:\n", | |
"# while True:\n", | |
"# topic, payload = logs.recv()\n", | |
"# if topic == \"notify.calibration.successful\":\n", | |
"# print(\"Calibration successful.\")\n", | |
"# break\n", | |
"# print(f'[{payload[\"levelname\"]}] {payload[\"name\"]} - {payload[\"msg\"]}')\n", | |
"# except KeyboardInterrupt:\n", | |
"# pass\n", | |
"\n", | |
"# del logs" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Service 2.0" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def send_notifications(net_api, choreo_plugin_name, messages):\n", | |
"\n", | |
" def send_message(msg):\n", | |
" net_api.pub_msg_streamer.send(msg)\n", | |
"\n", | |
" def expect_recv(expected_topics: tuple):\n", | |
" if not isinstance(expected_topics, tuple):\n", | |
" expected_topics = (expected_topics,)\n", | |
" actual_topic, payload = net_api.calibration_msg_receiver.recv()\n", | |
" assert actual_topic in expected_topics, f'Expected message with topics \"{expected_topics}\", but got \"{actual_topic}\"'\n", | |
" return actual_topic\n", | |
"\n", | |
" net_api.send_start_plugin_notification(choreo_plugin_name)\n", | |
"\n", | |
" if len(messages) == 0:\n", | |
" return\n", | |
"\n", | |
" for idx, msg, ts in enumerate_notifications(messages):\n", | |
" if idx == 0:\n", | |
" response_string = net_api.sync_time(ts)\n", | |
" print(f\"(i) {response_string}\")\n", | |
"\n", | |
" send_message(msg)\n", | |
"\n", | |
" topic = msg[\"topic\"]\n", | |
" if topic.startswith(\"pupil.\"):\n", | |
" pass\n", | |
" elif topic.startswith(\"notify.\"):\n", | |
" expect_recv(topic) #echo\n", | |
" print(topic)\n", | |
"\n", | |
" if topic == \"notify.calibration.should_start\":\n", | |
" recv_topic = expect_recv(\"notify.calibration.started\")\n", | |
" print(recv_topic)\n", | |
"\n", | |
" elif topic == \"notify.calibration.add_ref_data\":\n", | |
" pass\n", | |
"\n", | |
" elif topic == \"notify.calibration.should_stop\":\n", | |
" recv_topic = expect_recv(\"notify.calibration.stopped\")\n", | |
" print(recv_topic)\n", | |
"\n", | |
" recv_topic = expect_recv(\"notify.calibration.setup.v2\")\n", | |
" print(recv_topic)\n", | |
"\n", | |
" recv_topic = expect_recv((\"notify.calibration.successful\", \"notify.calibration.failed\"))\n", | |
" print(recv_topic)\n", | |
"\n", | |
" if recv_topic == \"notify.calibration.successful\":\n", | |
" expect_recv(\"notify.calibration.result.v2\")\n", | |
" print(recv_topic)\n", | |
" else:\n", | |
" print(f\"UNEXPECTED: {topic}\")\n", | |
" else:\n", | |
" print(f\"UNEXPECTED: {topic}\")\n", | |
"\n", | |
" print(\"(i) Finished sending messages.\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(i) Timesync successful.\n", | |
"notify.calibration.should_start\n", | |
"notify.calibration.started\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.add_ref_data\n", | |
"notify.calibration.should_stop\n", | |
"notify.calibration.stopped\n", | |
"notify.calibration.setup.v2\n", | |
"notify.calibration.successful\n", | |
"notify.calibration.successful\n", | |
"(i) Finished sending messages.\n" | |
] | |
} | |
], | |
"source": [ | |
"send_notifications(\n", | |
" net_api=NetworkInterface(),\n", | |
" choreo_plugin_name=\"HMD3DChoreographyPlugin\",\n", | |
"# choreo_plugin_name=\"CustomHMD3DChoreographyPlugin\",\n", | |
" messages=messages,\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"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.6.10" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment