{"action":"created","comment":{"url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/comments/49927646","id":49927646,"diff_hunk":"@@ -0,0 +1,901 @@\n+/*\n+    Global data for GPSBabel.\n+\n+    Copyright (C) 2012-2016, Zingo Andersen zingo@zingo.org\n+    Copyright (C) 2016 Robert Lipe, robertlipe+source@gpsbabel.org\n+\n+    This program is free software; you can redistribute it and/or modify\n+    it under the terms of the GNU General Public License as published by\n+    the Free Software Foundation; either version 2 of the License, or\n+    (at your option) any later version.\n+\n+    This program is distributed in the hope that it will be useful,\n+    but WITHOUT ANY WARRANTY; without even the implied warranty of\n+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+    GNU General Public License for more details.\n+\n+    You should have received a copy of the GNU General Public License\n+    along with this program; if not, write to the Free Software\n+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA\n+\n+ */\n+/*\n+ * This is the bridge between the GPSBabel and globalsat sport devices\n+ * gh625XT. Globalsat has a few devices under the sport brand and they\n+ * are using a similar USB serial protocal.\n+ * Currently only gh625XT is supported by this driver but the code could\n+ * extended (maybe autodetect) support more devices in the future.\n+ *\n+ * The code is based on GH625XT-COMMUNICATION_SPECS_20111205-1.pdf from Globasat\n+ * that they nicely supplied on request.\n+ *\n+ * Usage examples:\n+ * gpsbabel -i globalsat -f /dev/ttyUSB0 -o gpx,garminextensions -F xxx.gpx\n+ * gpsbabel -i globalsat -f /dev/ttyUSB0 -o gtrnctr,course=0,sport=Running -F xxx.fit\n+ *\n+ */\n+\n+\n+#include <ctype.h>\n+#include <limits.h>\n+#include <stdio.h>\n+#include \"defs.h\"\n+#include \"gbser.h\"\n+\n+#define MYNAME \"GlobalsatSport\"\n+\n+static void *serial_handle;\n+static int isSizeSwaped;\n+\n+static char *showlist = NULL;               // if true show a list instead of download tracks\n+static char *track = 0;                     // if not 0 only download this track, if 0 download all\n+\n+static char* opt_dump_file = 0;\t            // dump raw data to this file (optional)\n+static char *opt_input_dump_file = NULL;    // if true input is from a dump-file instead of serial console\n+static gbfile* dumpfile = NULL;             // used for creating bin/RAW datadump files, usefull for testing\n+static gbfile* in_file = NULL;              // used for reading from bin/RAW datadump files, usefull for testing\n+\n+static\n+arglist_t globalsat_args[] = {\n+\t\t{\"showlist\", &showlist, \"list tracks\", NULL, ARGTYPE_BOOL, ARG_NOMINMAX},\n+\t\t{\"track\", &track, \"get track\", \"0\", ARGTYPE_INT, ARG_NOMINMAX},\n+\t\t{\"dump-file\", &opt_dump_file, \"Dump raw data to this file\", NULL, ARGTYPE_OUTFILE, ARG_NOMINMAX},\n+\t\t{\"input-is-dump-file\", &opt_input_dump_file, \"Dump raw data to this file\", NULL, ARGTYPE_BOOL, ARG_NOMINMAX},\n+\t\tARG_TERMINATOR\n+};\n+\n+typedef enum\n+{\n+\tCommandWhoAmI = 0xBF,\n+\tCommandGetSystemInformation = 0x85,\n+\tCommandGetSystemConfiguration = 0x86,\n+\n+\tCommandSetSystemConfiguration = 0x96,\n+\tCommandSetSystemInformation = 0x98,\n+\tCommandGetScreenshot = 0x83,\n+\n+\tCommandGetWaypoints = 0x77,\n+\tCommandSendWaypoint = 0x76,\n+\tCommandDeleteWaypoints = 0x75,\n+\n+\tCommandSendRoute = 0x93,\n+\tCommandDeleteAllRoutes = 0x97,\n+\n+\tCommandGetTrackFileHeaders = 0x78,\n+\tCommandGetTrackFileSections = 0x80,\n+\tCommandGetNextTrackSection = 0x81,\n+\t//CommandReGetLastSection = 0x82,\n+\tCommandId_FINISH = 0x8A,\n+\tCommandSendTrackStart = 0x90,\n+\tCommandSendTrackSection = 0x91,\n+\n+\tHeaderTypeLaps = 0xAA,\n+\tHeaderTypeTrackPoints = 0x55,\n+\n+\tResponseInsuficientMemory = 0x95,\n+\tResponseResendTrackSection = 0x92,\n+\tResponseSendTrackFinish = 0x9A\n+} globalsat_commands_e;\n+\n+typedef struct tagDATE\n+{\n+\tuint8_t Year;\n+\tuint8_t Month;\n+\tuint8_t Day;\n+} gh_date;\n+\n+typedef struct tagTIME\n+{\n+\tuint8_t Hour;\n+\tuint8_t Minute;\n+\tuint8_t Second;\n+} gh_time;\n+\n+typedef struct tagTRAINHEADER\n+{\n+\tgh_date dateStart;\n+\tgh_time timeStart;\n+\tuint32_t TotalPoint;\t\t//6-9\n+\tuint32_t TotalTime;\t\t//10-13\n+\tuint32_t TotalDistance;\t//14-17\n+\tuint16_t LapCnts;\t\t//18-19\n+\tunion\n+\t{\n+\t\tuint32_t Index;\n+\t\tuint32_t StartPt;\n+\t} gh_ptrec;\t\t\t//20-23\n+\tunion\n+\t{\n+\t\tuint32_t LapIndex;\n+\t\tuint32_t EndPt;\n+\t} gh_laprec;\t\t\t//24-27\n+\tuint8_t DataType;\t\t//28\n+} gh_trainheader;\n+\n+typedef struct tagDB_TRAIN\n+{\n+\tgh_date dateStart;\n+\tgh_time timeStart;\n+\tuint32_t TotalPoint;\t\t//6-9\n+\tuint32_t TotalTime;\t\t//10-13\n+\tuint32_t TotalDistance;\t//14-17\n+\tuint16_t LapCnts;\t\t//18-19\n+\tunion\n+\t{\n+\t\tuint32_t Index;\n+\t\tuint32_t StartPt;\n+\t} gh_ptrec;\t\t\t//20-23\n+\tunion\n+\t{\n+\t\tuint32_t LapIndex;\n+\t\tuint32_t EndPt;\n+\t} gh_laprec;\t\t\t//24-27\n+\tuint8_t MultiSport;\t\t//28 on/off\n+\tuint16_t Calory;\t\t//29-30\n+\tuint32_t MaxSpeed;\n+\tuint8_t MaxHeart;\n+\tuint8_t AvgHeart;\n+\n+\tuint16_t Ascent;\n+\tuint16_t Descent;\n+\n+\tint16_t MinAlti;\n+\tint16_t MaxAlti;\n+\tuint16_t AvgCadns;\n+\tuint16_t BestCadns;\n+\tuint16_t AvgPower;\n+\tuint16_t MaxPower;\n+\tuint8_t Sport1;\n+\tuint8_t Sport2;\n+\tuint8_t Sport3;\n+\tuint8_t Sport4;\n+\tuint8_t Sport5;\n+} gh_db_train;\n+\n+typedef struct tagDB_LAP\n+{\n+\tuint32_t AccruedTime;\n+\tuint32_t TotalTime;\n+\tuint32_t TotalDistance;\n+\tuint16_t Calory;\n+\tuint32_t MaxSpeed;\n+\tuint8_t MaxHeart;\n+\tuint8_t AvgHeart;\n+\tint16_t MinAlti;\n+\tint16_t MaxAlti;\n+\tuint16_t AvgCadns;\n+\tuint16_t BestCadns;\n+\tuint16_t AvgPower;\n+\tuint16_t MaxPower;\n+\tuint8_t MultiSportIndex;\n+\tuint32_t StartPt;\n+\tuint32_t EndPt;\n+} gh_db_lap;\n+\n+typedef struct tagRECPOINT\n+{\n+\tuint32_t Latitude;\n+\tuint32_t Longitude;\n+\tint16_t Altitude;\n+\tuint32_t Speed;\n+\tuint8_t HeartRate;\n+\tuint32_t IntervalTime;\n+\tuint16_t Cadence;\n+\tuint16_t PwrCadence;\n+\tuint16_t Power;\n+} gh_recpoint;\n+\n+static void\n+serial_init(const char *fname)\n+{\n+\tif (serial_handle = gbser_init(fname), NULL == serial_handle) {\n+\t\tfatal(MYNAME \": Can't open port '%s'\\n\", fname);\n+\t}\n+\tif (gbser_set_speed(serial_handle, 115200) != gbser_OK) {\n+\t\tfatal(MYNAME \": Can't configure port '%s'\\n\", fname);\n+\t}\n+\t// Toss anything that came in before our speed was set\n+\tgbser_flush(serial_handle);\n+}\n+\n+static void\n+serial_deinit(void)\n+{\n+    if (global_opts.debug_level > 1) {\n+\t\tprintf(MYNAME \" serial_deinit()\\n\");\n+\t}\n+\tgbser_deinit(serial_handle);\n+\tserial_handle = NULL;\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(MYNAME \" serial_deinit() Done\\n\");\n+\t}\n+}\n+\n+static int\n+serial_recv_byte()\n+{\n+\tint result;\n+\t/* allow for a delay of 4s */\n+\tresult = gbser_readc_wait(serial_handle, 4000);\n+\tswitch (result) {\n+\tcase gbser_ERROR:\n+\t\tfatal(\"serial_recv_byte(): error reading one byte\\n\");\n+\t\tbreak;\n+\tcase gbser_NOTHING:\n+\t\tfatal(\"serial_recv_byte(): read timeout\\n\");\n+\t\tbreak;\n+\t}\n+\treturn result;\n+}\n+\n+static void\n+serial_write_byte(uint8_t byte)\n+{\n+\tint n;\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(\"0x%02x (%d), \", byte, byte);\n+\t}\n+\n+\tn = gbser_writec(serial_handle, byte);\n+\tif (n == gbser_ERROR) {\n+\t\tfatal(\"globalsat_probe_device(): write failed\\n\");\n+\t}\n+}\n+\n+static int\n+recv_byte()\n+{\n+\tint result=0;\n+\t// Read from serial or dumpfile\n+\tif (!opt_input_dump_file) {\n+\t\tresult=serial_recv_byte();\n+\t} else {\n+\t\tint bytes;\n+\t\tbytes=gbfread(&result, 1, 1, in_file);\n+\t\tis_fatal((bytes != 1), MYNAME \": read error\");\n+\t}\n+\t// Check if byte sould be dumped also into a file\n+\tif (dumpfile) {\n+      gbfwrite(&result, 1, 1, dumpfile);\n+    }\n+return result;\n+}\n+\n+static void\n+write_byte(uint8_t byte)\n+{\n+\t// Write serial or not at all if input is a dumpfile\n+\tif (!opt_input_dump_file) {\n+\t\tserial_write_byte(byte);\n+\t}\n+\t//else {\n+\t// Do nothing as commands are not used when dumpfile is used instead\n+\t// of serial device\n+\t//}\n+}\n+\n+\n+static void\n+globalsat_write_package(uint8_t * payload, uint32_t size)\n+{\n+\t//All globalsat devices but gh561\n+\t//2 <len_h> <len_l> <payload...> <crc>\n+\t// gh561 (isSizeSwaped)\n+\t//2 <len_l> <len_h> <payload...> <crc>\n+\n+\tuint32_t i;\n+\n+\tuint8_t crc = 0;\n+\twrite_byte(2);\n+\n+\tif (!isSizeSwaped) {\n+\t\twrite_byte((0xff00 & size) >> 8);\n+\t\tcrc ^= (0xff00 & size) >> 8;\n+\t\twrite_byte(0xff & size);\n+\t\tcrc ^= (0xff & size);\n+\t}\n+\telse {\n+\t\twrite_byte(0xff & size);\n+\t\tcrc ^= (0xff & size);\n+\t\twrite_byte((0xff00 & size) >> 8);\n+\t\tcrc ^= (0xff00 & size) >> 8;\n+\t}\n+\n+\tif (payload != NULL) {\n+\t\tfor (i = 0; i < size; i++) {\n+\t\t\twrite_byte(payload[i]);\n+\t\t\tcrc ^= payload[i];\n+\t\t}\n+\t}\n+\twrite_byte(crc);\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(\"\\n\");\n+\t}\n+}\n+\n+static uint8_t *\n+globalsat_read_package(int *out_length, uint8_t * out_DeviceCommand)\n+{\n+\tuint8_t DeviceCommand, len_h, len_l, crc;\n+\tuint8_t *payload;\n+\tint length;\n+\tint i;\n+\tuint8_t calc_crc = 0;\n+\n+\tDeviceCommand = recv_byte();\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(\"DeviceCommand: 0x%02x \", DeviceCommand);\n+\t}\n+\tlen_h = recv_byte();\n+\tcalc_crc ^= len_h;\n+\tlen_l = recv_byte();\n+\tcalc_crc ^= len_l;\n+\n+\tlength = (len_h << 8) + len_l;\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(\"len=%d Payload:\", length);\n+\t}\n+\n+\tpayload = (uint8_t *) malloc(length);\n+\tif (payload == NULL) {\n+\t\tgoto error_out;\n+\t}\n+\n+\tfor (i = 0; i < length; i++) {\n+\t\tpayload[i] = recv_byte();\n+\t\tcalc_crc ^= payload[i];\n+\t}\n+\n+\tcrc = recv_byte();\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(\"crc=0x%x should be=0x%x\\n\", crc, calc_crc);\n+\t}\n+\tif (crc == calc_crc) {\n+\t\t*out_DeviceCommand = DeviceCommand;\n+\t\t*out_length = length;\n+\t\treturn payload;\n+\t}\n+\t//crc error\n+\tfree(payload);\n+\terror_out:\n+\t*out_length = 0;\n+\treturn NULL;\n+}\n+\n+/*\n+ * Send one byte package\n+ */\n+static void\n+globalsat_send_simple(uint8_t command)\n+{\n+\tuint8_t payload[1];\n+\tpayload[0] = command;\n+\tglobalsat_write_package(payload, 1);\n+}\n+\n+static void\n+globalsat_probe_device()\n+{\n+\t//TODO try this first if fails try with false, to support 561\n+\tisSizeSwaped = FALSE;\t\t//all devices but gh561 since gh561 has swaped size.\n+\n+\tglobalsat_send_simple(CommandWhoAmI);\n+\n+\tuint8_t *payload;\n+\tint len;\n+\tuint8_t DeviceCommand;\n+\tpayload = globalsat_read_package(&len, &DeviceCommand);\n+\tif ((len > 0) && (payload != NULL)) {\n+\t\tif (global_opts.debug_level > 1) {\n+\t\t\tprintf(\"Got package!!!\\n\");\n+\t\t}\n+\t\t//TODO figure out what device it is if we start to support more devices then gh625XT\n+\t}\n+\n+\tif (payload) {\n+\t\tfree(payload);\n+\t}\n+}\n+\n+static void\n+rd_init(const char *fname)\n+{\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(MYNAME \" rd_init()\\n\");\n+\t}\n+\tif (opt_dump_file) {\n+    \tdumpfile = gbfopen(opt_dump_file, \"w\", MYNAME);\n+    \tif (!dumpfile) {\n+\t\t\tprintf(MYNAME \" rd_init() creating dumpfile %s FAILED continue anyway\\n\",opt_dump_file);\n+    \t} else {\n+\t    \tif (global_opts.debug_level > 1) {\n+   \t\t\t\tprintf(MYNAME \" rd_init() creating dumpfile %s for writing binnary copy of serial stream\\n\",opt_dump_file);\n+   \t\t\t}\n+\t\t}\n+    }\n+    if (!opt_input_dump_file)\n+    {\n+\t\tserial_init(fname);\n+    } else {\n+    \t// read from dump-file instead of serial\n+        in_file = gbfopen(fname, \"r\", MYNAME);\n+        is_fatal(!in_file, \"Could not open dumpfile for input: %s\", fname);\n+\n+    }\n+\tglobalsat_probe_device();\n+}\n+\n+static void\n+wr_init(const char *fname)\n+{\n+\tif (global_opts.debug_level > 1) {\n+\t\tprintf(MYNAME \" wr_init()\\n\");\n+\t}\n+\tserial_init(fname);\n+}\n+\n+\n+static void\n+rd_deinit(void)\n+{","path":"globalsat_sport.cc","position":460,"original_position":460,"commit_id":"9da84a5465703d48fb59f22bad8e8bc919df4020","original_commit_id":"9da84a5465703d48fb59f22bad8e8bc919df4020","user":{"login":"robertlipe","id":8724975,"avatar_url":"https://avatars.githubusercontent.com/u/8724975?v=3","gravatar_id":"","url":"https://api.github.com/users/robertlipe","html_url":"https://github.com/robertlipe","followers_url":"https://api.github.com/users/robertlipe/followers","following_url":"https://api.github.com/users/robertlipe/following{/other_user}","gists_url":"https://api.github.com/users/robertlipe/gists{/gist_id}","starred_url":"https://api.github.com/users/robertlipe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/robertlipe/subscriptions","organizations_url":"https://api.github.com/users/robertlipe/orgs","repos_url":"https://api.github.com/users/robertlipe/repos","events_url":"https://api.github.com/users/robertlipe/events{/privacy}","received_events_url":"https://api.github.com/users/robertlipe/received_events","type":"User","site_admin":false},"body":"I'll fix indention later.","created_at":"2016-01-16T05:36:26Z","updated_at":"2016-01-16T05:36:26Z","html_url":"https://github.com/gpsbabel/gpsbabel/pull/20#discussion_r49927646","pull_request_url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20","_links":{"self":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/comments/49927646"},"html":{"href":"https://github.com/gpsbabel/gpsbabel/pull/20#discussion_r49927646"},"pull_request":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20"}}},"pull_request":{"url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20","id":54934622,"html_url":"https://github.com/gpsbabel/gpsbabel/pull/20","diff_url":"https://github.com/gpsbabel/gpsbabel/pull/20.diff","patch_url":"https://github.com/gpsbabel/gpsbabel/pull/20.patch","issue_url":"https://api.github.com/repos/gpsbabel/gpsbabel/issues/20","number":20,"state":"open","locked":false,"title":"Add support for Globalsat gh625XT","user":{"login":"zingo","id":368986,"avatar_url":"https://avatars.githubusercontent.com/u/368986?v=3","gravatar_id":"","url":"https://api.github.com/users/zingo","html_url":"https://github.com/zingo","followers_url":"https://api.github.com/users/zingo/followers","following_url":"https://api.github.com/users/zingo/following{/other_user}","gists_url":"https://api.github.com/users/zingo/gists{/gist_id}","starred_url":"https://api.github.com/users/zingo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zingo/subscriptions","organizations_url":"https://api.github.com/users/zingo/orgs","repos_url":"https://api.github.com/users/zingo/repos","events_url":"https://api.github.com/users/zingo/events{/privacy}","received_events_url":"https://api.github.com/users/zingo/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-01-03T23:16:31Z","updated_at":"2016-01-16T05:36:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a1418826cb2526f400a94ac0b8e274f82dd05b44","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20/commits","review_comments_url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20/comments","review_comment_url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gpsbabel/gpsbabel/issues/20/comments","statuses_url":"https://api.github.com/repos/gpsbabel/gpsbabel/statuses/9da84a5465703d48fb59f22bad8e8bc919df4020","head":{"label":"zingo:globalsat","ref":"globalsat","sha":"9da84a5465703d48fb59f22bad8e8bc919df4020","user":{"login":"zingo","id":368986,"avatar_url":"https://avatars.githubusercontent.com/u/368986?v=3","gravatar_id":"","url":"https://api.github.com/users/zingo","html_url":"https://github.com/zingo","followers_url":"https://api.github.com/users/zingo/followers","following_url":"https://api.github.com/users/zingo/following{/other_user}","gists_url":"https://api.github.com/users/zingo/gists{/gist_id}","starred_url":"https://api.github.com/users/zingo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zingo/subscriptions","organizations_url":"https://api.github.com/users/zingo/orgs","repos_url":"https://api.github.com/users/zingo/repos","events_url":"https://api.github.com/users/zingo/events{/privacy}","received_events_url":"https://api.github.com/users/zingo/received_events","type":"User","site_admin":false},"repo":{"id":48948759,"name":"gpsbabel","full_name":"zingo/gpsbabel","owner":{"login":"zingo","id":368986,"avatar_url":"https://avatars.githubusercontent.com/u/368986?v=3","gravatar_id":"","url":"https://api.github.com/users/zingo","html_url":"https://github.com/zingo","followers_url":"https://api.github.com/users/zingo/followers","following_url":"https://api.github.com/users/zingo/following{/other_user}","gists_url":"https://api.github.com/users/zingo/gists{/gist_id}","starred_url":"https://api.github.com/users/zingo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zingo/subscriptions","organizations_url":"https://api.github.com/users/zingo/orgs","repos_url":"https://api.github.com/users/zingo/repos","events_url":"https://api.github.com/users/zingo/events{/privacy}","received_events_url":"https://api.github.com/users/zingo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/zingo/gpsbabel","description":"Automatically exported from code.google.com/p/gpsbabel","fork":true,"url":"https://api.github.com/repos/zingo/gpsbabel","forks_url":"https://api.github.com/repos/zingo/gpsbabel/forks","keys_url":"https://api.github.com/repos/zingo/gpsbabel/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zingo/gpsbabel/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zingo/gpsbabel/teams","hooks_url":"https://api.github.com/repos/zingo/gpsbabel/hooks","issue_events_url":"https://api.github.com/repos/zingo/gpsbabel/issues/events{/number}","events_url":"https://api.github.com/repos/zingo/gpsbabel/events","assignees_url":"https://api.github.com/repos/zingo/gpsbabel/assignees{/user}","branches_url":"https://api.github.com/repos/zingo/gpsbabel/branches{/branch}","tags_url":"https://api.github.com/repos/zingo/gpsbabel/tags","blobs_url":"https://api.github.com/repos/zingo/gpsbabel/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zingo/gpsbabel/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zingo/gpsbabel/git/refs{/sha}","trees_url":"https://api.github.com/repos/zingo/gpsbabel/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zingo/gpsbabel/statuses/{sha}","languages_url":"https://api.github.com/repos/zingo/gpsbabel/languages","stargazers_url":"https://api.github.com/repos/zingo/gpsbabel/stargazers","contributors_url":"https://api.github.com/repos/zingo/gpsbabel/contributors","subscribers_url":"https://api.github.com/repos/zingo/gpsbabel/subscribers","subscription_url":"https://api.github.com/repos/zingo/gpsbabel/subscription","commits_url":"https://api.github.com/repos/zingo/gpsbabel/commits{/sha}","git_commits_url":"https://api.github.com/repos/zingo/gpsbabel/git/commits{/sha}","comments_url":"https://api.github.com/repos/zingo/gpsbabel/comments{/number}","issue_comment_url":"https://api.github.com/repos/zingo/gpsbabel/issues/comments{/number}","contents_url":"https://api.github.com/repos/zingo/gpsbabel/contents/{+path}","compare_url":"https://api.github.com/repos/zingo/gpsbabel/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zingo/gpsbabel/merges","archive_url":"https://api.github.com/repos/zingo/gpsbabel/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zingo/gpsbabel/downloads","issues_url":"https://api.github.com/repos/zingo/gpsbabel/issues{/number}","pulls_url":"https://api.github.com/repos/zingo/gpsbabel/pulls{/number}","milestones_url":"https://api.github.com/repos/zingo/gpsbabel/milestones{/number}","notifications_url":"https://api.github.com/repos/zingo/gpsbabel/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zingo/gpsbabel/labels{/name}","releases_url":"https://api.github.com/repos/zingo/gpsbabel/releases{/id}","created_at":"2016-01-03T14:34:37Z","updated_at":"2016-01-03T14:34:47Z","pushed_at":"2016-01-16T01:03:36Z","git_url":"git://github.com/zingo/gpsbabel.git","ssh_url":"git@github.com:zingo/gpsbabel.git","clone_url":"https://github.com/zingo/gpsbabel.git","svn_url":"https://github.com/zingo/gpsbabel","homepage":null,"size":44867,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":false,"has_wiki":false,"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":"gpsbabel:master","ref":"master","sha":"461e8c0ab0f6b2841142c894db4cf28421428d61","user":{"login":"gpsbabel","id":12013583,"avatar_url":"https://avatars.githubusercontent.com/u/12013583?v=3","gravatar_id":"","url":"https://api.github.com/users/gpsbabel","html_url":"https://github.com/gpsbabel","followers_url":"https://api.github.com/users/gpsbabel/followers","following_url":"https://api.github.com/users/gpsbabel/following{/other_user}","gists_url":"https://api.github.com/users/gpsbabel/gists{/gist_id}","starred_url":"https://api.github.com/users/gpsbabel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gpsbabel/subscriptions","organizations_url":"https://api.github.com/users/gpsbabel/orgs","repos_url":"https://api.github.com/users/gpsbabel/repos","events_url":"https://api.github.com/users/gpsbabel/events{/privacy}","received_events_url":"https://api.github.com/users/gpsbabel/received_events","type":"User","site_admin":false},"repo":{"id":40028252,"name":"gpsbabel","full_name":"gpsbabel/gpsbabel","owner":{"login":"gpsbabel","id":12013583,"avatar_url":"https://avatars.githubusercontent.com/u/12013583?v=3","gravatar_id":"","url":"https://api.github.com/users/gpsbabel","html_url":"https://github.com/gpsbabel","followers_url":"https://api.github.com/users/gpsbabel/followers","following_url":"https://api.github.com/users/gpsbabel/following{/other_user}","gists_url":"https://api.github.com/users/gpsbabel/gists{/gist_id}","starred_url":"https://api.github.com/users/gpsbabel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gpsbabel/subscriptions","organizations_url":"https://api.github.com/users/gpsbabel/orgs","repos_url":"https://api.github.com/users/gpsbabel/repos","events_url":"https://api.github.com/users/gpsbabel/events{/privacy}","received_events_url":"https://api.github.com/users/gpsbabel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gpsbabel/gpsbabel","description":"Automatically exported from code.google.com/p/gpsbabel","fork":false,"url":"https://api.github.com/repos/gpsbabel/gpsbabel","forks_url":"https://api.github.com/repos/gpsbabel/gpsbabel/forks","keys_url":"https://api.github.com/repos/gpsbabel/gpsbabel/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gpsbabel/gpsbabel/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gpsbabel/gpsbabel/teams","hooks_url":"https://api.github.com/repos/gpsbabel/gpsbabel/hooks","issue_events_url":"https://api.github.com/repos/gpsbabel/gpsbabel/issues/events{/number}","events_url":"https://api.github.com/repos/gpsbabel/gpsbabel/events","assignees_url":"https://api.github.com/repos/gpsbabel/gpsbabel/assignees{/user}","branches_url":"https://api.github.com/repos/gpsbabel/gpsbabel/branches{/branch}","tags_url":"https://api.github.com/repos/gpsbabel/gpsbabel/tags","blobs_url":"https://api.github.com/repos/gpsbabel/gpsbabel/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gpsbabel/gpsbabel/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gpsbabel/gpsbabel/git/refs{/sha}","trees_url":"https://api.github.com/repos/gpsbabel/gpsbabel/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gpsbabel/gpsbabel/statuses/{sha}","languages_url":"https://api.github.com/repos/gpsbabel/gpsbabel/languages","stargazers_url":"https://api.github.com/repos/gpsbabel/gpsbabel/stargazers","contributors_url":"https://api.github.com/repos/gpsbabel/gpsbabel/contributors","subscribers_url":"https://api.github.com/repos/gpsbabel/gpsbabel/subscribers","subscription_url":"https://api.github.com/repos/gpsbabel/gpsbabel/subscription","commits_url":"https://api.github.com/repos/gpsbabel/gpsbabel/commits{/sha}","git_commits_url":"https://api.github.com/repos/gpsbabel/gpsbabel/git/commits{/sha}","comments_url":"https://api.github.com/repos/gpsbabel/gpsbabel/comments{/number}","issue_comment_url":"https://api.github.com/repos/gpsbabel/gpsbabel/issues/comments{/number}","contents_url":"https://api.github.com/repos/gpsbabel/gpsbabel/contents/{+path}","compare_url":"https://api.github.com/repos/gpsbabel/gpsbabel/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gpsbabel/gpsbabel/merges","archive_url":"https://api.github.com/repos/gpsbabel/gpsbabel/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gpsbabel/gpsbabel/downloads","issues_url":"https://api.github.com/repos/gpsbabel/gpsbabel/issues{/number}","pulls_url":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls{/number}","milestones_url":"https://api.github.com/repos/gpsbabel/gpsbabel/milestones{/number}","notifications_url":"https://api.github.com/repos/gpsbabel/gpsbabel/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gpsbabel/gpsbabel/labels{/name}","releases_url":"https://api.github.com/repos/gpsbabel/gpsbabel/releases{/id}","created_at":"2015-07-31T23:05:54Z","updated_at":"2016-01-13T02:50:47Z","pushed_at":"2016-01-16T01:03:36Z","git_url":"git://github.com/gpsbabel/gpsbabel.git","ssh_url":"git@github.com:gpsbabel/gpsbabel.git","clone_url":"https://github.com/gpsbabel/gpsbabel.git","svn_url":"https://github.com/gpsbabel/gpsbabel","homepage":null,"size":46213,"stargazers_count":15,"watchers_count":15,"language":"C++","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":9,"mirror_url":null,"open_issues_count":6,"forks":9,"open_issues":6,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20"},"html":{"href":"https://github.com/gpsbabel/gpsbabel/pull/20"},"issue":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/issues/20"},"comments":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/issues/20/comments"},"review_comments":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20/comments"},"review_comment":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/pulls/20/commits"},"statuses":{"href":"https://api.github.com/repos/gpsbabel/gpsbabel/statuses/9da84a5465703d48fb59f22bad8e8bc919df4020"}}}}