{"action":"created","comment":{"url":"https://api.github.com/repos/PX4/Firmware/pulls/comments/25789611","id":25789611,"diff_hunk":"@@ -0,0 +1,542 @@\n+/****************************************************************************\n+ *\n+ *   Copyright (c) 2014, 2015 PX4 Development Team. All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions\n+ * are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright\n+ *    notice, this list of conditions and the following disclaimer.\n+ * 2. Redistributions in binary form must reproduce the above copyright\n+ *    notice, this list of conditions and the following disclaimer in\n+ *    the documentation and/or other materials provided with the\n+ *    distribution.\n+ * 3. Neither the name PX4 nor the names of its contributors may be\n+ *    used to endorse or promote products derived from this software\n+ *    without specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ *\n+ ****************************************************************************/\n+\n+/**\n+ * @file gimbal.cpp\n+ * @author Lorenz Meier <lm@inf.ethz.ch>\n+ * @author Anton Matosov <anton.matosov@gmail.com>\n+ *\n+ * Driver to control a gimbal - relies on input via telemetry or RC\n+ * and output via the standardized control group #2 and a mixer.\n+ */\n+\n+#include <nuttx/config.h>\n+\n+#include <sys/types.h>\n+#include <stdint.h>\n+#include <stdlib.h>\n+#include <stdbool.h>\n+#include <semaphore.h>\n+#include <string.h>\n+#include <fcntl.h>\n+#include <poll.h>\n+#include <errno.h>\n+#include <stdio.h>\n+#include <math.h>\n+#include <unistd.h>\n+#include <termios.h>\n+\n+#include <nuttx/arch.h>\n+#include <nuttx/wqueue.h>\n+#include <nuttx/clock.h>\n+\n+#include <systemlib/perf_counter.h>\n+#include <systemlib/err.h>\n+\n+#include <drivers/drv_hrt.h>\n+#include <drivers/drv_range_finder.h>\n+#include <drivers/device/device.h>\n+#include <drivers/device/ringbuffer.h>\n+\n+#include <uORB/uORB.h>\n+#include <uORB/topics/vehicle_command.h>\n+#include <uORB/topics/actuator_controls.h>\n+#include <uORB/topics/vehicle_attitude.h>\n+\n+#include <board_config.h>\n+#include <mathlib/math/test/test.hpp>\n+\n+/* Configuration Constants */\n+\n+/* oddly, ERROR is not defined for c++ */\n+#ifdef ERROR\n+# undef ERROR\n+#endif\n+static const int ERROR = -1;\n+\n+#ifndef CONFIG_SCHED_WORKQUEUE\n+# error This requires CONFIG_SCHED_WORKQUEUE.\n+#endif\n+\n+#define GIMBAL_DEVICE_PATH\t\"/dev/gimbal\"\n+\n+#define GIMBAL_UPDATE_INTERVAL (5 * 1000)\n+\n+#define GIMBALIOCATTCOMPENSATE\t\t1\n+\n+class Gimbal : public device::CDev\n+{\n+public:\n+\tGimbal();\n+\tvirtual ~Gimbal();\n+\n+\tvirtual int \t\t\tinit();\n+\n+\tvirtual ssize_t\t\t\tread(struct file *filp, char *buffer, size_t buflen);\n+\tvirtual int\t\t\tioctl(struct file *filp, int cmd, unsigned long arg);\n+\n+\t/**\n+\t* Diagnostics - print some basic information about the driver.\n+\t*/\n+\tvoid\t\t\t\tprint_info();\n+\n+protected:\n+\tvirtual int\t\t\tprobe();\n+\n+private:\n+\tfloat\t\t\t\t_min_distance;\n+\tfloat\t\t\t\t_max_distance;\n+\twork_s\t\t\t\t_work;\n+\tint\t\t\t\t_vehicle_command_sub;\n+\tint\t\t\t\t_att_sub;\n+\n+\tbool\t\t\t\t_attitude_compensation;\n+\tbool\t\t\t\t_initialized;\n+\n+\torb_advert_t\t\t\t_actuator_controls_2_topic;\n+\n+\tperf_counter_t\t\t\t_sample_perf;\n+\tperf_counter_t\t\t\t_comms_errors;\n+\tperf_counter_t\t\t\t_buffer_overflows;\n+\n+\t/**\n+\t* Initialise the automatic measurement state machine and start it.\n+\t*\n+\t* @note This function is called at open and error time.  It might make sense\n+\t*       to make it more aggressive about resetting the bus in case of errors.\n+\t*/\n+\tvoid\t\t\t\tstart();\n+\n+\t/**\n+\t* Stop the automatic measurement state machine.\n+\t*/\n+\tvoid\t\t\t\tstop();\n+\n+\t/**\n+\t* Perform a poll cycle; collect from the previous measurement\n+\t* and start a new one.\n+\t*/\n+\tvoid\t\t\t\tcycle();\n+\n+\t/**\n+\t* Static trampoline from the workq context; because we don't have a\n+\t* generic workq wrapper yet.\n+\t*\n+\t* @param arg\t\tInstance pointer for the driver that is polling.\n+\t*/\n+\tstatic void\t\t\tcycle_trampoline(void *arg);\n+\n+\n+};\n+\n+/*\n+ * Driver 'main' command.\n+ */\n+extern \"C\" __EXPORT int gimbal_main(int argc, char *argv[]);\n+\n+Gimbal::Gimbal() :\n+\tCDev(\"Gimbal\", GIMBAL_DEVICE_PATH),\n+\t_vehicle_command_sub(-1),\n+\t_att_sub(-1),\n+\t_attitude_compensation(true),\n+\t_initialized(false),\n+\t_actuator_controls_2_topic(-1),\n+\t_sample_perf(perf_alloc(PC_ELAPSED, \"gimbal_read\")),\n+\t_comms_errors(perf_alloc(PC_COUNT, \"gimbal_comms_errors\")),\n+\t_buffer_overflows(perf_alloc(PC_COUNT, \"gimbal_buffer_overflows\"))\n+{\n+\t// disable debug() calls\n+\t_debug_enabled = false;\n+\n+\t// work_cancel in the dtor will explode if we don't do this...\n+\tmemset(&_work, 0, sizeof(_work));\n+}\n+\n+Gimbal::~Gimbal()\n+{\n+\t/* make sure we are truly inactive */\n+\tstop();\n+\n+\t::close(_actuator_controls_2_topic);\n+\t::close(_vehicle_command_sub);\n+}\n+\n+int\n+Gimbal::init()\n+{\n+\tint ret = ERROR;\n+\n+\t/* do regular cdev init */\n+\tif (CDev::init() != OK) {\n+\t\tgoto out;\n+\t}\n+\n+\tstart();\n+\tret = OK;\n+\n+out:\n+\treturn ret;\n+}\n+\n+int\n+Gimbal::probe()\n+{\n+\treturn OK;\n+}\n+\n+int\n+Gimbal::ioctl(struct file *filp, int cmd, unsigned long arg)\n+{\n+\tswitch (cmd) {\n+\n+\tcase GIMBALIOCATTCOMPENSATE:\n+\t\t_attitude_compensation = (arg != 0);\n+\t\treturn OK;\n+\n+\tdefault:\n+\t\t/* give it to the superclass */\n+\t\treturn CDev::ioctl(filp, cmd, arg);\n+\t}\n+}\n+\n+ssize_t\n+Gimbal::read(struct file *filp, char *buffer, size_t buflen)\n+{\n+\treturn 0;\n+}\n+\n+void\n+Gimbal::start()\n+{\n+\t/* schedule a cycle to start things */\n+\twork_queue(LPWORK, &_work, (worker_t)&Gimbal::cycle_trampoline, this, 1);\n+}\n+\n+void\n+Gimbal::stop()\n+{\n+\twork_cancel(LPWORK, &_work);\n+}\n+\n+void\n+Gimbal::cycle_trampoline(void *arg)\n+{\n+\tGimbal *dev = static_cast<Gimbal *>(arg);\n+\n+\tdev->cycle();\n+}\n+\n+void\n+Gimbal::cycle()\n+{\n+\tif (!_initialized) {\n+\t\t/* get a subscription handle on the vehicle command topic */\n+\t\t_vehicle_command_sub = orb_subscribe(ORB_ID(vehicle_command));\n+\n+\t\t/* get a publication handle on actuator output topic */\n+\t\tstruct actuator_controls_s zero_report;\n+\t\tmemset(&zero_report, 0, sizeof(zero_report));\n+\t\tzero_report.timestamp = hrt_absolute_time();\n+\t\t_actuator_controls_2_topic = orb_advertise(ORB_ID(actuator_controls_2), &zero_report);\n+\n+\t\tif (_actuator_controls_2_topic < 0) {\n+\t\t\twarnx(\"advert err\");\n+\t\t}\n+\n+\t\t_initialized = true;\n+\t}\n+\n+\tbool\tupdated = false;\n+\n+\tperf_begin(_sample_perf);\n+\n+\tfloat roll = 0.0f;\n+\tfloat pitch = 0.0f;\n+\tfloat yaw = 0.0f;\n+\n+\n+\tif (_attitude_compensation) {\n+\t\tif (_att_sub < 0) {\n+\t\t\t_att_sub = orb_subscribe(ORB_ID(vehicle_attitude));\n+\t\t}\n+\n+\t\tvehicle_attitude_s att;\n+\n+\t\torb_copy(ORB_ID(vehicle_attitude), _att_sub, &att);\n+\n+\t\troll = -att.roll;\n+\t\tpitch = -att.pitch;\n+\t\tyaw = att.yaw;\n+\n+\t\tupdated = true;\n+\t}\n+\n+\tstruct vehicle_command_s cmd;\n+\n+\tbool cmd_updated;\n+\n+\torb_check(_vehicle_command_sub, &cmd_updated);\n+\n+\tif (cmd_updated) {\n+\n+\t\torb_copy(ORB_ID(vehicle_command), _vehicle_command_sub, &cmd);\n+\n+\t\tVEHICLE_MOUNT_MODE mountMode = (VEHICLE_MOUNT_MODE)cmd.param7;\n+\t\tdebug(\"cmd: %d, mountMode %d | param1: %8.4f param2: %8.4f\", cmd.command, mountMode, (double)cmd.param1, (double)cmd.param2);\n+\n+\t\tif (cmd.command == VEHICLE_CMD_DO_MOUNT_CONTROL && mountMode == VEHICLE_MOUNT_MODE_MAVLINK_TARGETING) {\n+\n+\t\t\t/* Convert to range -1 ... 1, which corresponds to -180deg ... 180deg */\n+\t\t\troll += 1.0f / M_PI_F * M_DEG_TO_RAD_F * cmd.param1;\n+\t\t\tpitch += 1.0f / M_PI_F * M_DEG_TO_RAD_F * cmd.param2;\n+\t\t\tyaw += 1.0f / M_PI_F * M_DEG_TO_RAD_F * cmd.param3;\n+\t\t\t\n+\t\t\tupdated = true;\n+\n+\t\t}\n+\n+#if 0\n+\t\t// XXX change this to the real quaternion command\n+\t\tif (cmd.command == VEHICLE_CMD_DO_MOUNT_CONTROL_QUAT && mountMode == VEHICLE_MOUNT_MODE_MAVLINK_TARGETING) {","path":"src/drivers/gimbal/gimbal.cpp","position":330,"original_position":330,"commit_id":"f271a78a2e3a773e021eff3309baaad2b87af0ca","original_commit_id":"f271a78a2e3a773e021eff3309baaad2b87af0ca","user":{"login":"anton-matosov","id":3339485,"avatar_url":"https://avatars.githubusercontent.com/u/3339485?v=3","gravatar_id":"","url":"https://api.github.com/users/anton-matosov","html_url":"https://github.com/anton-matosov","followers_url":"https://api.github.com/users/anton-matosov/followers","following_url":"https://api.github.com/users/anton-matosov/following{/other_user}","gists_url":"https://api.github.com/users/anton-matosov/gists{/gist_id}","starred_url":"https://api.github.com/users/anton-matosov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anton-matosov/subscriptions","organizations_url":"https://api.github.com/users/anton-matosov/orgs","repos_url":"https://api.github.com/users/anton-matosov/repos","events_url":"https://api.github.com/users/anton-matosov/events{/privacy}","received_events_url":"https://api.github.com/users/anton-matosov/received_events","type":"User","site_admin":false},"body":"Ok, will do this in couple of days ","created_at":"2015-03-04T16:43:07Z","updated_at":"2015-03-04T16:43:07Z","html_url":"https://github.com/PX4/Firmware/pull/1878#discussion_r25789611","pull_request_url":"https://api.github.com/repos/PX4/Firmware/pulls/1878","_links":{"self":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/comments/25789611"},"html":{"href":"https://github.com/PX4/Firmware/pull/1878#discussion_r25789611"},"pull_request":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1878"}}},"pull_request":{"url":"https://api.github.com/repos/PX4/Firmware/pulls/1878","id":30444860,"html_url":"https://github.com/PX4/Firmware/pull/1878","diff_url":"https://github.com/PX4/Firmware/pull/1878.diff","patch_url":"https://github.com/PX4/Firmware/pull/1878.patch","issue_url":"https://api.github.com/repos/PX4/Firmware/issues/1878","number":1878,"state":"open","locked":false,"title":"Servo gimbal","user":{"login":"anton-matosov","id":3339485,"avatar_url":"https://avatars.githubusercontent.com/u/3339485?v=3","gravatar_id":"","url":"https://api.github.com/users/anton-matosov","html_url":"https://github.com/anton-matosov","followers_url":"https://api.github.com/users/anton-matosov/followers","following_url":"https://api.github.com/users/anton-matosov/following{/other_user}","gists_url":"https://api.github.com/users/anton-matosov/gists{/gist_id}","starred_url":"https://api.github.com/users/anton-matosov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anton-matosov/subscriptions","organizations_url":"https://api.github.com/users/anton-matosov/orgs","repos_url":"https://api.github.com/users/anton-matosov/repos","events_url":"https://api.github.com/users/anton-matosov/events{/privacy}","received_events_url":"https://api.github.com/users/anton-matosov/received_events","type":"User","site_admin":false},"body":"Added servo gimbal class provided by @LorenzMeier \r\nEnabled attitude compensation by default\r\nImplemented yaw compensation\r\nAdded missing MAVLink enum definitions for Gimbal related operations\r\nGot rid of float equality checks in Gimbal class\r\n\r\nDefined gimbal mixer scales for the \"default\" SK450 DeadCat inline servo gimbal with recommended servos. \r\n\r\nMade aux output pwm rate, min, max, disarmed and failsafe values configurable the same way as for the main outputs","created_at":"2015-03-04T07:58:47Z","updated_at":"2015-03-04T16:43:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9d893d3fa705646072d2b9f652c147a0835d56fd","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/PX4/Firmware/pulls/1878/commits","review_comments_url":"https://api.github.com/repos/PX4/Firmware/pulls/1878/comments","review_comment_url":"https://api.github.com/repos/PX4/Firmware/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PX4/Firmware/issues/1878/comments","statuses_url":"https://api.github.com/repos/PX4/Firmware/statuses/f271a78a2e3a773e021eff3309baaad2b87af0ca","head":{"label":"anton-matosov:ServoGimbal","ref":"ServoGimbal","sha":"f271a78a2e3a773e021eff3309baaad2b87af0ca","user":{"login":"anton-matosov","id":3339485,"avatar_url":"https://avatars.githubusercontent.com/u/3339485?v=3","gravatar_id":"","url":"https://api.github.com/users/anton-matosov","html_url":"https://github.com/anton-matosov","followers_url":"https://api.github.com/users/anton-matosov/followers","following_url":"https://api.github.com/users/anton-matosov/following{/other_user}","gists_url":"https://api.github.com/users/anton-matosov/gists{/gist_id}","starred_url":"https://api.github.com/users/anton-matosov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anton-matosov/subscriptions","organizations_url":"https://api.github.com/users/anton-matosov/orgs","repos_url":"https://api.github.com/users/anton-matosov/repos","events_url":"https://api.github.com/users/anton-matosov/events{/privacy}","received_events_url":"https://api.github.com/users/anton-matosov/received_events","type":"User","site_admin":false},"repo":{"id":24786074,"name":"Firmware","full_name":"anton-matosov/Firmware","owner":{"login":"anton-matosov","id":3339485,"avatar_url":"https://avatars.githubusercontent.com/u/3339485?v=3","gravatar_id":"","url":"https://api.github.com/users/anton-matosov","html_url":"https://github.com/anton-matosov","followers_url":"https://api.github.com/users/anton-matosov/followers","following_url":"https://api.github.com/users/anton-matosov/following{/other_user}","gists_url":"https://api.github.com/users/anton-matosov/gists{/gist_id}","starred_url":"https://api.github.com/users/anton-matosov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anton-matosov/subscriptions","organizations_url":"https://api.github.com/users/anton-matosov/orgs","repos_url":"https://api.github.com/users/anton-matosov/repos","events_url":"https://api.github.com/users/anton-matosov/events{/privacy}","received_events_url":"https://api.github.com/users/anton-matosov/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/anton-matosov/Firmware","description":"PX4 Firmware for PX4FMU autopilot and PX4IO servo / failsafe board","fork":true,"url":"https://api.github.com/repos/anton-matosov/Firmware","forks_url":"https://api.github.com/repos/anton-matosov/Firmware/forks","keys_url":"https://api.github.com/repos/anton-matosov/Firmware/keys{/key_id}","collaborators_url":"https://api.github.com/repos/anton-matosov/Firmware/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/anton-matosov/Firmware/teams","hooks_url":"https://api.github.com/repos/anton-matosov/Firmware/hooks","issue_events_url":"https://api.github.com/repos/anton-matosov/Firmware/issues/events{/number}","events_url":"https://api.github.com/repos/anton-matosov/Firmware/events","assignees_url":"https://api.github.com/repos/anton-matosov/Firmware/assignees{/user}","branches_url":"https://api.github.com/repos/anton-matosov/Firmware/branches{/branch}","tags_url":"https://api.github.com/repos/anton-matosov/Firmware/tags","blobs_url":"https://api.github.com/repos/anton-matosov/Firmware/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/anton-matosov/Firmware/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/anton-matosov/Firmware/git/refs{/sha}","trees_url":"https://api.github.com/repos/anton-matosov/Firmware/git/trees{/sha}","statuses_url":"https://api.github.com/repos/anton-matosov/Firmware/statuses/{sha}","languages_url":"https://api.github.com/repos/anton-matosov/Firmware/languages","stargazers_url":"https://api.github.com/repos/anton-matosov/Firmware/stargazers","contributors_url":"https://api.github.com/repos/anton-matosov/Firmware/contributors","subscribers_url":"https://api.github.com/repos/anton-matosov/Firmware/subscribers","subscription_url":"https://api.github.com/repos/anton-matosov/Firmware/subscription","commits_url":"https://api.github.com/repos/anton-matosov/Firmware/commits{/sha}","git_commits_url":"https://api.github.com/repos/anton-matosov/Firmware/git/commits{/sha}","comments_url":"https://api.github.com/repos/anton-matosov/Firmware/comments{/number}","issue_comment_url":"https://api.github.com/repos/anton-matosov/Firmware/issues/comments{/number}","contents_url":"https://api.github.com/repos/anton-matosov/Firmware/contents/{+path}","compare_url":"https://api.github.com/repos/anton-matosov/Firmware/compare/{base}...{head}","merges_url":"https://api.github.com/repos/anton-matosov/Firmware/merges","archive_url":"https://api.github.com/repos/anton-matosov/Firmware/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/anton-matosov/Firmware/downloads","issues_url":"https://api.github.com/repos/anton-matosov/Firmware/issues{/number}","pulls_url":"https://api.github.com/repos/anton-matosov/Firmware/pulls{/number}","milestones_url":"https://api.github.com/repos/anton-matosov/Firmware/milestones{/number}","notifications_url":"https://api.github.com/repos/anton-matosov/Firmware/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/anton-matosov/Firmware/labels{/name}","releases_url":"https://api.github.com/repos/anton-matosov/Firmware/releases{/id}","created_at":"2014-10-04T09:33:40Z","updated_at":"2015-03-04T06:37:54Z","pushed_at":"2015-03-04T15:07:51Z","git_url":"git://github.com/anton-matosov/Firmware.git","ssh_url":"git@github.com:anton-matosov/Firmware.git","clone_url":"https://github.com/anton-matosov/Firmware.git","svn_url":"https://github.com/anton-matosov/Firmware","homepage":"https://pixhawk.ethz.ch/px4/","size":67116,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"PX4:master","ref":"master","sha":"cf7f59e1f32977e49be9367b6441076ef77fa884","user":{"login":"PX4","id":2096014,"avatar_url":"https://avatars.githubusercontent.com/u/2096014?v=3","gravatar_id":"","url":"https://api.github.com/users/PX4","html_url":"https://github.com/PX4","followers_url":"https://api.github.com/users/PX4/followers","following_url":"https://api.github.com/users/PX4/following{/other_user}","gists_url":"https://api.github.com/users/PX4/gists{/gist_id}","starred_url":"https://api.github.com/users/PX4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PX4/subscriptions","organizations_url":"https://api.github.com/users/PX4/orgs","repos_url":"https://api.github.com/users/PX4/repos","events_url":"https://api.github.com/users/PX4/events{/privacy}","received_events_url":"https://api.github.com/users/PX4/received_events","type":"Organization","site_admin":false},"repo":{"id":5298790,"name":"Firmware","full_name":"PX4/Firmware","owner":{"login":"PX4","id":2096014,"avatar_url":"https://avatars.githubusercontent.com/u/2096014?v=3","gravatar_id":"","url":"https://api.github.com/users/PX4","html_url":"https://github.com/PX4","followers_url":"https://api.github.com/users/PX4/followers","following_url":"https://api.github.com/users/PX4/following{/other_user}","gists_url":"https://api.github.com/users/PX4/gists{/gist_id}","starred_url":"https://api.github.com/users/PX4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PX4/subscriptions","organizations_url":"https://api.github.com/users/PX4/orgs","repos_url":"https://api.github.com/users/PX4/repos","events_url":"https://api.github.com/users/PX4/events{/privacy}","received_events_url":"https://api.github.com/users/PX4/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/PX4/Firmware","description":"PX4 Firmware for PX4FMU autopilot and PX4IO servo / failsafe board","fork":false,"url":"https://api.github.com/repos/PX4/Firmware","forks_url":"https://api.github.com/repos/PX4/Firmware/forks","keys_url":"https://api.github.com/repos/PX4/Firmware/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PX4/Firmware/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PX4/Firmware/teams","hooks_url":"https://api.github.com/repos/PX4/Firmware/hooks","issue_events_url":"https://api.github.com/repos/PX4/Firmware/issues/events{/number}","events_url":"https://api.github.com/repos/PX4/Firmware/events","assignees_url":"https://api.github.com/repos/PX4/Firmware/assignees{/user}","branches_url":"https://api.github.com/repos/PX4/Firmware/branches{/branch}","tags_url":"https://api.github.com/repos/PX4/Firmware/tags","blobs_url":"https://api.github.com/repos/PX4/Firmware/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PX4/Firmware/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PX4/Firmware/git/refs{/sha}","trees_url":"https://api.github.com/repos/PX4/Firmware/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PX4/Firmware/statuses/{sha}","languages_url":"https://api.github.com/repos/PX4/Firmware/languages","stargazers_url":"https://api.github.com/repos/PX4/Firmware/stargazers","contributors_url":"https://api.github.com/repos/PX4/Firmware/contributors","subscribers_url":"https://api.github.com/repos/PX4/Firmware/subscribers","subscription_url":"https://api.github.com/repos/PX4/Firmware/subscription","commits_url":"https://api.github.com/repos/PX4/Firmware/commits{/sha}","git_commits_url":"https://api.github.com/repos/PX4/Firmware/git/commits{/sha}","comments_url":"https://api.github.com/repos/PX4/Firmware/comments{/number}","issue_comment_url":"https://api.github.com/repos/PX4/Firmware/issues/comments{/number}","contents_url":"https://api.github.com/repos/PX4/Firmware/contents/{+path}","compare_url":"https://api.github.com/repos/PX4/Firmware/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PX4/Firmware/merges","archive_url":"https://api.github.com/repos/PX4/Firmware/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PX4/Firmware/downloads","issues_url":"https://api.github.com/repos/PX4/Firmware/issues{/number}","pulls_url":"https://api.github.com/repos/PX4/Firmware/pulls{/number}","milestones_url":"https://api.github.com/repos/PX4/Firmware/milestones{/number}","notifications_url":"https://api.github.com/repos/PX4/Firmware/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PX4/Firmware/labels{/name}","releases_url":"https://api.github.com/repos/PX4/Firmware/releases{/id}","created_at":"2012-08-04T21:19:36Z","updated_at":"2015-03-04T08:34:19Z","pushed_at":"2015-03-04T14:46:06Z","git_url":"git://github.com/PX4/Firmware.git","ssh_url":"git@github.com:PX4/Firmware.git","clone_url":"https://github.com/PX4/Firmware.git","svn_url":"https://github.com/PX4/Firmware","homepage":"https://pixhawk.ethz.ch/px4/","size":137295,"stargazers_count":254,"watchers_count":254,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":886,"mirror_url":null,"open_issues_count":129,"forks":886,"open_issues":129,"watchers":254,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1878"},"html":{"href":"https://github.com/PX4/Firmware/pull/1878"},"issue":{"href":"https://api.github.com/repos/PX4/Firmware/issues/1878"},"comments":{"href":"https://api.github.com/repos/PX4/Firmware/issues/1878/comments"},"review_comments":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1878/comments"},"review_comment":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1878/commits"},"statuses":{"href":"https://api.github.com/repos/PX4/Firmware/statuses/f271a78a2e3a773e021eff3309baaad2b87af0ca"}}}}