#include "libs/utils.h"
#include "libs/SerialMessage.h"
#include "libs/StreamOutput.h"
-#include "modules/robot/Conveyor.h"
+#include "Conveyor.h"
#include "DirHandle.h"
#include "mri.h"
#include "version.h"
new_message.stream->printf("ok\n");
break;
+ case 'J':
+ // instant jog command
+ jog(possible_command, new_message.stream);
+ break;
+
default:
new_message.stream->printf("error:Invalid statement\n");
break;
stream->printf(" Paste the above in the M305 S0 command, then save with M500\n");
}else{
char buf[80];
- int n = snprintf(buf, sizeof(buf), "M305 S%d I%1.18f J%1.18f K%1.18f", saveto, c1, c2, c3);
+ size_t n = snprintf(buf, sizeof(buf), "M305 S%d I%1.18f J%1.18f K%1.18f", saveto, c1, c2, c3);
+ if(n > sizeof(buf)) n= sizeof(buf);
string g(buf, n);
Gcode gcode(g, &(StreamOutput::NullStream));
THEKERNEL->call_event(ON_GCODE_RECEIVED, &gcode );
// reset the position based on current actuator position
THEROBOT->reset_position_from_current_actuator_position();
- stream->printf("done\n");
+ //stream->printf("done\n");
}else {
stream->printf("usage:\n test jog axis distance iterations [feedrate]\n");
}
}
+void SimpleShell::jog(string parameters, StreamOutput *stream)
+{
+ // $J X0.1 F0.5
+ int n_motors= THEROBOT->get_number_registered_motors();
+
+ // get axis to move and amount (X0.1)
+ // for now always 1 axis
+ size_t npos= parameters.find_first_of("XYZABC");
+ if(npos == string::npos) {
+ stream->printf("usage: $J X|Y|Z|A|B|C 0.01 [F0.5]\n");
+ return;
+ }
+
+ string s = parameters.substr(npos);
+ if(s.empty() || s.size() < 2) {
+ stream->printf("usage: $J X0.01 [F0.5]\n");
+ return;
+ }
+ char ax= toupper(s[0]);
+ uint8_t a= ax >= 'X' ? ax - 'X' : ax - 'A' + 3;
+ if(a >= n_motors) {
+ stream->printf("error:bad axis\n");
+ return;
+ }
+
+ float d= strtof(s.substr(1).c_str(), NULL);
+
+ float delta[n_motors];
+ for (int i = 0; i < n_motors; ++i) {
+ delta[i]= 0;
+ }
+ delta[a]= d;
+
+ // get speed scale
+ float scale= 1.0F;
+ npos= parameters.find_first_of("F");
+ if(npos != string::npos && npos+1 < parameters.size()) {
+ scale= strtof(parameters.substr(npos+1).c_str(), NULL);
+ }
+
+ THEROBOT->push_state();
+ float rate_mm_s= THEROBOT->actuators[a]->get_max_rate() * scale;
+ THEROBOT->delta_move(delta, rate_mm_s, n_motors);
+
+ // turn off queue delay and run it now
+ THECONVEYOR->force_queue();
+ THEROBOT->pop_state();
+ stream->printf("Jog: %c%f F%f\n", ax, d, scale);
+}
+
void SimpleShell::help_command( string parameters, StreamOutput *stream )
{
stream->printf("Commands:\r\n");