{"action":"created","comment":{"url":"https://api.github.com/repos/indilib/indi/pulls/comments/289614635","pull_request_review_id":244596999,"id":289614635,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI4OTYxNDYzNQ==","diff_hunk":"@@ -0,0 +1,354 @@\n+/*******************************************************************************\n+  Copyright(c) 2019 Christian Liska. All rights reserved.\n+\n+  INDI Astromechanic Light Pollution Meter Driver\n+  https://www.astromechanics.org/lpm.html\n+\n+  This program is free software; you can redistribute it and/or modify it\n+  under the terms of the GNU General Public License as published by the Free\n+  Software Foundation; either version 2 of the License, or (at your option)\n+  any later version.\n+\n+  This program is distributed in the hope that it will be useful, but WITHOUT\n+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n+  more details.\n+\n+  You should have received a copy of the GNU Library General Public License\n+  along with this library; see the file COPYING.LIB.  If not, write to\n+  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\n+  Boston, MA 02110-1301, USA.\n+\n+  The full GNU General Public License is included in this distribution in the\n+  file called LICENSE.\n+*******************************************************************************/\n+#include \"lpm.h\"\n+\n+#include \"indicom.h\"\n+#include \"connectionplugins/connectionserial.h\"\n+\n+#include <cerrno>\n+#include <memory>\n+#include <cstring>\n+#include <unistd.h>\n+#include <sys/stat.h>\n+\n+// We declare an auto pointer to LPM.\n+std::unique_ptr<LPM> lpm(new LPM());\n+\n+#define UNIT_TAB    \"Unit\"\n+\n+void ISGetProperties(const char *dev)\n+{\n+    lpm->ISGetProperties(dev);\n+}\n+\n+void ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n)\n+{\n+    lpm->ISNewSwitch(dev, name, states, names, n);\n+}\n+\n+void ISNewText(const char *dev, const char *name, char *texts[], char *names[], int n)\n+{\n+    lpm->ISNewText(dev, name, texts, names, n);\n+}\n+\n+void ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n)\n+{\n+    lpm->ISNewNumber(dev, name, values, names, n);\n+}\n+\n+void ISNewBLOB(const char *dev, const char *name, int sizes[], int blobsizes[], char *blobs[], char *formats[],\n+               char *names[], int n)\n+{\n+    INDI_UNUSED(dev);\n+    INDI_UNUSED(name);\n+    INDI_UNUSED(sizes);\n+    INDI_UNUSED(blobsizes);\n+    INDI_UNUSED(blobs);\n+    INDI_UNUSED(formats);\n+    INDI_UNUSED(names);\n+    INDI_UNUSED(n);\n+}\n+void ISSnoopDevice(XMLEle *root)\n+{\n+    lpm->ISSnoopDevice(root);\n+}\n+\n+LPM::LPM()\n+{\n+    setVersion(0, 1);\n+}\n+\n+LPM::~LPM()\n+{\n+    if (fp) {\n+        fclose(fp);\n+    }\n+}\n+\n+bool LPM::initProperties()\n+{\n+    INDI::DefaultDevice::initProperties();\n+\n+    // Readings from device\n+    IUFillNumber(&AverageReadingN[0], \"SKY_BRIGHTNESS\", \"Quality (mag/arcsec^2)\", \"%6.2f\", -20, 30, 0, 0);\n+    IUFillNumber(&AverageReadingN[1], \"AVG_SKY_BRIGHTNESS\", \"Avg. Quality (mag/argsec^2)\", \"%6.2f\", -20, 30, 0, 0);\n+    IUFillNumber(&AverageReadingN[2], \"MIN_SKY_BRIGHTNESS\", \"Min. Quality (mag/argsec^2)\", \"%6.2f\", -20, 30, 0, 0);\n+    IUFillNumber(&AverageReadingN[3], \"MAX_SKY_BRIGHTNESS\", \"Max. Quality (mag/argsec^2)\", \"%6.2f\", -20, 30, 0, 0);\n+\n+    IUFillNumberVector(&AverageReadingNP, AverageReadingN, 4, getDeviceName(), \"SKY_QUALITY\", \"Readings\",\n+                       MAIN_CONTROL_TAB, IP_RO, 0, IPS_IDLE);\n+\n+    // add reset button for SQ-Measurements\n+    IUFillSwitch(&ResetB[0], \"RESET_BUTTON\", \"Reset\", ISS_OFF);\n+    IUFillSwitchVector(&ResetBP, ResetB, 1, getDeviceName(), \"RESET_READINGS\", \"\",\n+                       MAIN_CONTROL_TAB, IP_RW, ISR_ATMOST1, 60, IPS_IDLE);\n+\n+    IUFillSwitch(&SaveB[SAVE_READINGS], \"SAVE_BUTTON\", \"Save Readings\", ISS_OFF);\n+    IUFillSwitch(&SaveB[DISCARD_READINGS], \"DISCARD_BUTTON\", \"Discard Readings\", ISS_OFF);\n+    IUFillSwitchVector(&SaveBP, SaveB, 2, getDeviceName(), \"SAVE_READINGS\", \"\",\n+                       MAIN_CONTROL_TAB, IP_RW, ISR_ATMOST1, 0, IPS_IDLE);\n+\n+    // LPM-Readings-Log\n+    std::string defaultDirectory = std::string(getenv(\"HOME\")) + std::string(\"/lpm\");\n+    IUFillText(&RecordFileT[0], \"RECORD_FILE_DIR\", \"Dir.\", defaultDirectory.data());\n+    IUFillText(&RecordFileT[1], \"RECORD_FILE_NAME\", \"Name\", \"lpmlog.txt\");\n+    IUFillTextVector(&RecordFileTP, RecordFileT, NARRAY(RecordFileT), getDeviceName(), \"RECORD_FILE\", \"Record File\",\n+                     MAIN_CONTROL_TAB, IP_RW, 0, IPS_IDLE);\n+\n+    // Unit Info\n+    IUFillNumber(&UnitInfoN[0], \"Calibdata\", \"\", \"%6.2f\", -20, 30, 0, 0);\n+    IUFillNumberVector(&UnitInfoNP, UnitInfoN, 1, getDeviceName(), \"Unit Info\", \"\",\n+                       UNIT_TAB, IP_RO, 0, IPS_IDLE);\n+\n+    if (lpmConnection & CONNECTION_SERIAL)\n+    {\n+        serialConnection = new Connection::Serial(this);\n+        serialConnection->registerHandshake([&]() { return getDeviceInfo(); });\n+        serialConnection->setDefaultBaudRate(Connection::Serial::B_9600);\n+        registerConnection(serialConnection);\n+    }\n+\n+    addDebugControl();\n+    addPollPeriodControl();\n+\n+    return true;\n+}\n+\n+bool LPM::updateProperties()\n+{\n+    INDI::DefaultDevice::updateProperties();\n+\n+    if (isConnected())\n+    {\n+        defineNumber(&AverageReadingNP);\n+        defineNumber(&UnitInfoNP);\n+        defineSwitch(&ResetBP);\n+        defineText(&RecordFileTP);\n+        defineSwitch(&SaveBP);\n+    }\n+    else\n+    {\n+        deleteProperty(AverageReadingNP.name);\n+        deleteProperty(UnitInfoNP.name);\n+        deleteProperty(RecordFileTP.name);\n+        deleteProperty(ResetBP.name);\n+        deleteProperty(SaveBP.name);\n+    }\n+\n+    return true;\n+}\n+\n+bool LPM::ISNewText(const char *dev, const char *name, char *texts[], char *names[], int n)\n+{\n+    if (dev != nullptr && strcmp(dev, getDeviceName()) == 0)\n+    {\n+        if (strcmp(name, RecordFileTP.name) == 0)\n+        {\n+            IUUpdateText(&RecordFileTP, texts, names, n);\n+            RecordFileTP.s = IPS_OK;\n+            IDSetText(&RecordFileTP, nullptr);\n+            return true;\n+        }\n+    }\n+\n+    return INDI::DefaultDevice::ISNewText(dev, name, texts, names, n);\n+}\n+bool LPM::ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n)\n+{\n+    char filename[2048];\n+\n+    if (dev != nullptr && strcmp(dev, getDeviceName()) == 0)\n+    {\n+        // Reset\n+        if (!strcmp(name, ResetBP.name))\n+        {\n+            IUUpdateSwitch(&ResetBP, states, names, n);\n+            ResetB[0].s = ISS_OFF;\n+            ResetBP.s   = IPS_OK;\n+            IDSetSwitch(&ResetBP, nullptr);\n+\n+            AverageReadingN[0].value = 0;\n+            AverageReadingN[1].value = 0;\n+            AverageReadingN[2].value = 0;\n+            AverageReadingN[3].value = 0;\n+\n+            sumSQ = 0;\n+            count = 0;\n+            return true;\n+        } else if (!strcmp(name, SaveBP.name))\n+        {\n+            IUUpdateSwitch(&SaveBP, states, names, n);\n+            snprintf(filename, 2048, \"%s/%s\", RecordFileT[0].text, RecordFileT[1].text);\n+\n+            if (SaveB[SAVE_READINGS].s == ISS_ON)\n+            {\n+                LOGF_INFO(\"Save readings to %s\", filename);\n+                if (fp == nullptr) {\n+                    LOG_DEBUG(\"open file pointer\");\n+                    mkdir(RecordFileT[0].text,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);\n+                    fp = fopen(filename, \"a\");\n+                }\n+                SaveBP.s = IPS_OK;\n+            } else {\n+                LOG_INFO(\"Discard readings\");\n+                if (fp != nullptr) {\n+                    LOG_DEBUG(\"close file pointer\");\n+                    fclose(fp);\n+                    fp = nullptr;\n+                } else {\n+                    LOG_WARN(\"no file open!\");\n+                }\n+                SaveBP.s = IPS_IDLE;\n+            }\n+\n+            IDSetSwitch(&SaveBP, nullptr);\n+            return true;\n+        }\n+\n+    }\n+\n+    return DefaultDevice::ISNewSwitch(dev, name, states, names, n);\n+}\n+\n+bool LPM::getReadings()\n+{\n+    const char *cmd = \"V#\";\n+    char res[32] = {0};\n+    int nbytes_written = 0;\n+    int nbytes_read = 0;\n+\n+    tty_write_string(PortFD, cmd, &nbytes_written);\n+    if (tty_read_section(PortFD, res, '#', 60000, &nbytes_read) == TTY_OK)\n+    {\n+        LOGF_DEBUG(\"RES (%s)\", res);\n+        float mpsas;\n+        int rc =\n+            sscanf(res, \"%f#\", &mpsas);\n+        if (rc < 1)\n+        {\n+            LOGF_ERROR(\"Failed to parse input %s\", res);\n+            return false;\n+        } else \n+        {\n+            if (fp != nullptr) {\n+                LOG_DEBUG(\"save reading...\");\n+                fprintf(fp, \"%f\\t%s\\n\", mpsas, timestamp());\n+                fflush(fp);\n+            }\n+            count++;\n+        }\n+\n+        AverageReadingN[0].value = mpsas;\n+        sumSQ += mpsas;\n+        \n+        if (count > 1)\n+        {\n+            AverageReadingN[1].value = sumSQ / count;\n+            if (mpsas < AverageReadingN[2].value) {\n+                AverageReadingN[2].value = mpsas;\n+            }\n+            if (mpsas > AverageReadingN[3].value) {\n+                AverageReadingN[3].value = mpsas;\n+            }\n+        } else {\n+            AverageReadingN[2].value = mpsas;\n+            AverageReadingN[3].value = mpsas;\n+        }\n+    }\n+    return true;\n+}\n+\n+const char *LPM::getDefaultName()\n+{\n+    return (const char *)\"LPM\";","path":"libindi/drivers/auxiliary/lpm.cpp","position":null,"original_position":285,"commit_id":"ec4c0e1296f3a07a79acdeeb41c8609e9f627afc","original_commit_id":"2329417b605f5cb5d21fb6e436a5b884eb58a706","user":{"login":"TallFurryMan","id":22483335,"node_id":"MDQ6VXNlcjIyNDgzMzM1","avatar_url":"https://avatars0.githubusercontent.com/u/22483335?v=4","gravatar_id":"","url":"https://api.github.com/users/TallFurryMan","html_url":"https://github.com/TallFurryMan","followers_url":"https://api.github.com/users/TallFurryMan/followers","following_url":"https://api.github.com/users/TallFurryMan/following{/other_user}","gists_url":"https://api.github.com/users/TallFurryMan/gists{/gist_id}","starred_url":"https://api.github.com/users/TallFurryMan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TallFurryMan/subscriptions","organizations_url":"https://api.github.com/users/TallFurryMan/orgs","repos_url":"https://api.github.com/users/TallFurryMan/repos","events_url":"https://api.github.com/users/TallFurryMan/events{/privacy}","received_events_url":"https://api.github.com/users/TallFurryMan/received_events","type":"User","site_admin":false},"body":"That's OK actually. I misread the prototype const for a non-const. Sorry. ","created_at":"2019-06-01T18:28:40Z","updated_at":"2019-06-01T18:28:40Z","html_url":"https://github.com/indilib/indi/pull/956#discussion_r289614635","pull_request_url":"https://api.github.com/repos/indilib/indi/pulls/956","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/indilib/indi/pulls/comments/289614635"},"html":{"href":"https://github.com/indilib/indi/pull/956#discussion_r289614635"},"pull_request":{"href":"https://api.github.com/repos/indilib/indi/pulls/956"}},"in_reply_to_id":289599986},"pull_request":{"url":"https://api.github.com/repos/indilib/indi/pulls/956","id":284088358,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjg0MDg4MzU4","html_url":"https://github.com/indilib/indi/pull/956","diff_url":"https://github.com/indilib/indi/pull/956.diff","patch_url":"https://github.com/indilib/indi/pull/956.patch","issue_url":"https://api.github.com/repos/indilib/indi/issues/956","number":956,"state":"open","locked":false,"title":"new driver for Astromechanics LPM (light pollution meter) pro","user":{"login":"chkettu","id":17508848,"node_id":"MDQ6VXNlcjE3NTA4ODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/17508848?v=4","gravatar_id":"","url":"https://api.github.com/users/chkettu","html_url":"https://github.com/chkettu","followers_url":"https://api.github.com/users/chkettu/followers","following_url":"https://api.github.com/users/chkettu/following{/other_user}","gists_url":"https://api.github.com/users/chkettu/gists{/gist_id}","starred_url":"https://api.github.com/users/chkettu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chkettu/subscriptions","organizations_url":"https://api.github.com/users/chkettu/orgs","repos_url":"https://api.github.com/users/chkettu/repos","events_url":"https://api.github.com/users/chkettu/events{/privacy}","received_events_url":"https://api.github.com/users/chkettu/received_events","type":"User","site_admin":false},"body":"An indi-lib driver for Astromechanics LPM (light pollution meter) PRO.\r\n\r\nhttps://www.astromechanics.org/lpm.html\r\n\r\nFind the documentation attached to this pull request. Feedback, improvements, etc. welcome.\r\n\r\n[Astromechanics_LPM_Documentation.tar.gz]\r\n(https://github.com/indilib/indi/files/3241811/Astromechanics_LPM_Documentation.tar.gz)\r\n\r\n","created_at":"2019-05-31T15:15:48Z","updated_at":"2019-06-01T18:28:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9aea13622ae84bac3caba721f23a26c79bebf52a","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/indilib/indi/pulls/956/commits","review_comments_url":"https://api.github.com/repos/indilib/indi/pulls/956/comments","review_comment_url":"https://api.github.com/repos/indilib/indi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/indilib/indi/issues/956/comments","statuses_url":"https://api.github.com/repos/indilib/indi/statuses/ec4c0e1296f3a07a79acdeeb41c8609e9f627afc","head":{"label":"chkettu:master","ref":"master","sha":"ec4c0e1296f3a07a79acdeeb41c8609e9f627afc","user":{"login":"chkettu","id":17508848,"node_id":"MDQ6VXNlcjE3NTA4ODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/17508848?v=4","gravatar_id":"","url":"https://api.github.com/users/chkettu","html_url":"https://github.com/chkettu","followers_url":"https://api.github.com/users/chkettu/followers","following_url":"https://api.github.com/users/chkettu/following{/other_user}","gists_url":"https://api.github.com/users/chkettu/gists{/gist_id}","starred_url":"https://api.github.com/users/chkettu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chkettu/subscriptions","organizations_url":"https://api.github.com/users/chkettu/orgs","repos_url":"https://api.github.com/users/chkettu/repos","events_url":"https://api.github.com/users/chkettu/events{/privacy}","received_events_url":"https://api.github.com/users/chkettu/received_events","type":"User","site_admin":false},"repo":{"id":155175616,"node_id":"MDEwOlJlcG9zaXRvcnkxNTUxNzU2MTY=","name":"indi","full_name":"chkettu/indi","private":false,"owner":{"login":"chkettu","id":17508848,"node_id":"MDQ6VXNlcjE3NTA4ODQ4","avatar_url":"https://avatars1.githubusercontent.com/u/17508848?v=4","gravatar_id":"","url":"https://api.github.com/users/chkettu","html_url":"https://github.com/chkettu","followers_url":"https://api.github.com/users/chkettu/followers","following_url":"https://api.github.com/users/chkettu/following{/other_user}","gists_url":"https://api.github.com/users/chkettu/gists{/gist_id}","starred_url":"https://api.github.com/users/chkettu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chkettu/subscriptions","organizations_url":"https://api.github.com/users/chkettu/orgs","repos_url":"https://api.github.com/users/chkettu/repos","events_url":"https://api.github.com/users/chkettu/events{/privacy}","received_events_url":"https://api.github.com/users/chkettu/received_events","type":"User","site_admin":false},"html_url":"https://github.com/chkettu/indi","description":"INDI Library Repository","fork":true,"url":"https://api.github.com/repos/chkettu/indi","forks_url":"https://api.github.com/repos/chkettu/indi/forks","keys_url":"https://api.github.com/repos/chkettu/indi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chkettu/indi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chkettu/indi/teams","hooks_url":"https://api.github.com/repos/chkettu/indi/hooks","issue_events_url":"https://api.github.com/repos/chkettu/indi/issues/events{/number}","events_url":"https://api.github.com/repos/chkettu/indi/events","assignees_url":"https://api.github.com/repos/chkettu/indi/assignees{/user}","branches_url":"https://api.github.com/repos/chkettu/indi/branches{/branch}","tags_url":"https://api.github.com/repos/chkettu/indi/tags","blobs_url":"https://api.github.com/repos/chkettu/indi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chkettu/indi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chkettu/indi/git/refs{/sha}","trees_url":"https://api.github.com/repos/chkettu/indi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chkettu/indi/statuses/{sha}","languages_url":"https://api.github.com/repos/chkettu/indi/languages","stargazers_url":"https://api.github.com/repos/chkettu/indi/stargazers","contributors_url":"https://api.github.com/repos/chkettu/indi/contributors","subscribers_url":"https://api.github.com/repos/chkettu/indi/subscribers","subscription_url":"https://api.github.com/repos/chkettu/indi/subscription","commits_url":"https://api.github.com/repos/chkettu/indi/commits{/sha}","git_commits_url":"https://api.github.com/repos/chkettu/indi/git/commits{/sha}","comments_url":"https://api.github.com/repos/chkettu/indi/comments{/number}","issue_comment_url":"https://api.github.com/repos/chkettu/indi/issues/comments{/number}","contents_url":"https://api.github.com/repos/chkettu/indi/contents/{+path}","compare_url":"https://api.github.com/repos/chkettu/indi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chkettu/indi/merges","archive_url":"https://api.github.com/repos/chkettu/indi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chkettu/indi/downloads","issues_url":"https://api.github.com/repos/chkettu/indi/issues{/number}","pulls_url":"https://api.github.com/repos/chkettu/indi/pulls{/number}","milestones_url":"https://api.github.com/repos/chkettu/indi/milestones{/number}","notifications_url":"https://api.github.com/repos/chkettu/indi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chkettu/indi/labels{/name}","releases_url":"https://api.github.com/repos/chkettu/indi/releases{/id}","deployments_url":"https://api.github.com/repos/chkettu/indi/deployments","created_at":"2018-10-29T08:16:52Z","updated_at":"2019-06-01T18:09:07Z","pushed_at":"2019-06-01T18:09:05Z","git_url":"git://github.com/chkettu/indi.git","ssh_url":"git@github.com:chkettu/indi.git","clone_url":"https://github.com/chkettu/indi.git","svn_url":"https://github.com/chkettu/indi","homepage":null,"size":357870,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"indilib:master","ref":"master","sha":"b310d9650d18c4e48b74d0d21c73601b6eb5502b","user":{"login":"indilib","id":19376845,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE5Mzc2ODQ1","avatar_url":"https://avatars2.githubusercontent.com/u/19376845?v=4","gravatar_id":"","url":"https://api.github.com/users/indilib","html_url":"https://github.com/indilib","followers_url":"https://api.github.com/users/indilib/followers","following_url":"https://api.github.com/users/indilib/following{/other_user}","gists_url":"https://api.github.com/users/indilib/gists{/gist_id}","starred_url":"https://api.github.com/users/indilib/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indilib/subscriptions","organizations_url":"https://api.github.com/users/indilib/orgs","repos_url":"https://api.github.com/users/indilib/repos","events_url":"https://api.github.com/users/indilib/events{/privacy}","received_events_url":"https://api.github.com/users/indilib/received_events","type":"Organization","site_admin":false},"repo":{"id":58881442,"node_id":"MDEwOlJlcG9zaXRvcnk1ODg4MTQ0Mg==","name":"indi","full_name":"indilib/indi","private":false,"owner":{"login":"indilib","id":19376845,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE5Mzc2ODQ1","avatar_url":"https://avatars2.githubusercontent.com/u/19376845?v=4","gravatar_id":"","url":"https://api.github.com/users/indilib","html_url":"https://github.com/indilib","followers_url":"https://api.github.com/users/indilib/followers","following_url":"https://api.github.com/users/indilib/following{/other_user}","gists_url":"https://api.github.com/users/indilib/gists{/gist_id}","starred_url":"https://api.github.com/users/indilib/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indilib/subscriptions","organizations_url":"https://api.github.com/users/indilib/orgs","repos_url":"https://api.github.com/users/indilib/repos","events_url":"https://api.github.com/users/indilib/events{/privacy}","received_events_url":"https://api.github.com/users/indilib/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/indilib/indi","description":"INDI Library Repository","fork":false,"url":"https://api.github.com/repos/indilib/indi","forks_url":"https://api.github.com/repos/indilib/indi/forks","keys_url":"https://api.github.com/repos/indilib/indi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/indilib/indi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/indilib/indi/teams","hooks_url":"https://api.github.com/repos/indilib/indi/hooks","issue_events_url":"https://api.github.com/repos/indilib/indi/issues/events{/number}","events_url":"https://api.github.com/repos/indilib/indi/events","assignees_url":"https://api.github.com/repos/indilib/indi/assignees{/user}","branches_url":"https://api.github.com/repos/indilib/indi/branches{/branch}","tags_url":"https://api.github.com/repos/indilib/indi/tags","blobs_url":"https://api.github.com/repos/indilib/indi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/indilib/indi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/indilib/indi/git/refs{/sha}","trees_url":"https://api.github.com/repos/indilib/indi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/indilib/indi/statuses/{sha}","languages_url":"https://api.github.com/repos/indilib/indi/languages","stargazers_url":"https://api.github.com/repos/indilib/indi/stargazers","contributors_url":"https://api.github.com/repos/indilib/indi/contributors","subscribers_url":"https://api.github.com/repos/indilib/indi/subscribers","subscription_url":"https://api.github.com/repos/indilib/indi/subscription","commits_url":"https://api.github.com/repos/indilib/indi/commits{/sha}","git_commits_url":"https://api.github.com/repos/indilib/indi/git/commits{/sha}","comments_url":"https://api.github.com/repos/indilib/indi/comments{/number}","issue_comment_url":"https://api.github.com/repos/indilib/indi/issues/comments{/number}","contents_url":"https://api.github.com/repos/indilib/indi/contents/{+path}","compare_url":"https://api.github.com/repos/indilib/indi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/indilib/indi/merges","archive_url":"https://api.github.com/repos/indilib/indi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/indilib/indi/downloads","issues_url":"https://api.github.com/repos/indilib/indi/issues{/number}","pulls_url":"https://api.github.com/repos/indilib/indi/pulls{/number}","milestones_url":"https://api.github.com/repos/indilib/indi/milestones{/number}","notifications_url":"https://api.github.com/repos/indilib/indi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/indilib/indi/labels{/name}","releases_url":"https://api.github.com/repos/indilib/indi/releases{/id}","deployments_url":"https://api.github.com/repos/indilib/indi/deployments","created_at":"2016-05-15T19:56:13Z","updated_at":"2019-05-30T06:41:45Z","pushed_at":"2019-06-01T18:09:06Z","git_url":"git://github.com/indilib/indi.git","ssh_url":"git@github.com:indilib/indi.git","clone_url":"https://github.com/indilib/indi.git","svn_url":"https://github.com/indilib/indi","homepage":null,"size":357765,"stargazers_count":135,"watchers_count":135,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":146,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":35,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":146,"open_issues":35,"watchers":135,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/indilib/indi/pulls/956"},"html":{"href":"https://github.com/indilib/indi/pull/956"},"issue":{"href":"https://api.github.com/repos/indilib/indi/issues/956"},"comments":{"href":"https://api.github.com/repos/indilib/indi/issues/956/comments"},"review_comments":{"href":"https://api.github.com/repos/indilib/indi/pulls/956/comments"},"review_comment":{"href":"https://api.github.com/repos/indilib/indi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/indilib/indi/pulls/956/commits"},"statuses":{"href":"https://api.github.com/repos/indilib/indi/statuses/ec4c0e1296f3a07a79acdeeb41c8609e9f627afc"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"TallFurryMan"}}