// basically oauth_sign_url() from liboauth in steps.. char *oauthsign_ext (int mode, char *method, oauthparam *op, int optargc, char **optargv, int *saveargcp, char ***saveargvp) { int argc=0; char **argv = NULL; char *sign=NULL; url_to_array(&argc, &argv, mode, op->url); append_parameters(&argc, &argv, optargc, optargv); add_oauth_params_to_array(&argc, &argv, op); if (saveargvp && saveargcp) { clear_parameters(saveargcp, saveargvp); append_parameters(saveargcp, saveargvp, argc, argv); } sign=process_array(argc, argv, method, mode, op); free_array(argc,argv); return (sign); // needs to be free()d. #if 0 // cruft if (sign) { add_kv_to_array(&argc, &argv, "oauth_signature", sign); free(sign); } char *result; result = oauth_serialize_url(argc, (mode&2?1:0), argv); return (result); #endif }
// basically oauth_sign_url() from liboauth in steps.. char *oauthrequest_ext (int mode, oauthparam *op, int oauthargc, char **oauthargv, char *sign) { int argc=0; char **argv = NULL; char *request=NULL; append_parameters(&argc, &argv, oauthargc, oauthargv); if (sign) { add_kv_to_array(&argc, &argv, "oauth_signature", sign); } // build URL params request = oauth_serialize_url(argc, (mode&2?1:0), argv); char *reply = NULL; if(request) { if (mode&2) { // POST reply = oauth_http_post(argv[0],request); } else { // GET reply= oauth_http_get(request, NULL); } free(request); } free_array(argc,argv); return reply; }
TEST(UtilsTest,append_parameters) { char buf[132]; int n= append_parameters(buf, {{'X', 1}, {'Y', 2}, {'Z', 3}}, sizeof(buf)); //printf("%d - %s\n", n, buf); ASSERT_TRUE(n == 24); ASSERT_TRUE(strcmp(buf, "X1.0000 Y2.0000 Z3.0000 ") == 0); }
// if limit switches are enabled, then we must move off of the endstop otherwise we won't be able to move // checks if triggered and only backs off if triggered void Endstops::back_off_home(std::bitset<3> axis) { std::vector<std::pair<char, float>> params; this->status = BACK_OFF_HOME; // these are handled differently if(is_delta) { // Move off of the endstop using a regular relative move in Z only params.push_back({'Z', this->retract_mm[Z_AXIS] * (this->home_direction[Z_AXIS] ? 1 : -1)}); } else { // cartesians, concatenate all the moves we need to do into one gcode for( int c = X_AXIS; c <= Z_AXIS; c++ ) { if(!axis[c]) continue; // only for axes we asked to move // if not triggered no need to move off if(this->limit_enable[c] && debounced_get(c + (this->home_direction[c] ? 0 : 3)) ) { params.push_back({c + 'X', this->retract_mm[c] * (this->home_direction[c] ? 1 : -1)}); } } } if(!params.empty()) { // Move off of the endstop using a regular relative move params.insert(params.begin(), {'G', 0}); // use X slow rate to move, Z should have a max speed set anyway params.push_back({'F', this->slow_rates[X_AXIS] * 60.0F}); char gcode_buf[64]; append_parameters(gcode_buf, params, sizeof(gcode_buf)); Gcode gc(gcode_buf, &(StreamOutput::NullStream)); THEROBOT->push_state(); THEROBOT->inch_mode = false; // needs to be in mm THEROBOT->absolute_mode = false; // needs to be relative mode THEROBOT->on_gcode_received(&gc); // send to robot directly // Wait for above to finish THECONVEYOR->wait_for_idle(); THEROBOT->pop_state(); } this->status = NOT_HOMING; }