{"action":"created","comment":{"url":"https://api.github.com/repos/pdbogen/laseramp/pulls/comments/32546211","id":32546211,"diff_hunk":"@@ -11,101 +16,258 @@ void motion_control_arc();\n uint8_t motion_state = MS_IDLE;\n uint8_t motors_enabled = 1;\n \n+void emergency_stop() {\n+  disable_motors();\n+  digitalWrite( LASER_PIN, LOW );\n+  for (;;);\n+\n+}\n+\n void disable_motors() {\n-\tif( motors_enabled == 1 ) {\n-\t\tpinMode( X_ENABLE_PIN, OUTPUT ); digitalWrite( X_ENABLE_PIN, HIGH );\n-\t\tpinMode( Y_ENABLE_PIN, OUTPUT ); digitalWrite( Y_ENABLE_PIN, HIGH );\n-\t\tmotors_enabled = 0;\n-\t} else {\n-\t\treturn;\n-\t}\n+  if ( motors_enabled == 1 ) {\n+    SET_OUTPUT( X_ENABLE_PIN ); WRITE( X_ENABLE_PIN, HIGH );\n+    SET_OUTPUT( Y_ENABLE_PIN ); WRITE( Y_ENABLE_PIN, HIGH );\n+#ifdef Z_DRIVER_ENABLED\n+    SET_OUTPUT( Z_ENABLE_PIN ); WRITE( Z_ENABLE_PIN, HIGH );\n+#endif\n+    motors_enabled = 0;\n+  } else {\n+    return;\n+  }\n }\n \n void enable_motors() {\n-\tif( motors_enabled == 0 ) {\n-\t\tpinMode( X_ENABLE_PIN, OUTPUT ); digitalWrite( X_ENABLE_PIN, LOW );\n-\t\tpinMode( Y_ENABLE_PIN, OUTPUT ); digitalWrite( Y_ENABLE_PIN, LOW );\n-\t\tmotors_enabled = 1;\n-\t} else {\n-\t\treturn;\n-\t}\n+  if ( motors_enabled == 0 ) {\n+    SET_OUTPUT( X_ENABLE_PIN ); WRITE( X_ENABLE_PIN, LOW );\n+    SET_OUTPUT( Y_ENABLE_PIN ); WRITE( Y_ENABLE_PIN, LOW );\n+#ifdef Z_DRIVER_ENABLED\n+    SET_OUTPUT( Z_ENABLE_PIN ); WRITE( Z_ENABLE_PIN, LOW );\n+#endif\n+    motors_enabled = 1;\n+  } else {\n+    return;\n+  }\n }\n \n void motion_control( HardwareSerial s ) {\n-\tpower_control();\n-\n-\tif( motion_state == MS_LINEAR || motion_state == MS_SEG_CW || motion_state == MS_SEG_CCW)\n-\t\tmotion_control_linear();\n-\tif( motion_state == MS_CW || motion_state == MS_CCW )\n-\t\tmotion_control_arc();\n-\tif( motion_state == MS_HOMING_1 )\n-\t\tmotion_control_home_primary();\n-\tif( motion_state == MS_HOMING_2 )\n-\t\tmotion_control_home_secondary();\n-\tif( motion_state == MS_STOPPING ) {\n-\t\tdisable_motors();\n-\t\tpower_setpoint = 0;\n-\t\tcommand_running = false;\n-\t\tmotion_state = MS_IDLE;\n-\t}\n+  power_control();\n+\n+  if ( motion_state == MS_LINEAR || motion_state == MS_SEG_CW || motion_state == MS_SEG_CCW || motion_state == MS_G0_1 || motion_state == MS_G0_2)\n+    motion_control_linear();\n+#ifdef SUPPORTARCMOVES\n+  if ( motion_state == MS_CW || motion_state == MS_CCW )\n+    motion_control_arc();\n+#endif\n+  if ( motion_state == MS_HOMING_1 )\n+    motion_control_home_primary();\n+  if ( motion_state == MS_HOMING_2 )\n+    motion_control_home_secondary();\n+  if ( motion_state == MS_DWELLING_1)\n+    motion_control_dwell_primary();\n+  if ( motion_state == MS_DWELLING_2)\n+    motion_control_dwell_secondary();\n+  if ( motion_state == MS_STOPPING ) {\n+    disable_motors();\n+    #ifdef LASERRESETSTOZERO\n+    power_setpoint = 0;\n+    #endif\n+    command_running = false;\n+    motion_state = MS_IDLE;\n+  }\n+}\n+\n+#ifdef Z_DRIVER_ENABLED\n+void G0_move( int32_t x, int32_t y, int32_t z, uint16_t f ) {\n+#else\n+void G0_move( int32_t x, int32_t y, uint16_t f ) {\n+#endif\n+\n+  realposition[0] = x;\n+  realposition[1] = y;\n+  x = x * XSTEPS_PER_MM / 100;\n+  y = y * YSTEPS_PER_MM / 100;\n+  // Clamp to minimums\n+  x = (x < 0 ? 0 : x);\n+  y = (y < 0 ? 0 : y);\n+#ifdef Z_DRIVER_ENABLED\n+  realposition[2] = z;\n+  z = z * ZSTEPS_PER_MM / 100;\n+  z = (z < 0 ? 0 : z);\n+  destination[2] = z;\n+#endif\n+\n+#ifdef DEBUG_MOVE\n+  Serial.print( F(\"// Executing move to (\") );\n+  Serial.print( x / XSTEPS_PER_MM ); Serial.print( F(\",\") ); Serial.print( y / YSTEPS_PER_MM );\n+  Serial.print( F(\") at \") ); Serial.print( f );\n+  Serial.println( F(\" mm/min\") );\n+#endif\n+\n+  destination[0] = x;\n+  destination[1] = y;\n+\n+  // for now F will be steps/min\n+  // total travel time in minutes T is sqrt(x^2+y^2) / F\n+  // rate (steps/min) in X dir is X / T\n+  // rate (steps/min) in Y dir is Y / T\n+  uint32_t dx = (position[0] > destination[0] ? position[0] - destination[0] : destination[0] - position[0]);\n+  uint32_t dy = (position[1] > destination[1] ? position[1] - destination[1] : destination[1] - position[1]);\n+#ifdef Z_DRIVER_ENABLED\n+  uint32_t dz = (position[2] > destination[2] ? position[2] - destination[2] : destination[2] - position[2]);\n+#endif\n+\n+  // rate per direction in mm/min\n+  // ^-1 -> min/mm, /60 -> sec/mm, /1000 -> ms/mm\n+  float T = (float)dx * XSTEPS_PER_MM / f * RATE_FACTOR;\n+  rate[0] = (float)T / dx / 2.0;\n+  T = (float)dy * YSTEPS_PER_MM / f * RATE_FACTOR;\n+  rate[1] = (float)T  / dy / 2.0;\n+#ifdef Z_DRIVER_ENABLED\n+  T = (float)dz * ZSTEPS_PER_MM / f * RATE_FACTOR;\n+  rate[2] = (float)T  / dz / 2.0;\n+#endif\n+\n+#ifdef DEBUG_OUTPUT\n+  Serial.print( F(\"// dx: \") ); Serial.print( dx ); Serial.print( \" (\" ); Serial.print( dx / XSTEPS_PER_MM ); Serial.print( \"mm)\" );\n+  Serial.print( F(\" dy: \") ); Serial.print( dy ); Serial.print( \" (\" ); Serial.print( dy / YSTEPS_PER_MM ); Serial.print( \"mm)\" );\n+  Serial.print( F(\" d: \" ) ); Serial.print( sqrt( pow( dx, 2 ) + pow( dy, 2 ) ) ); Serial.print( \" (\" ); Serial.print( sqrt( pow( dx, 2 ) + pow( dy, 2 ) ) / XSTEPS_PER_MM ); Serial.print( \"mm)\" );\n+  Serial.print( F(\" ms/step: \") ); Serial.print( XSTEPS_PER_MM / f * 60 * 1000 );\n+  Serial.print( F(\" T: \") ); Serial.print( T ); Serial.println( F(\"ms\") );\n+#endif\n+\n+\n+\n+#ifdef DEBUG_OUTPUT\n+  Serial.print( \"// \" );\n+  Serial.print( rate[0] ); Serial.print( F(\" RF*ms / X step, \") );\n+  Serial.print( rate[1] ); Serial.println( F(\" RF*ms / Y step\") );\n+  Serial.print( \"// \" );\n+#endif\n+  if ( destination[0] > position[0] ) {\n+    direction[0] = 1;\n+    WRITE( X_DIR_PIN, X_POS );\n+  } else {\n+    direction[0] = -1;\n+    WRITE( X_DIR_PIN, X_NEG );\n+  }\n+\n+  if ( destination[1] > position[1] ) {\n+    direction[1] = 1;\n+    WRITE( Y_DIR_PIN, Y_POS );\n+  } else {\n+    direction[1] = -1;\n+    WRITE( Y_DIR_PIN, Y_NEG );\n+  }\n+#ifdef Z_DRIVER_ENABLED\n+  if ( destination[2] > position[2] ) {\n+    direction[2] = 1;\n+    WRITE( Z_DIR_PIN, Z_POS );\n+  } else {\n+    direction[2] = -1;\n+    WRITE( Z_DIR_PIN, Z_NEG );\n+    ms_since_step[2] = 0;\n+  }\n+#endif\n+\n+  ms_since_step[0] = 0;\n+  ms_since_step[1] = 0;\n+  motion_state = MS_G0_1;\n }\n \n void motion_control_home_primary() {\n-\tuint8_t x = digitalRead( X_STOP_PIN );\n-\tuint8_t y = digitalRead( Y_STOP_PIN );\n-\n-\tdigitalWrite( X_DIR_PIN, HIGH );\n-\tdigitalWrite( Y_DIR_PIN, HIGH );\n-\n-\tif( x == X_STOP_ENGAGED && y == Y_STOP_ENGAGED ) {\n-\t\tmotion_state = MS_HOMING_2;\n-\t\treturn;\n-\t}\n-\n-\tif( x != X_STOP_ENGAGED ) {\n-\t\tif( ms_since_step[0] > 0 ) {\n-\t\t\tenable_motors();\n-\t\t\tdigitalWrite( X_STEP_PIN, !digitalRead( X_STEP_PIN ) );\n-\t\t\tms_since_step[0] = 0;\n-\t\t}\n-\t}\n-\tif( y != Y_STOP_ENGAGED ) {\n-\t\tif( ms_since_step[1] > 0 ) {\n-\t\t\tenable_motors();\n-\t\t\tdigitalWrite( Y_STEP_PIN, !digitalRead( Y_STEP_PIN ) );\n-\t\t\tms_since_step[1] = 0;\n-\t\t}\n-\t}\n+  uint8_t x = READ( X_STOP_PIN );\n+  uint8_t y = READ( Y_STOP_PIN );\n+\n+  WRITE( X_DIR_PIN, X_NEG );\n+  WRITE( Y_DIR_PIN, Y_NEG );\n+#ifdef Z_DRIVER_ENABLED\n+  uint8_t z = READ( Z_STOP_PIN );\n+  WRITE( Z_DIR_PIN, Z_NEG );\n+  if (  z == Z_STOP_ENGAGED &&  x == X_STOP_ENGAGED && y == Y_STOP_ENGAGED ) {\n+#else\n+  if (  x == X_STOP_ENGAGED && y == Y_STOP_ENGAGED ) {\n+#endif\n+    motion_state = MS_HOMING_2;\n+    return;\n+  }\n+\n+#ifdef Z_DRIVER_ENABLED\n+  if ( z != Z_STOP_ENGAGED ) {\n+    if ( ms_since_step[2] > 0 ) {\n+      enable_motors();\n+      WRITE( Z_STEP_PIN, !READ( Z_STEP_PIN ) );\n+      ms_since_step[2] = 0;\n+    }\n+  }\n+#endif\n+  if ( x != X_STOP_ENGAGED ) {\n+    if ( ms_since_step[0] > 0 ) {\n+      enable_motors();\n+      WRITE( X_STEP_PIN, !READ( X_STEP_PIN ) );\n+      ms_since_step[0] = 0;\n+    }\n+  }\n+  if ( y != Y_STOP_ENGAGED ) {\n+    if ( ms_since_step[1] > 0 ) {\n+      enable_motors();\n+      WRITE( Y_STEP_PIN, !READ( Y_STEP_PIN ) );\n+      ms_since_step[1] = 0;\n+    }\n+  }\n }\n \n void motion_control_home_secondary() {\n-\tuint8_t x = digitalRead( X_STOP_PIN );\n-\tuint8_t y = digitalRead( Y_STOP_PIN );\n-\n-\tdigitalWrite( X_DIR_PIN, LOW );\n-\tdigitalWrite( Y_DIR_PIN, LOW );\n-\n-\tif( x != X_STOP_ENGAGED && y != Y_STOP_ENGAGED ) {\n-\t\tposition[0] = 53 * STEPS_PER_MM;\n-\t\tposition[1] = 0;\n-\t\tmotion_state = MS_STOPPING;\n-\t\treturn;\n-\t}\n-\n-\tif( x == X_STOP_ENGAGED ) {\n-\t\tif( ms_since_step[0] > 10 ) {\n-\t\t\tenable_motors();\n-\t\t\tdigitalWrite( X_STEP_PIN, !digitalRead( X_STEP_PIN ) );\n-\t\t\tms_since_step[0] = 0;\n-\t\t}\n-\t}\n-\tif( y == Y_STOP_ENGAGED ) {\n-\t\tif( ms_since_step[1] > 10 ) {\n-\t\t\tenable_motors();\n-\t\t\tdigitalWrite( Y_STEP_PIN, !digitalRead( Y_STEP_PIN ) );\n-\t\t\tms_since_step[1] = 0;\n-\t\t}\n-\t}\n+  uint8_t x = READ( X_STOP_PIN );\n+  uint8_t y = READ( Y_STOP_PIN );\n+\n+  WRITE( X_DIR_PIN, X_POS );\n+  WRITE( Y_DIR_PIN, Y_POS );\n+#ifdef Z_DRIVER_ENABLED\n+  uint8_t z = READ( Z_STOP_PIN );\n+  WRITE( Z_DIR_PIN, Z_POS );\n+  if ( z != Z_STOP_ENGAGED && x != X_STOP_ENGAGED && y != Y_STOP_ENGAGED ) {\n+    realposition[2] = 0;\n+#else\n+  if ( x != X_STOP_ENGAGED && y != Y_STOP_ENGAGED ) {\n+#endif\n+    realposition[0] = 0;\n+    realposition[1] = 0;\n+    position[0] = 0;\n+    position[1] = 0;\n+    homeposition[0] = 0;\n+    homeposition[1] = 0;\n+#ifdef Z_DRIVER_ENABLED\n+    realposition[2] = 0;\n+    position[2] = 0;\n+    homeposition[2] = 0;\n+\n+#endif\n+    motion_state = MS_STOPPING;\n+    return;\n+  }\n+#ifdef Z_DRIVER_ENABLED\n+  if ( z == Z_STOP_ENGAGED ) {\n+    if ( ms_since_step[2] > HOMEDELAY) {\n+      enable_motors();\n+      WRITE( Z_STEP_PIN, !READ( Z_STEP_PIN ) );","path":"firmware/motion.cpp","position":333,"original_position":333,"commit_id":"a1e00cec2bdcbc2c688d393d26ef5c738bf64eda","original_commit_id":"a1e00cec2bdcbc2c688d393d26ef5c738bf64eda","user":{"login":"pdbogen","id":321591,"avatar_url":"https://avatars.githubusercontent.com/u/321591?v=3","gravatar_id":"","url":"https://api.github.com/users/pdbogen","html_url":"https://github.com/pdbogen","followers_url":"https://api.github.com/users/pdbogen/followers","following_url":"https://api.github.com/users/pdbogen/following{/other_user}","gists_url":"https://api.github.com/users/pdbogen/gists{/gist_id}","starred_url":"https://api.github.com/users/pdbogen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdbogen/subscriptions","organizations_url":"https://api.github.com/users/pdbogen/orgs","repos_url":"https://api.github.com/users/pdbogen/repos","events_url":"https://api.github.com/users/pdbogen/events{/privacy}","received_events_url":"https://api.github.com/users/pdbogen/received_events","type":"User","site_admin":false},"body":"`TOGGLE`, as above.","created_at":"2015-06-16T17:20:50Z","updated_at":"2015-06-16T17:20:50Z","html_url":"https://github.com/pdbogen/laseramp/pull/1#discussion_r32546211","pull_request_url":"https://api.github.com/repos/pdbogen/laseramp/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/pdbogen/laseramp/pulls/comments/32546211"},"html":{"href":"https://github.com/pdbogen/laseramp/pull/1#discussion_r32546211"},"pull_request":{"href":"https://api.github.com/repos/pdbogen/laseramp/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/pdbogen/laseramp/pulls/1","id":37798575,"html_url":"https://github.com/pdbogen/laseramp/pull/1","diff_url":"https://github.com/pdbogen/laseramp/pull/1.diff","patch_url":"https://github.com/pdbogen/laseramp/pull/1.patch","issue_url":"https://api.github.com/repos/pdbogen/laseramp/issues/1","number":1,"state":"open","locked":false,"title":"Major enchacements.","user":{"login":"meirm","id":551713,"avatar_url":"https://avatars.githubusercontent.com/u/551713?v=3","gravatar_id":"","url":"https://api.github.com/users/meirm","html_url":"https://github.com/meirm","followers_url":"https://api.github.com/users/meirm/followers","following_url":"https://api.github.com/users/meirm/following{/other_user}","gists_url":"https://api.github.com/users/meirm/gists{/gist_id}","starred_url":"https://api.github.com/users/meirm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meirm/subscriptions","organizations_url":"https://api.github.com/users/meirm/orgs","repos_url":"https://api.github.com/users/meirm/repos","events_url":"https://api.github.com/users/meirm/events{/privacy}","received_events_url":"https://api.github.com/users/meirm/received_events","type":"User","site_admin":false},"body":"* Add option to use Timer1 or Timer3 library which allows you to use GRBL/UNO or RAMPS/MEGA HW.\r\n* Add optional Z axis.\r\n* Use fastio to speed up the code.\r\n* Add more Gcode commands.\r\n* Make all axis 32bit to allow work on big machines.","created_at":"2015-06-16T14:08:21Z","updated_at":"2015-06-16T17:20:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"abdcdf190accabf1bcd253c7d888be8d4534357e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/pdbogen/laseramp/pulls/1/commits","review_comments_url":"https://api.github.com/repos/pdbogen/laseramp/pulls/1/comments","review_comment_url":"https://api.github.com/repos/pdbogen/laseramp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pdbogen/laseramp/issues/1/comments","statuses_url":"https://api.github.com/repos/pdbogen/laseramp/statuses/a1e00cec2bdcbc2c688d393d26ef5c738bf64eda","head":{"label":"meirm:32bit3axis","ref":"32bit3axis","sha":"a1e00cec2bdcbc2c688d393d26ef5c738bf64eda","user":{"login":"meirm","id":551713,"avatar_url":"https://avatars.githubusercontent.com/u/551713?v=3","gravatar_id":"","url":"https://api.github.com/users/meirm","html_url":"https://github.com/meirm","followers_url":"https://api.github.com/users/meirm/followers","following_url":"https://api.github.com/users/meirm/following{/other_user}","gists_url":"https://api.github.com/users/meirm/gists{/gist_id}","starred_url":"https://api.github.com/users/meirm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meirm/subscriptions","organizations_url":"https://api.github.com/users/meirm/orgs","repos_url":"https://api.github.com/users/meirm/repos","events_url":"https://api.github.com/users/meirm/events{/privacy}","received_events_url":"https://api.github.com/users/meirm/received_events","type":"User","site_admin":false},"repo":{"id":33509198,"name":"laseramp","full_name":"meirm/laseramp","owner":{"login":"meirm","id":551713,"avatar_url":"https://avatars.githubusercontent.com/u/551713?v=3","gravatar_id":"","url":"https://api.github.com/users/meirm","html_url":"https://github.com/meirm","followers_url":"https://api.github.com/users/meirm/followers","following_url":"https://api.github.com/users/meirm/following{/other_user}","gists_url":"https://api.github.com/users/meirm/gists{/gist_id}","starred_url":"https://api.github.com/users/meirm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meirm/subscriptions","organizations_url":"https://api.github.com/users/meirm/orgs","repos_url":"https://api.github.com/users/meirm/repos","events_url":"https://api.github.com/users/meirm/events{/privacy}","received_events_url":"https://api.github.com/users/meirm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/meirm/laseramp","description":"GCode-based firmware for cheap Chinese laser engravers","fork":true,"url":"https://api.github.com/repos/meirm/laseramp","forks_url":"https://api.github.com/repos/meirm/laseramp/forks","keys_url":"https://api.github.com/repos/meirm/laseramp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/meirm/laseramp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/meirm/laseramp/teams","hooks_url":"https://api.github.com/repos/meirm/laseramp/hooks","issue_events_url":"https://api.github.com/repos/meirm/laseramp/issues/events{/number}","events_url":"https://api.github.com/repos/meirm/laseramp/events","assignees_url":"https://api.github.com/repos/meirm/laseramp/assignees{/user}","branches_url":"https://api.github.com/repos/meirm/laseramp/branches{/branch}","tags_url":"https://api.github.com/repos/meirm/laseramp/tags","blobs_url":"https://api.github.com/repos/meirm/laseramp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/meirm/laseramp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/meirm/laseramp/git/refs{/sha}","trees_url":"https://api.github.com/repos/meirm/laseramp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/meirm/laseramp/statuses/{sha}","languages_url":"https://api.github.com/repos/meirm/laseramp/languages","stargazers_url":"https://api.github.com/repos/meirm/laseramp/stargazers","contributors_url":"https://api.github.com/repos/meirm/laseramp/contributors","subscribers_url":"https://api.github.com/repos/meirm/laseramp/subscribers","subscription_url":"https://api.github.com/repos/meirm/laseramp/subscription","commits_url":"https://api.github.com/repos/meirm/laseramp/commits{/sha}","git_commits_url":"https://api.github.com/repos/meirm/laseramp/git/commits{/sha}","comments_url":"https://api.github.com/repos/meirm/laseramp/comments{/number}","issue_comment_url":"https://api.github.com/repos/meirm/laseramp/issues/comments{/number}","contents_url":"https://api.github.com/repos/meirm/laseramp/contents/{+path}","compare_url":"https://api.github.com/repos/meirm/laseramp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/meirm/laseramp/merges","archive_url":"https://api.github.com/repos/meirm/laseramp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/meirm/laseramp/downloads","issues_url":"https://api.github.com/repos/meirm/laseramp/issues{/number}","pulls_url":"https://api.github.com/repos/meirm/laseramp/pulls{/number}","milestones_url":"https://api.github.com/repos/meirm/laseramp/milestones{/number}","notifications_url":"https://api.github.com/repos/meirm/laseramp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/meirm/laseramp/labels{/name}","releases_url":"https://api.github.com/repos/meirm/laseramp/releases{/id}","created_at":"2015-04-06T22:28:50Z","updated_at":"2015-06-16T13:58:59Z","pushed_at":"2015-06-16T14:07:38Z","git_url":"git://github.com/meirm/laseramp.git","ssh_url":"git@github.com:meirm/laseramp.git","clone_url":"https://github.com/meirm/laseramp.git","svn_url":"https://github.com/meirm/laseramp","homepage":null,"size":136,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pdbogen:master","ref":"master","sha":"f84f6398e2d78e51d9ff36c489f707192cde0a41","user":{"login":"pdbogen","id":321591,"avatar_url":"https://avatars.githubusercontent.com/u/321591?v=3","gravatar_id":"","url":"https://api.github.com/users/pdbogen","html_url":"https://github.com/pdbogen","followers_url":"https://api.github.com/users/pdbogen/followers","following_url":"https://api.github.com/users/pdbogen/following{/other_user}","gists_url":"https://api.github.com/users/pdbogen/gists{/gist_id}","starred_url":"https://api.github.com/users/pdbogen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdbogen/subscriptions","organizations_url":"https://api.github.com/users/pdbogen/orgs","repos_url":"https://api.github.com/users/pdbogen/repos","events_url":"https://api.github.com/users/pdbogen/events{/privacy}","received_events_url":"https://api.github.com/users/pdbogen/received_events","type":"User","site_admin":false},"repo":{"id":32233779,"name":"laseramp","full_name":"pdbogen/laseramp","owner":{"login":"pdbogen","id":321591,"avatar_url":"https://avatars.githubusercontent.com/u/321591?v=3","gravatar_id":"","url":"https://api.github.com/users/pdbogen","html_url":"https://github.com/pdbogen","followers_url":"https://api.github.com/users/pdbogen/followers","following_url":"https://api.github.com/users/pdbogen/following{/other_user}","gists_url":"https://api.github.com/users/pdbogen/gists{/gist_id}","starred_url":"https://api.github.com/users/pdbogen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdbogen/subscriptions","organizations_url":"https://api.github.com/users/pdbogen/orgs","repos_url":"https://api.github.com/users/pdbogen/repos","events_url":"https://api.github.com/users/pdbogen/events{/privacy}","received_events_url":"https://api.github.com/users/pdbogen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pdbogen/laseramp","description":"GCode-based firmware for cheap Chinese laser engravers","fork":false,"url":"https://api.github.com/repos/pdbogen/laseramp","forks_url":"https://api.github.com/repos/pdbogen/laseramp/forks","keys_url":"https://api.github.com/repos/pdbogen/laseramp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pdbogen/laseramp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pdbogen/laseramp/teams","hooks_url":"https://api.github.com/repos/pdbogen/laseramp/hooks","issue_events_url":"https://api.github.com/repos/pdbogen/laseramp/issues/events{/number}","events_url":"https://api.github.com/repos/pdbogen/laseramp/events","assignees_url":"https://api.github.com/repos/pdbogen/laseramp/assignees{/user}","branches_url":"https://api.github.com/repos/pdbogen/laseramp/branches{/branch}","tags_url":"https://api.github.com/repos/pdbogen/laseramp/tags","blobs_url":"https://api.github.com/repos/pdbogen/laseramp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pdbogen/laseramp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pdbogen/laseramp/git/refs{/sha}","trees_url":"https://api.github.com/repos/pdbogen/laseramp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pdbogen/laseramp/statuses/{sha}","languages_url":"https://api.github.com/repos/pdbogen/laseramp/languages","stargazers_url":"https://api.github.com/repos/pdbogen/laseramp/stargazers","contributors_url":"https://api.github.com/repos/pdbogen/laseramp/contributors","subscribers_url":"https://api.github.com/repos/pdbogen/laseramp/subscribers","subscription_url":"https://api.github.com/repos/pdbogen/laseramp/subscription","commits_url":"https://api.github.com/repos/pdbogen/laseramp/commits{/sha}","git_commits_url":"https://api.github.com/repos/pdbogen/laseramp/git/commits{/sha}","comments_url":"https://api.github.com/repos/pdbogen/laseramp/comments{/number}","issue_comment_url":"https://api.github.com/repos/pdbogen/laseramp/issues/comments{/number}","contents_url":"https://api.github.com/repos/pdbogen/laseramp/contents/{+path}","compare_url":"https://api.github.com/repos/pdbogen/laseramp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pdbogen/laseramp/merges","archive_url":"https://api.github.com/repos/pdbogen/laseramp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pdbogen/laseramp/downloads","issues_url":"https://api.github.com/repos/pdbogen/laseramp/issues{/number}","pulls_url":"https://api.github.com/repos/pdbogen/laseramp/pulls{/number}","milestones_url":"https://api.github.com/repos/pdbogen/laseramp/milestones{/number}","notifications_url":"https://api.github.com/repos/pdbogen/laseramp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pdbogen/laseramp/labels{/name}","releases_url":"https://api.github.com/repos/pdbogen/laseramp/releases{/id}","created_at":"2015-03-14T21:50:25Z","updated_at":"2015-04-14T05:28:19Z","pushed_at":"2015-06-16T16:25:16Z","git_url":"git://github.com/pdbogen/laseramp.git","ssh_url":"git@github.com:pdbogen/laseramp.git","clone_url":"https://github.com/pdbogen/laseramp.git","svn_url":"https://github.com/pdbogen/laseramp","homepage":null,"size":172,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pdbogen/laseramp/pulls/1"},"html":{"href":"https://github.com/pdbogen/laseramp/pull/1"},"issue":{"href":"https://api.github.com/repos/pdbogen/laseramp/issues/1"},"comments":{"href":"https://api.github.com/repos/pdbogen/laseramp/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/pdbogen/laseramp/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/pdbogen/laseramp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pdbogen/laseramp/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/pdbogen/laseramp/statuses/a1e00cec2bdcbc2c688d393d26ef5c738bf64eda"}}}}