GitHub PullRequestReviewCommentEvent at 2014-10-08 21:04:22
Repository: Firmware
Actor: thomasgubler
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/PX4/Firmware/pulls/comments/18612177","id":18612177,"diff_hunk":"@@ -0,0 +1,619 @@\n+#include \"ashtech.h\"\n+\n+#include <unistd.h>\n+#include <stdio.h>\n+#include <poll.h>\n+#include <math.h>\n+#include <string.h>\n+#include <assert.h>\n+#include <systemlib/err.h>\n+#include <uORB/uORB.h>\n+#include <uORB/topics/vehicle_gps_position.h>\n+#include <uORB/topics/satellite_info.h>\n+#include <drivers/drv_hrt.h>\n+\n+#include <fcntl.h>\n+#include <math.h>\n+\n+typedef double float64_t;\n+typedef float  float32_t;\n+\n+char*  str_scanDec(const char *pos, int8_t sign, int8_t n_max_digit, int32_t *result)\n+{\n+  int8_t n=0;\n+  int32_t d=0;\n+  int8_t neg = 0;\n+\n+  if(*pos == '-') { neg = 1; pos++; }\n+  else if(*pos == '+')     { pos++; }\n+  else if(sign) return(NULL);\n+  while(*pos >= '0' && *pos <= '9')\n+  {\n+     d = d*10 + (*(pos++) - '0');\n+     n++;\n+     if(n_max_digit>0 && n==n_max_digit) break;\n+  }\n+  if(n==0 || n>10) return(NULL);\n+  if(neg) *result = -d;\n+  else    *result =  d;\n+  return((char *)pos);\n+}\n+\n+char*  scanFloat64(const char *pos, int8_t sign, int8_t n_max_int, int8_t n_max_frac,\n+                       float64_t *result)\n+{\n+  float64_t f=0.0, div=1.0;\n+  int32_t d_int;\n+  int8_t n=0, isneg= 0;\n+\n+  if( *pos == '-' ) isneg= 1;\n+  if((pos = str_scanDec(pos, sign, n_max_int, &d_int)) == NULL) return(NULL);\n+  if(*(pos) == '.')\n+  {\n+     pos++;\n+     while(*pos >= '0' && *pos <= '9')\n+     {\n+        f = f*(10.0) + (float64_t)(*(pos++) - '0');\n+        div *= (0.1);\n+        n++;\n+        if(n_max_frac>0 && n==n_max_frac) break;\n+     }\n+  }\n+  else if(n_max_frac > 0) return(NULL);\n+  if( isneg ) *result = (float64_t)d_int - f*div;\n+  else        *result = (float64_t)d_int + f*div;\n+  return((char *)pos);\n+}\n+\n+\n+\n+ASHTECH::ASHTECH(const int &fd, struct vehicle_gps_position_s *gps_position, struct satellite_info_s *satellite_info):\n+_fd(fd),\n+_satellite_info(satellite_info),\n+_gps_position(gps_position)\n+{\n+    decode_init();  \n+    _decode_state = NME_DECODE_UNINIT;\n+    _rx_buffer_bytes = 0;\n+}\n+\n+ASHTECH::~ASHTECH(){\n+}\n+//All NMEA descriptions are taken from\n+//http://www.trimble.com/OEM_ReceiverHelp/V4.44/en/NMEA-0183messages_MessageOverview.html\n+int ASHTECH::handle_message(int len){\n+  if(len < 7) return 0;\n+  int uiCalcComma = 0;\n+  for(int i = 0 ; i < len; i++){\n+    if(_rx_buffer[i] == ',')uiCalcComma++;\n+  }\n+  char* bufptr = (char*)( _rx_buffer+6);\n+\n+  if((memcmp(_rx_buffer+3, \"ZDA,\",3) == 0)&&(uiCalcComma == 6)){\n+      /*\n+      UTC day, month, and year, and local time zone offset\n+      An example of the ZDA message string is:\n+\n+      $GPZDA,172809.456,12,07,1996,00,00*45\n+\n+      ZDA message fields\n+      Field\tMeaning\n+      0\tMessage ID $GPZDA\n+      1\tUTC\n+      2\tDay, ranging between 01 and 31\n+      3\tMonth, ranging between 01 and 12\n+      4\tYear\n+      5\tLocal time zone offset from GMT, ranging from 00 through �13 hours\n+      6\tLocal time zone offset from GMT, ranging from 00 through 59 minutes\n+      7\tThe checksum data, always begins with *\n+      Fields 5 and 6 together yield the total offset. For example, if field 5 is -5 and field 6 is +15, local time is 5 hours and 15 minutes earlier than GMT.\n+      */\n+      float64_t ashtech_time = 0.0;\n+      int day = 0, month = 0,year = 0,local_time_off_hour = 0,local_time_off_min = 0;\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&ashtech_time);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &day);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &month);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &year);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &local_time_off_hour);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &local_time_off_min);\n+\n+\n+      int ashtech_hour = ashtech_time/10000;\n+      int ashtech_minute = (ashtech_time - ashtech_hour*10000)/100;\n+      float64_t ashtech_sec = ashtech_time - ashtech_hour*10000 - ashtech_minute*100;\n+      //convert to unix timestamp\n+      struct tm timeinfo;\n+      timeinfo.tm_year = year - 1900;\n+      timeinfo.tm_mon = month - 1;\n+      timeinfo.tm_mday = day;\n+      timeinfo.tm_hour = ashtech_hour;\n+      timeinfo.tm_min = ashtech_minute;\n+      timeinfo.tm_sec = int(ashtech_sec);\n+      time_t epoch = mktime(&timeinfo);\n+\n+      _gps_position->time_gps_usec = (uint64_t)epoch * 1000000; //TODO: test this\n+      _gps_position->time_gps_usec += (uint64_t)((ashtech_sec - int(ashtech_sec)) * 1e6);\n+      _gps_position->timestamp_time = hrt_absolute_time();\n+    }\n+\n+  else if((memcmp(_rx_buffer+3, \"GGA,\",3) == 0)&&(uiCalcComma == 14)){\n+  /* \n+    Time, position, and fix related data\n+    An example of the GBS message string is:\n+\n+    $GPGGA,172814.0,3723.46587704,N,12202.26957864,W,2,6,1.2,18.893,M,-25.669,M,2.0,0031*4F\n+\n+    Note - The data string exceeds the ASHTECH standard length.\n+    GGA message fields\n+    Field   Meaning\n+    0   Message ID $GPGGA\n+    1   UTC of position fix\n+    2   Latitude\n+    3   Direction of latitude: \n+    N: North \n+    S: South\n+    4   Longitude\n+    5   Direction of longitude: \n+    E: East \n+    W: West\n+    6   GPS Quality indicator: \n+    0: Fix not valid \n+    1: GPS fix \n+    2: Differential GPS fix, OmniSTAR VBS \n+    4: Real-Time Kinematic, fixed integers \n+    5: Real-Time Kinematic, float integers, OmniSTAR XP/HP or Location RTK\n+    7   Number of SVs in use, range from 00 through to 24+\n+    8   HDOP\n+    9   Orthometric height (MSL reference)\n+    10  M: unit of measure for orthometric height is meters\n+    11  Geoid separation\n+    12  M: geoid separation measured in meters\n+    13  Age of differential GPS data record, Type 1 or Type 9. Null field when DGPS is not used.\n+    14  Reference station ID, range 0000-4095. A null field when any reference station ID is selected and no corrections are received1.\n+    15  \n+    The checksum data, always begins with *\n+    Note - If a user-defined geoid model, or an inclined\n+  */\n+      float64_t ashtech_time = 0.0, lat = 0.0, lon = 0.0, alt = 0.0;\n+      int num_of_sv = 0, fix_quality=0;\n+      float64_t hdop = 99.9;\n+      char ns = '?', ew = '?';\n+\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&ashtech_time);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&lat);\n+      if(bufptr && *(++bufptr) != ',') ns = *(bufptr++);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&lon);\n+      if(bufptr && *(++bufptr) != ',') ew = *(bufptr++);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &fix_quality);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &num_of_sv);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&hdop);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&alt);\n+\n+      if(ns == 'S')\n+        lat = -lat;\n+      if(ew == 'W')\n+        lon = -lon;\n+\n+      _gps_position->lat = (int(lat*0.01) + (lat*0.01 - int(lat*0.01))*100.0/60.0)*10000000;\n+      _gps_position->lon = (int(lon*0.01) + (lon*0.01 - int(lon*0.01))*100.0/60.0)*10000000;\n+      _gps_position->alt = alt*1000;\n+      _rate_count_lat_lon++;\n+\n+      if((lat == 0.0) && (lon == 0.0) && (alt == 0.0)){\n+        _gps_position->fix_type = 0;\n+      }\n+      else\n+        _gps_position->fix_type = 3 + fix_quality;\n+\n+\t  _gps_position->timestamp_position = hrt_absolute_time();\n+\n+      _gps_position->vel_m_s = 0;                                  /**< GPS ground speed (m/s) */\n+      _gps_position->vel_n_m_s = 0;                                /**< GPS ground speed in m/s */\n+      _gps_position->vel_e_m_s = 0;                                /**< GPS ground speed in m/s */\n+      _gps_position->vel_d_m_s = 0;                                /**< GPS ground speed in m/s */\n+      _gps_position->cog_rad = 0;                                  /**< Course over ground (NOT heading, but direction of movement) in rad, -PI..PI */\n+      _gps_position->vel_ned_valid = true;                         /**< Flag to indicate if NED speed is valid */\n+      _gps_position->c_variance_rad = 0.1;\n+      _gps_position->timestamp_velocity = hrt_absolute_time();\n+      return 1;\n+  }\n+  else if ((memcmp(_rx_buffer, \"$PASHR,POS,\", 11) == 0) && (uiCalcComma == 18)) {\n+  /*\n+\tExample $PASHR,POS,2,10,125410.00,5525.8138702,N,03833.9587380,E,131.555,1.0,0.0,0.007,-0.001,2.0,1.0,1.7,1.0,*34\n+\n+      $PASHR,POS,d1,d2,m3,m4,c5,m6,c7,f8,f9,f10,f11,f12,f13,f14,f15,f16,s17*cc \n+      Parameter Description Range \n+        d1 Position mode 0: standalone \n+                         1: differential \n+                         2: RTK float \n+                         3: RTK fixed \n+                         5: Dead reckoning \n+                         9: SBAS (see NPT setting) \n+        d2 Number of satellite used in position fix 0-99\n+        m3 Current UTC time of position fix (hhmmss.ss) 000000.00-235959.99 \n+        m4 Latitude of position (ddmm.mmmmmm) 0-90 degrees 00-59.9999999 minutes \n+        c5 Latitude sector N, S\n+        m6 Longitude of position (dddmm.mmmmmm) 0-180 degrees 00-59.9999999 minutes \n+        c7 Longitude sector E,W\n+        f8 Altitude above ellipsoid +9999.000\n+        f9 Differential age (data link age), seconds 0.0-600.0\n+        f10 True track/course over ground in degrees 0.0-359.9\n+        f11 Speed over ground in knots 0.0-999.9\n+        f12 Vertical velocity in decimeters per second +999.9 \n+        f13 PDOP 0-99.9 \n+        f14 HDOP 0-99.9 \n+        f15 VDOP 0-99.9 \n+        f16 TDOP 0-99.9 \n+        s17 Reserved no data \n+        *cc Checksum \n+      */\n+      bufptr = (char*)( _rx_buffer+10);\n+      float64_t ashtech_time = 0.0, lat = 0.0, lon = 0.0, alt = 0.0;\n+      int num_of_sv = 0, fix_quality=0;\n+      float64_t track_true = 0.0, ground_speed = 0.0 , age_of_corr = 0.0;\n+      float64_t hdop = 99.9, vdop = 99.9,  pdop = 99.9, tdop = 99.9,vertic_vel = 0.0;\n+      char ns = '?', ew = '?';\n+\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &fix_quality);\n+      if(bufptr && *(++bufptr) != ',') bufptr = str_scanDec(bufptr, 0, 9, &num_of_sv);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&ashtech_time);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&lat);\n+      if(bufptr && *(++bufptr) != ',') ns = *(bufptr++);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&lon);\n+      if(bufptr && *(++bufptr) != ',') ew = *(bufptr++);      \n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&alt);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&age_of_corr);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&track_true);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&ground_speed);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&vertic_vel);      \n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&pdop);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&hdop);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&vdop);\n+      if(bufptr && *(++bufptr) != ',') bufptr = scanFloat64(bufptr, 0, 9, 9,&tdop);\n+\n+      if(ns == 'S')\n+        lat = -lat;\n+      if(ew == 'W')\n+        lon = -lon;\n+\n+      _gps_position->lat = (int(lat*0.01) + (lat*0.01 - int(lat*0.01))*100.0/60.0)*10000000;\n+      _gps_position->lon = (int(lon*0.01) + (lon*0.01 - int(lon*0.01))*100.0/60.0)*10000000;\n+      _gps_position->alt = alt*1000;\n+      _rate_count_lat_lon++;\n+\n+      if((lat == 0.0) && (lon == 0.0) && (alt == 0.0)){\n+    \t  _gps_position->fix_type = 0;\n+      }\n+      else\n+         _gps_position->fix_type = 3 + fix_quality;\n+\n+      _gps_position->timestamp_position = hrt_absolute_time();\n+   \n+      const float64_t m_pi  = 3.14159265;\n+\n+      double track_rad = track_true * m_pi / 180.0;\n+\n+\t  \tdouble velocity_ms = ground_speed  / 1.9438445;\t\t\t/** knots to m/s */\n+\t\tdouble velocity_north = velocity_ms * cos(track_rad);\n+\t\tdouble velocity_east  = velocity_ms * sin(track_rad);\n+\n+\t\t_gps_position->vel_m_s = velocity_ms;                            /**< GPS ground speed (m/s) */\n+\t\t_gps_position->vel_n_m_s = velocity_north;                       /**< GPS ground speed in m/s */\n+\t\t_gps_position->vel_e_m_s = velocity_east;                        /**< GPS ground speed in m/s */\n+\t\t_gps_position->vel_d_m_s = -vertic_vel;                      /**< GPS ground speed in m/s */\n+\t\t_gps_position->cog_rad = track_rad;                              /**< Course over ground (NOT heading, but direction of movement) in rad, -PI..PI */\n+\t\t_gps_position->vel_ned_valid = true;                             /**< Flag to indicate if NED speed is valid */\n+\t\t_gps_position->c_variance_rad = 0.1;\n+\t\t_gps_position->timestamp_velocity = hrt_absolute_time();\n+      return 1;\n+\n+  }\n+  else if((memcmp(_rx_buffer+3, \"GST,\",3) == 0)&&(uiCalcComma == 8)){","path":"src/drivers/gps/ashtech.cpp","position":311,"original_position":311,"commit_id":"1bf1cec5672a7f30656e3fe44535ab0390bbd2d0","original_commit_id":"1bf1cec5672a7f30656e3fe44535ab0390bbd2d0","user":{"login":"thomasgubler","id":1419479,"avatar_url":"https://avatars.githubusercontent.com/u/1419479?v=2","gravatar_id":"","url":"https://api.github.com/users/thomasgubler","html_url":"https://github.com/thomasgubler","followers_url":"https://api.github.com/users/thomasgubler/followers","following_url":"https://api.github.com/users/thomasgubler/following{/other_user}","gists_url":"https://api.github.com/users/thomasgubler/gists{/gist_id}","starred_url":"https://api.github.com/users/thomasgubler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thomasgubler/subscriptions","organizations_url":"https://api.github.com/users/thomasgubler/orgs","repos_url":"https://api.github.com/users/thomasgubler/repos","events_url":"https://api.github.com/users/thomasgubler/events{/privacy}","received_events_url":"https://api.github.com/users/thomasgubler/received_events","type":"User","site_admin":false},"body":"else if belongs on line above, space missing in front of {\r\n\r\nThere are quite a lot of other instances of non px4 code style, check http://pixhawk.org/dev/code_style and try to run `./Tools/fix_code_style.sh src/drivers/gps/ashtech.cpp`","created_at":"2014-10-08T21:04:22Z","updated_at":"2014-10-08T21:04:22Z","html_url":"https://github.com/PX4/Firmware/pull/1381#discussion_r18612177","pull_request_url":"https://api.github.com/repos/PX4/Firmware/pulls/1381","_links":{"self":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/comments/18612177"},"html":{"href":"https://github.com/PX4/Firmware/pull/1381#discussion_r18612177"},"pull_request":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1381"}}},"pull_request":{"url":"https://api.github.com/repos/PX4/Firmware/pulls/1381","id":22449504,"html_url":"https://github.com/PX4/Firmware/pull/1381","diff_url":"https://github.com/PX4/Firmware/pull/1381.diff","patch_url":"https://github.com/PX4/Firmware/pull/1381.patch","issue_url":"https://api.github.com/repos/PX4/Firmware/issues/1381","number":1381,"state":"open","locked":false,"title":"Ashtech GNSS receiver driver","user":{"login":"dyeldandi","id":820588,"avatar_url":"https://avatars.githubusercontent.com/u/820588?v=2","gravatar_id":"","url":"https://api.github.com/users/dyeldandi","html_url":"https://github.com/dyeldandi","followers_url":"https://api.github.com/users/dyeldandi/followers","following_url":"https://api.github.com/users/dyeldandi/following{/other_user}","gists_url":"https://api.github.com/users/dyeldandi/gists{/gist_id}","starred_url":"https://api.github.com/users/dyeldandi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dyeldandi/subscriptions","organizations_url":"https://api.github.com/users/dyeldandi/orgs","repos_url":"https://api.github.com/users/dyeldandi/repos","events_url":"https://api.github.com/users/dyeldandi/events{/privacy}","received_events_url":"https://api.github.com/users/dyeldandi/received_events","type":"User","site_admin":false},"body":"Added driver for Ashtech GNSS receiver with 20Hz position update rate.\r\n\r\nAshtech driver will increase fix_type (visible in sdlog or QGC) to 4, 5 or 6 depending on RTCM/RTK differential status.\r\n\r\nTested on Ashtech MB100 board. \r\n\r\nThe following logfile was recorded during flight without RTK diff corrections, only RTCM differential (SBAS) was used, so eph was about 0.5.\r\nhttps://www.dropbox.com/s/mj5pssn6isxvb25/15_21_15.bin?dl=0\r\n\r\nThe following logfile was recorded during flight with RTK diff corrections and eph was about 0.02\r\nhttps://www.dropbox.com/s/cj4m9sap6bl94l3/09_43_12.bin?dl=0\r\n\r\n","created_at":"2014-10-08T19:52:37Z","updated_at":"2014-10-08T21:04:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3a68726585651228959a35a4d28105428b42cc87","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/PX4/Firmware/pulls/1381/commits","review_comments_url":"https://api.github.com/repos/PX4/Firmware/pulls/1381/comments","review_comment_url":"https://api.github.com/repos/PX4/Firmware/pulls/comments/{number}","comments_url":"https://api.github.com/repos/PX4/Firmware/issues/1381/comments","statuses_url":"https://api.github.com/repos/PX4/Firmware/statuses/1bf1cec5672a7f30656e3fe44535ab0390bbd2d0","head":{"label":"dyeldandi:ashtech_hi_freq","ref":"ashtech_hi_freq","sha":"1bf1cec5672a7f30656e3fe44535ab0390bbd2d0","user":{"login":"dyeldandi","id":820588,"avatar_url":"https://avatars.githubusercontent.com/u/820588?v=2","gravatar_id":"","url":"https://api.github.com/users/dyeldandi","html_url":"https://github.com/dyeldandi","followers_url":"https://api.github.com/users/dyeldandi/followers","following_url":"https://api.github.com/users/dyeldandi/following{/other_user}","gists_url":"https://api.github.com/users/dyeldandi/gists{/gist_id}","starred_url":"https://api.github.com/users/dyeldandi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dyeldandi/subscriptions","organizations_url":"https://api.github.com/users/dyeldandi/orgs","repos_url":"https://api.github.com/users/dyeldandi/repos","events_url":"https://api.github.com/users/dyeldandi/events{/privacy}","received_events_url":"https://api.github.com/users/dyeldandi/received_events","type":"User","site_admin":false},"repo":{"id":24495424,"name":"Firmware","full_name":"dyeldandi/Firmware","owner":{"login":"dyeldandi","id":820588,"avatar_url":"https://avatars.githubusercontent.com/u/820588?v=2","gravatar_id":"","url":"https://api.github.com/users/dyeldandi","html_url":"https://github.com/dyeldandi","followers_url":"https://api.github.com/users/dyeldandi/followers","following_url":"https://api.github.com/users/dyeldandi/following{/other_user}","gists_url":"https://api.github.com/users/dyeldandi/gists{/gist_id}","starred_url":"https://api.github.com/users/dyeldandi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dyeldandi/subscriptions","organizations_url":"https://api.github.com/users/dyeldandi/orgs","repos_url":"https://api.github.com/users/dyeldandi/repos","events_url":"https://api.github.com/users/dyeldandi/events{/privacy}","received_events_url":"https://api.github.com/users/dyeldandi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dyeldandi/Firmware","description":"PX4 Firmware for PX4FMU autopilot and PX4IO servo / failsafe board","fork":true,"url":"https://api.github.com/repos/dyeldandi/Firmware","forks_url":"https://api.github.com/repos/dyeldandi/Firmware/forks","keys_url":"https://api.github.com/repos/dyeldandi/Firmware/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dyeldandi/Firmware/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dyeldandi/Firmware/teams","hooks_url":"https://api.github.com/repos/dyeldandi/Firmware/hooks","issue_events_url":"https://api.github.com/repos/dyeldandi/Firmware/issues/events{/number}","events_url":"https://api.github.com/repos/dyeldandi/Firmware/events","assignees_url":"https://api.github.com/repos/dyeldandi/Firmware/assignees{/user}","branches_url":"https://api.github.com/repos/dyeldandi/Firmware/branches{/branch}","tags_url":"https://api.github.com/repos/dyeldandi/Firmware/tags","blobs_url":"https://api.github.com/repos/dyeldandi/Firmware/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dyeldandi/Firmware/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dyeldandi/Firmware/git/refs{/sha}","trees_url":"https://api.github.com/repos/dyeldandi/Firmware/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dyeldandi/Firmware/statuses/{sha}","languages_url":"https://api.github.com/repos/dyeldandi/Firmware/languages","stargazers_url":"https://api.github.com/repos/dyeldandi/Firmware/stargazers","contributors_url":"https://api.github.com/repos/dyeldandi/Firmware/contributors","subscribers_url":"https://api.github.com/repos/dyeldandi/Firmware/subscribers","subscription_url":"https://api.github.com/repos/dyeldandi/Firmware/subscription","commits_url":"https://api.github.com/repos/dyeldandi/Firmware/commits{/sha}","git_commits_url":"https://api.github.com/repos/dyeldandi/Firmware/git/commits{/sha}","comments_url":"https://api.github.com/repos/dyeldandi/Firmware/comments{/number}","issue_comment_url":"https://api.github.com/repos/dyeldandi/Firmware/issues/comments/{number}","contents_url":"https://api.github.com/repos/dyeldandi/Firmware/contents/{+path}","compare_url":"https://api.github.com/repos/dyeldandi/Firmware/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dyeldandi/Firmware/merges","archive_url":"https://api.github.com/repos/dyeldandi/Firmware/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dyeldandi/Firmware/downloads","issues_url":"https://api.github.com/repos/dyeldandi/Firmware/issues{/number}","pulls_url":"https://api.github.com/repos/dyeldandi/Firmware/pulls{/number}","milestones_url":"https://api.github.com/repos/dyeldandi/Firmware/milestones{/number}","notifications_url":"https://api.github.com/repos/dyeldandi/Firmware/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dyeldandi/Firmware/labels{/name}","releases_url":"https://api.github.com/repos/dyeldandi/Firmware/releases{/id}","created_at":"2014-09-26T10:20:37Z","updated_at":"2014-09-30T10:05:08Z","pushed_at":"2014-10-08T19:38:37Z","git_url":"git://github.com/dyeldandi/Firmware.git","ssh_url":"git@github.com:dyeldandi/Firmware.git","clone_url":"https://github.com/dyeldandi/Firmware.git","svn_url":"https://github.com/dyeldandi/Firmware","homepage":"https://pixhawk.ethz.ch/px4/","size":63171,"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":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"PX4:master","ref":"master","sha":"af783d4d98c596a4288ec9da7f3facfd6f281933","user":{"login":"PX4","id":2096014,"avatar_url":"https://avatars.githubusercontent.com/u/2096014?v=2","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=2","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":"2014-10-08T13:26:46Z","pushed_at":"2014-10-08T16:53:20Z","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":135697,"stargazers_count":173,"watchers_count":173,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":564,"mirror_url":null,"open_issues_count":97,"forks":564,"open_issues":97,"watchers":173,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1381"},"html":{"href":"https://github.com/PX4/Firmware/pull/1381"},"issue":{"href":"https://api.github.com/repos/PX4/Firmware/issues/1381"},"comments":{"href":"https://api.github.com/repos/PX4/Firmware/issues/1381/comments"},"review_comments":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1381/comments"},"review_comment":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/PX4/Firmware/pulls/1381/commits"},"statuses":{"href":"https://api.github.com/repos/PX4/Firmware/statuses/1bf1cec5672a7f30656e3fe44535ab0390bbd2d0"}}}}