{"action":"created","comment":{"url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/comments/241994665","pull_request_review_id":185401871,"id":241994665,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MTk5NDY2NQ==","diff_hunk":"@@ -0,0 +1,265 @@\n+#include \"dspic33epxxxgp50x_can.h\"\n+#include <xc.h>\n+\n+static void (*can_rcv_cb)(const can_msg_t *message);\n+\n+// make a RAM buffer big enough to hold 32 CAN message\n+#define CAN_BUF_NUM 32\n+static unsigned int can_msg_buf[CAN_BUF_NUM][8] __attribute__((aligned(CAN_BUF_NUM * 16)));\n+\n+// private functions\n+static void init_filters_and_masks();\n+static void init_dma_channels();\n+static void init_can_interrupts();\n+static void buffer_to_msg(const unsigned int *buffer, can_msg_t *received);\n+\n+// Initialization function for CAN. The driver currently only runs in\n+// callback mode, and that callback will be triggered in an interrupt\n+// context. Please make the callback as short (in time) as possible.\n+void init_can(const can_timing_t *timing,\n+              void (*receive_callback)(const can_msg_t *message),\n+              bool run_in_loopback) {\n+    // store pointer to the receive callback\n+    can_rcv_cb = receive_callback;\n+\n+    // set can module to config mode\n+    C1CTRL1bits.REQOP = 0x4;\n+    // wait until that mode takes effect\n+    while (C1CTRL1bits.OPMODE != 0x4);\n+\n+    // allow writing of control bits\n+    C1CTRL1bits.WIN = 1;\n+\n+    // set baud rate and other timing details\n+    C1CFG1bits.SJW = timing->sjw;\n+    C1CFG1bits.BRP = timing->brp;\n+    C1CFG2bits.SEG2PHTS = timing->btlmode;\n+    C1CFG2bits.SAM = timing->sam;\n+    C1CFG2bits.SEG1PH = timing->seg1ph;\n+    C1CFG2bits.PRSEG = timing->prseg;\n+    C1CFG2bits.SEG2PH = timing->seg2ph;\n+\n+    // set up DMA and FIFO: don't use the FIFO, use 32 buffers for DMA\n+    C1FCTRLbits.DMABS = 0b110;\n+    C1FCTRLbits.FSA   = 0b11111;\n+\n+    // set up filters and masks\n+    init_filters_and_masks();\n+\n+    // disable writes to C1CTRL\n+    C1CTRL1bits.WIN = 0;\n+\n+    // set the first transmit buffer as transmit, all others as\n+    // receive buffers (we don't need plural transmits (I think))\n+    C1TR01CONbits.TXEN0 = 0x1;\n+    C1TR01CONbits.TXEN1 = 0x0;\n+    C1TR23CONbits.TXEN2 = 0x0;\n+    C1TR23CONbits.TXEN3 = 0x0;\n+    C1TR45CONbits.TXEN4 = 0x0;\n+    C1TR45CONbits.TXEN5 = 0x0;\n+    C1TR67CONbits.TXEN6 = 0x0;\n+    C1TR67CONbits.TXEN7 = 0x0;\n+\n+    // initialize the DMA module: This driver requires DMA0 and DMA1,\n+    // so don't use those elsewhere\n+    init_dma_channels();\n+\n+    // if you wanna run this driver in loopback mode, we can\n+    // accomodate that\n+    if(run_in_loopback) {\n+        // set loopback mode. THIS MUST CHANGE TO NORMAL MODE BEFORE\n+        // MERGING\n+        C1CTRL1bits.REQOP = 2;\n+        // wait until change is applied\n+        while (C1CTRL1bits.OPMODE != 0x2);\n+    } else {\n+        C1CTRL1bits.REQOP = 0;\n+        while(C1CTRL1bits.OPMODE != 0);\n+    }\n+\n+    // initialize the interrupts\n+    init_can_interrupts();\n+}\n+\n+// Priority must be a 2 bit number defining how high the priority of\n+// this message is vs the other ones queued to be sent. 0 is lowest\n+// priority, 3 is highest\n+void can_send(const can_msg_t* message, uint8_t priority) {\n+    // put the SID in buffer 0 of the DMA buffers\n+    can_msg_buf[0][0] = (message->sid << 2);\n+\n+    // no extended identifier\n+    can_msg_buf[0][1] = 0;\n+\n+    // set the length, other bits are zero because no EID\n+    can_msg_buf[0][2] = message->data_len;\n+\n+    // copy data over\n+    can_msg_buf[0][3] = ((message->data[1] << 8) | message->data[0]);\n+    can_msg_buf[0][4] = ((message->data[3] << 8) | message->data[2]);\n+    can_msg_buf[0][5] = ((message->data[5] << 8) | message->data[4]);\n+    can_msg_buf[0][6] = ((message->data[7] << 8) | message->data[6]);\n+\n+    // set priority. There's 0 point in doing this until we allow\n+    // multiple transmit buffers, but hey, might as well make the API\n+    // stable across different PICs.\n+    C1TR01CONbits.TX0PRI = priority;\n+\n+    C1TR01CONbits.TXREQ0 = 1;\n+}\n+\n+// Interrupt that runs whenever IFS2::C1IF is set\n+void __attribute__((__interrupt__, no_auto_psv)) _C1Interrupt(void) {\n+    // a transmit successfully finished, we abort the message so it\n+    // isn't set repeatedly\n+    if(C1INTFbits.TBIF) {\n+        C1INTFbits.TBIF = 0;\n+        C1TR01CONbits.TXABT0 = 1;\n+        return;\n+    } else if (C1INTFbits.RBIF) {\n+        // check all receive buffers, trigger the callback with every\n+        // filled buffer\n+        can_msg_t cb_message;\n+        if(C1RXFUL1bits.RXFUL1) {\n+            buffer_to_msg(can_msg_buf[1], &cb_message);\n+            C1RXFUL1bits.RXFUL1 = 0;\n+            can_rcv_cb(&cb_message);\n+        }\n+        if(C1RXFUL1bits.RXFUL2) {\n+            buffer_to_msg(can_msg_buf[2], &cb_message);\n+            C1RXFUL1bits.RXFUL2 = 0;\n+            can_rcv_cb(&cb_message);\n+        }\n+        if(C1RXFUL1bits.RXFUL3) {\n+            buffer_to_msg(can_msg_buf[3], &cb_message);\n+            C1RXFUL1bits.RXFUL3 = 0;\n+            can_rcv_cb(&cb_message);\n+        }\n+        if(C1RXFUL1bits.RXFUL4) {\n+            buffer_to_msg(can_msg_buf[4], &cb_message);\n+            C1RXFUL1bits.RXFUL4 = 0;\n+            can_rcv_cb(&cb_message);\n+        }\n+        C1INTFbits.RBIF = 0;\n+        return;\n+    } else if (C1INTFbits.RBOVIF) {\n+        // we weren't fast enough to catch all the messages\n+        // in the future, raise a warning now\n+        C1INTFbits.RBOVIF = 0;\n+        return;\n+    }\n+\n+    if(C1INTF == 0) {\n+        // there are no other CAN interrupts that we want to deal\n+        // with, so lower the main interrupt flag\n+        IFS2bits.C1IF = 0;\n+    }\n+    return;\n+}\n+\n+// Converts the DsPIC's internal CAN message buffer format into our\n+// message struct format\n+static void buffer_to_msg(const unsigned int *buffer, can_msg_t *received) {\n+    received->sid = ((buffer[0] >> 2) & 0x7ff);\n+    received->data_len = (buffer[2] & 0x0f);\n+    // fallthroughs are intentional\n+    switch(received->data_len) {\n+        case 8:\n+            received->data[7] = ((buffer[6] >> 8) & 0xff);\n+        case 7:\n+            received->data[6] =  (buffer[6] & 0xff);\n+        case 6:\n+            received->data[5] = ((buffer[5] >> 8) & 0xff);\n+        case 5:\n+            received->data[4] =  (buffer[5] & 0xff);\n+        case 4:\n+            received->data[3] = ((buffer[4] >> 8) & 0xff);\n+        case 3:\n+            received->data[2] =  (buffer[4] & 0xff);\n+        case 2:\n+            received->data[1] = ((buffer[3] >> 8) & 0xff);\n+        case 1:\n+            received->data[0] =  (buffer[3] & 0xff);\n+        case 0: default:\n+            return;\n+    }\n+}\n+\n+static void init_dma_channels() {\n+    // use DMA channel 0 as the CAN Tx channel\n+    DMA0CONbits.CHEN = 0; // disable for setup\n+    DMA0CONbits.SIZE = 0; // set to word size, not byte size\n+    DMA0CONbits.DIR = 1; // read from RAM, write to CAN\n+    DMA0CONbits.AMODE = 0b10; // peripheral indirect addressing mode\n+    DMA0CONbits.MODE = 0; // continuous mode, disable ping-pong mode\n+    DMA0REQbits.IRQSEL = 0b01000110; // ECAN1-TX Data request\n+    DMA0CNT = 7; //8 words in a CAN message\n+    DMA0PAD = (volatile uint16_t) &C1TXD;\n+    DMA0STAL = (uint16_t) &can_msg_buf;\n+    DMA0STAH = (uint16_t) &can_msg_buf;\n+    DMA0CONbits.CHEN = 1; // we are go for DMA\n+\n+    // enable DMA channel 1 as the CAN Rx channel\n+    DMA1CONbits.CHEN = 0;\n+    DMA1CONbits.SIZE = 0x0;\n+    DMA1CONbits.DIR = 0x0;\n+    DMA1CONbits.AMODE = 0x2;\n+    DMA1CONbits.MODE = 0x0;\n+    DMA1REQ = 34;\n+    DMA1CNT = 7;\n+    DMA1PAD = (volatile unsigned int)&C1RXD;\n+    DMA1STAL = (unsigned int) &can_msg_buf;\n+    DMA1STAH = (unsigned int) &can_msg_buf;\n+    DMA1CONbits.CHEN = 0x1;\n+}\n+\n+static void init_can_interrupts() {","path":"dspic33epxxxgp50x/dspic33epxxxgp50x_can.c","position":216,"original_position":216,"commit_id":"c07bd051fc97c2b77500df19f2d31f4e1091b02f","original_commit_id":"c07bd051fc97c2b77500df19f2d31f4e1091b02f","user":{"login":"amihaila","id":21145713,"node_id":"MDQ6VXNlcjIxMTQ1NzEz","avatar_url":"https://avatars2.githubusercontent.com/u/21145713?v=4","gravatar_id":"","url":"https://api.github.com/users/amihaila","html_url":"https://github.com/amihaila","followers_url":"https://api.github.com/users/amihaila/followers","following_url":"https://api.github.com/users/amihaila/following{/other_user}","gists_url":"https://api.github.com/users/amihaila/gists{/gist_id}","starred_url":"https://api.github.com/users/amihaila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amihaila/subscriptions","organizations_url":"https://api.github.com/users/amihaila/orgs","repos_url":"https://api.github.com/users/amihaila/repos","events_url":"https://api.github.com/users/amihaila/events{/privacy}","received_events_url":"https://api.github.com/users/amihaila/received_events","type":"User","site_admin":false},"body":"one day it would be nice to pass in what kind of interrupts we want to receive. Not needed for this review though.","created_at":"2018-12-16T20:29:41Z","updated_at":"2018-12-16T20:37:31Z","html_url":"https://github.com/waterloo-rocketry/canlib/pull/2#discussion_r241994665","pull_request_url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/comments/241994665"},"html":{"href":"https://github.com/waterloo-rocketry/canlib/pull/2#discussion_r241994665"},"pull_request":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2","id":235225578,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM1MjI1NTc4","html_url":"https://github.com/waterloo-rocketry/canlib/pull/2","diff_url":"https://github.com/waterloo-rocketry/canlib/pull/2.diff","patch_url":"https://github.com/waterloo-rocketry/canlib/pull/2.patch","issue_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/2","number":2,"state":"open","locked":false,"title":"Dspic","user":{"login":"akmorrison","id":22322816,"node_id":"MDQ6VXNlcjIyMzIyODE2","avatar_url":"https://avatars0.githubusercontent.com/u/22322816?v=4","gravatar_id":"","url":"https://api.github.com/users/akmorrison","html_url":"https://github.com/akmorrison","followers_url":"https://api.github.com/users/akmorrison/followers","following_url":"https://api.github.com/users/akmorrison/following{/other_user}","gists_url":"https://api.github.com/users/akmorrison/gists{/gist_id}","starred_url":"https://api.github.com/users/akmorrison/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akmorrison/subscriptions","organizations_url":"https://api.github.com/users/akmorrison/orgs","repos_url":"https://api.github.com/users/akmorrison/repos","events_url":"https://api.github.com/users/akmorrison/events{/privacy}","received_events_url":"https://api.github.com/users/akmorrison/received_events","type":"User","site_admin":false},"body":"Driver for the dspic that's sitting on the logger and the sensor board.\r\n\r\nIt's not perfect, it could run much more optimally, but that's a later problem. For now, it works, and we can develop on it. Improvements to be made as we run into problems.","created_at":"2018-12-01T23:21:41Z","updated_at":"2018-12-16T20:37:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7fed7e1b3209ce5119e687af6d7098ef08ca0886","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2/commits","review_comments_url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2/comments","review_comment_url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/comments{/number}","comments_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/2/comments","statuses_url":"https://api.github.com/repos/waterloo-rocketry/canlib/statuses/c07bd051fc97c2b77500df19f2d31f4e1091b02f","head":{"label":"waterloo-rocketry:dspic","ref":"dspic","sha":"c07bd051fc97c2b77500df19f2d31f4e1091b02f","user":{"login":"waterloo-rocketry","id":34222613,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0MjIyNjEz","avatar_url":"https://avatars3.githubusercontent.com/u/34222613?v=4","gravatar_id":"","url":"https://api.github.com/users/waterloo-rocketry","html_url":"https://github.com/waterloo-rocketry","followers_url":"https://api.github.com/users/waterloo-rocketry/followers","following_url":"https://api.github.com/users/waterloo-rocketry/following{/other_user}","gists_url":"https://api.github.com/users/waterloo-rocketry/gists{/gist_id}","starred_url":"https://api.github.com/users/waterloo-rocketry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/waterloo-rocketry/subscriptions","organizations_url":"https://api.github.com/users/waterloo-rocketry/orgs","repos_url":"https://api.github.com/users/waterloo-rocketry/repos","events_url":"https://api.github.com/users/waterloo-rocketry/events{/privacy}","received_events_url":"https://api.github.com/users/waterloo-rocketry/received_events","type":"Organization","site_admin":false},"repo":{"id":158953946,"node_id":"MDEwOlJlcG9zaXRvcnkxNTg5NTM5NDY=","name":"canlib","full_name":"waterloo-rocketry/canlib","private":false,"owner":{"login":"waterloo-rocketry","id":34222613,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0MjIyNjEz","avatar_url":"https://avatars3.githubusercontent.com/u/34222613?v=4","gravatar_id":"","url":"https://api.github.com/users/waterloo-rocketry","html_url":"https://github.com/waterloo-rocketry","followers_url":"https://api.github.com/users/waterloo-rocketry/followers","following_url":"https://api.github.com/users/waterloo-rocketry/following{/other_user}","gists_url":"https://api.github.com/users/waterloo-rocketry/gists{/gist_id}","starred_url":"https://api.github.com/users/waterloo-rocketry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/waterloo-rocketry/subscriptions","organizations_url":"https://api.github.com/users/waterloo-rocketry/orgs","repos_url":"https://api.github.com/users/waterloo-rocketry/repos","events_url":"https://api.github.com/users/waterloo-rocketry/events{/privacy}","received_events_url":"https://api.github.com/users/waterloo-rocketry/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/waterloo-rocketry/canlib","description":"Common library for all our boards interfacing over CAN","fork":false,"url":"https://api.github.com/repos/waterloo-rocketry/canlib","forks_url":"https://api.github.com/repos/waterloo-rocketry/canlib/forks","keys_url":"https://api.github.com/repos/waterloo-rocketry/canlib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/waterloo-rocketry/canlib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/waterloo-rocketry/canlib/teams","hooks_url":"https://api.github.com/repos/waterloo-rocketry/canlib/hooks","issue_events_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/events{/number}","events_url":"https://api.github.com/repos/waterloo-rocketry/canlib/events","assignees_url":"https://api.github.com/repos/waterloo-rocketry/canlib/assignees{/user}","branches_url":"https://api.github.com/repos/waterloo-rocketry/canlib/branches{/branch}","tags_url":"https://api.github.com/repos/waterloo-rocketry/canlib/tags","blobs_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/refs{/sha}","trees_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/waterloo-rocketry/canlib/statuses/{sha}","languages_url":"https://api.github.com/repos/waterloo-rocketry/canlib/languages","stargazers_url":"https://api.github.com/repos/waterloo-rocketry/canlib/stargazers","contributors_url":"https://api.github.com/repos/waterloo-rocketry/canlib/contributors","subscribers_url":"https://api.github.com/repos/waterloo-rocketry/canlib/subscribers","subscription_url":"https://api.github.com/repos/waterloo-rocketry/canlib/subscription","commits_url":"https://api.github.com/repos/waterloo-rocketry/canlib/commits{/sha}","git_commits_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/commits{/sha}","comments_url":"https://api.github.com/repos/waterloo-rocketry/canlib/comments{/number}","issue_comment_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/comments{/number}","contents_url":"https://api.github.com/repos/waterloo-rocketry/canlib/contents/{+path}","compare_url":"https://api.github.com/repos/waterloo-rocketry/canlib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/waterloo-rocketry/canlib/merges","archive_url":"https://api.github.com/repos/waterloo-rocketry/canlib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/waterloo-rocketry/canlib/downloads","issues_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues{/number}","pulls_url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls{/number}","milestones_url":"https://api.github.com/repos/waterloo-rocketry/canlib/milestones{/number}","notifications_url":"https://api.github.com/repos/waterloo-rocketry/canlib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/waterloo-rocketry/canlib/labels{/name}","releases_url":"https://api.github.com/repos/waterloo-rocketry/canlib/releases{/id}","deployments_url":"https://api.github.com/repos/waterloo-rocketry/canlib/deployments","created_at":"2018-11-24T16:26:56Z","updated_at":"2018-11-28T19:52:35Z","pushed_at":"2018-12-01T23:21:41Z","git_url":"git://github.com/waterloo-rocketry/canlib.git","ssh_url":"git@github.com:waterloo-rocketry/canlib.git","clone_url":"https://github.com/waterloo-rocketry/canlib.git","svn_url":"https://github.com/waterloo-rocketry/canlib","homepage":null,"size":475,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"waterloo-rocketry:master","ref":"master","sha":"7c4170cec94fc7a1c657866558e660be6b3c70e2","user":{"login":"waterloo-rocketry","id":34222613,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0MjIyNjEz","avatar_url":"https://avatars3.githubusercontent.com/u/34222613?v=4","gravatar_id":"","url":"https://api.github.com/users/waterloo-rocketry","html_url":"https://github.com/waterloo-rocketry","followers_url":"https://api.github.com/users/waterloo-rocketry/followers","following_url":"https://api.github.com/users/waterloo-rocketry/following{/other_user}","gists_url":"https://api.github.com/users/waterloo-rocketry/gists{/gist_id}","starred_url":"https://api.github.com/users/waterloo-rocketry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/waterloo-rocketry/subscriptions","organizations_url":"https://api.github.com/users/waterloo-rocketry/orgs","repos_url":"https://api.github.com/users/waterloo-rocketry/repos","events_url":"https://api.github.com/users/waterloo-rocketry/events{/privacy}","received_events_url":"https://api.github.com/users/waterloo-rocketry/received_events","type":"Organization","site_admin":false},"repo":{"id":158953946,"node_id":"MDEwOlJlcG9zaXRvcnkxNTg5NTM5NDY=","name":"canlib","full_name":"waterloo-rocketry/canlib","private":false,"owner":{"login":"waterloo-rocketry","id":34222613,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM0MjIyNjEz","avatar_url":"https://avatars3.githubusercontent.com/u/34222613?v=4","gravatar_id":"","url":"https://api.github.com/users/waterloo-rocketry","html_url":"https://github.com/waterloo-rocketry","followers_url":"https://api.github.com/users/waterloo-rocketry/followers","following_url":"https://api.github.com/users/waterloo-rocketry/following{/other_user}","gists_url":"https://api.github.com/users/waterloo-rocketry/gists{/gist_id}","starred_url":"https://api.github.com/users/waterloo-rocketry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/waterloo-rocketry/subscriptions","organizations_url":"https://api.github.com/users/waterloo-rocketry/orgs","repos_url":"https://api.github.com/users/waterloo-rocketry/repos","events_url":"https://api.github.com/users/waterloo-rocketry/events{/privacy}","received_events_url":"https://api.github.com/users/waterloo-rocketry/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/waterloo-rocketry/canlib","description":"Common library for all our boards interfacing over CAN","fork":false,"url":"https://api.github.com/repos/waterloo-rocketry/canlib","forks_url":"https://api.github.com/repos/waterloo-rocketry/canlib/forks","keys_url":"https://api.github.com/repos/waterloo-rocketry/canlib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/waterloo-rocketry/canlib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/waterloo-rocketry/canlib/teams","hooks_url":"https://api.github.com/repos/waterloo-rocketry/canlib/hooks","issue_events_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/events{/number}","events_url":"https://api.github.com/repos/waterloo-rocketry/canlib/events","assignees_url":"https://api.github.com/repos/waterloo-rocketry/canlib/assignees{/user}","branches_url":"https://api.github.com/repos/waterloo-rocketry/canlib/branches{/branch}","tags_url":"https://api.github.com/repos/waterloo-rocketry/canlib/tags","blobs_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/refs{/sha}","trees_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/waterloo-rocketry/canlib/statuses/{sha}","languages_url":"https://api.github.com/repos/waterloo-rocketry/canlib/languages","stargazers_url":"https://api.github.com/repos/waterloo-rocketry/canlib/stargazers","contributors_url":"https://api.github.com/repos/waterloo-rocketry/canlib/contributors","subscribers_url":"https://api.github.com/repos/waterloo-rocketry/canlib/subscribers","subscription_url":"https://api.github.com/repos/waterloo-rocketry/canlib/subscription","commits_url":"https://api.github.com/repos/waterloo-rocketry/canlib/commits{/sha}","git_commits_url":"https://api.github.com/repos/waterloo-rocketry/canlib/git/commits{/sha}","comments_url":"https://api.github.com/repos/waterloo-rocketry/canlib/comments{/number}","issue_comment_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/comments{/number}","contents_url":"https://api.github.com/repos/waterloo-rocketry/canlib/contents/{+path}","compare_url":"https://api.github.com/repos/waterloo-rocketry/canlib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/waterloo-rocketry/canlib/merges","archive_url":"https://api.github.com/repos/waterloo-rocketry/canlib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/waterloo-rocketry/canlib/downloads","issues_url":"https://api.github.com/repos/waterloo-rocketry/canlib/issues{/number}","pulls_url":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls{/number}","milestones_url":"https://api.github.com/repos/waterloo-rocketry/canlib/milestones{/number}","notifications_url":"https://api.github.com/repos/waterloo-rocketry/canlib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/waterloo-rocketry/canlib/labels{/name}","releases_url":"https://api.github.com/repos/waterloo-rocketry/canlib/releases{/id}","deployments_url":"https://api.github.com/repos/waterloo-rocketry/canlib/deployments","created_at":"2018-11-24T16:26:56Z","updated_at":"2018-11-28T19:52:35Z","pushed_at":"2018-12-01T23:21:41Z","git_url":"git://github.com/waterloo-rocketry/canlib.git","ssh_url":"git@github.com:waterloo-rocketry/canlib.git","clone_url":"https://github.com/waterloo-rocketry/canlib.git","svn_url":"https://github.com/waterloo-rocketry/canlib","homepage":null,"size":475,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2"},"html":{"href":"https://github.com/waterloo-rocketry/canlib/pull/2"},"issue":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/2"},"comments":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/waterloo-rocketry/canlib/statuses/c07bd051fc97c2b77500df19f2d31f4e1091b02f"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"amihaila"}}