Skip to content

Commit 7fb914d

Browse files
committed
Multispindle: Make S commands modal again.
It appears that moving the emccanon globals into the EMC_STAT struct doesn't work. Signed-off-by: andy pugh <andy@bodgesoc.org>
1 parent 5b477ad commit 7fb914d

2 files changed

Lines changed: 60 additions & 53 deletions

File tree

src/emc/nml_intf/canon.hh

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,21 @@ struct CANON_VECTOR {
126126
double x, y, z;
127127
};
128128

129+
typedef struct {
130+
int feed_mode;
131+
int synched;
132+
double speed;
133+
int dir;
134+
double css_maximum;
135+
double css_factor;
136+
} CanonSpindle_t;
137+
129138
typedef struct CanonConfig_t {
130139
CanonConfig_t() : rotary_unlock_for_traverse(-1) {}
131140

132141
double xy_rotation;
133142
int rotary_unlock_for_traverse; // jointnumber or -1
134143

135-
// moved to the emcStatus->spindle[] structure
136-
//double css_maximum;
137-
//double css_numerator;
138-
139-
int feed_mode;
140-
int synched;
141-
int spindle;
142144
CANON_POSITION g5xOffset;
143145
CANON_POSITION g92Offset;
144146
/*
@@ -164,9 +166,10 @@ typedef struct CanonConfig_t {
164166
almost any deviation trying to keep speed up. */
165167
double motionTolerance;
166168
double naivecamTolerance;
167-
/* Spindle speed is saved here */
168-
double spindleSpeed;
169-
int spindle_dir;
169+
int feed_mode;
170+
int spindle_num; //current spindle for spindle-synch motion
171+
CanonSpindle_t spindle[8]; // EMCMOT_MAX_SPINDLES not defined in this context
172+
170173
/* Prepped tool is saved here */
171174
// int preppedTool;
172175
/*

src/emc/task/emccanon.cc

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,8 @@ static void send_g5x_msg(int index) {
420420
set_g5x_msg.origin = to_ext_pose(canon.g5xOffset);
421421

422422
for (int s = 0; s < emcStatus->motion.traj.spindles; s++){
423-
if(emcStatus->motion.spindle[s].css_maximum) {
424-
SET_SPINDLE_SPEED(s, emcStatus->motion.spindle[s].speed);
423+
if(canon.spindle[s].css_maximum) {
424+
SET_SPINDLE_SPEED(s, canon.spindle[s].speed);
425425
}
426426
}
427427
interp_list.append(set_g5x_msg);
@@ -437,8 +437,8 @@ static void send_g92_msg(void) {
437437
set_g92_msg.origin = to_ext_pose(canon.g92Offset);
438438

439439
for (int s = 0; s < emcStatus->motion.traj.spindles; s++){
440-
if(emcStatus->motion.spindle[s].css_maximum) {
441-
SET_SPINDLE_SPEED(s, emcStatus->motion.spindle[s].speed);
440+
if(canon.spindle[s].css_maximum) {
441+
SET_SPINDLE_SPEED(s, canon.spindle[s].speed);
442442
}
443443
}
444444
interp_list.append(set_g92_msg);
@@ -493,15 +493,15 @@ void SET_TRAVERSE_RATE(double rate)
493493
void SET_FEED_MODE(int spindle, int mode) {
494494
flush_segments();
495495
canon.feed_mode = mode;
496-
canon.spindle = spindle;
496+
canon.spindle_num = spindle;
497497
if(canon.feed_mode == 0) STOP_SPEED_FEED_SYNCH();
498498
}
499499

500500
void SET_FEED_RATE(double rate)
501501
{
502502

503503
if(canon.feed_mode) {
504-
START_SPEED_FEED_SYNCH(canon.spindle, rate, 1);
504+
START_SPEED_FEED_SYNCH(canon.spindle_num, rate, 1);
505505
canon.linearFeedRate = rate;
506506
} else {
507507
/* convert from /min to /sec */
@@ -873,7 +873,7 @@ static void flush_segments(void) {
873873

874874
linearMoveMsg.type = EMC_MOTION_TYPE_FEED;
875875
linearMoveMsg.indexrotary = -1;
876-
if ((vel && acc) || canon.synched) {
876+
if ((vel && acc) || canon.spindle[canon.spindle_num].synched) {
877877
interp_list.set_line_number(line_no);
878878
interp_list.append(linearMoveMsg);
879879
}
@@ -999,7 +999,7 @@ void STRAIGHT_TRAVERSE(int line_number,
999999
}
10001000

10011001
if(old_feed_mode)
1002-
START_SPEED_FEED_SYNCH(canon.spindle, canon.linearFeedRate, 1);
1002+
START_SPEED_FEED_SYNCH(canon.spindle_num, canon.linearFeedRate, 1);
10031003

10041004
canonUpdateEndPoint(x, y, z, a, b, c, u, v, w);
10051005
}
@@ -1175,7 +1175,7 @@ void START_SPEED_FEED_SYNCH(int spindle, double feed_per_revolution, bool veloci
11751175
spindlesyncMsg.feed_per_revolution = TO_EXT_LEN(FROM_PROG_LEN(feed_per_revolution));
11761176
spindlesyncMsg.velocity_mode = velocity_mode;
11771177
interp_list.append(spindlesyncMsg);
1178-
canon.synched = 1;
1178+
canon.spindle[spindle].synched = 1;
11791179
}
11801180

11811181
void STOP_SPEED_FEED_SYNCH()
@@ -1185,7 +1185,7 @@ void STOP_SPEED_FEED_SYNCH()
11851185
spindlesyncMsg.feed_per_revolution = 0.0;
11861186
spindlesyncMsg.velocity_mode = false;
11871187
interp_list.append(spindlesyncMsg);
1188-
canon.synched = 0;
1188+
canon.spindle[canon.spindle_num].synched = 0;
11891189
}
11901190

11911191
/* Machining Functions */
@@ -1782,27 +1782,27 @@ void SPINDLE_RETRACT_TRAVERSE()
17821782
}
17831783

17841784
void SET_SPINDLE_MODE(int spindle, double css_max) {
1785-
emcStatus->motion.spindle[spindle].css_maximum = fabs(css_max);
1785+
canon.spindle[spindle].css_maximum = fabs(css_max);
17861786
}
17871787

17881788
void START_SPINDLE_CLOCKWISE(int s, int wait_for_atspeed)
17891789
{
17901790
EMC_SPINDLE_ON emc_spindle_on_msg;
17911791

17921792
flush_segments();
1793-
emcStatus->motion.spindle[s].direction = 1;
1793+
canon.spindle[s].dir = 1;
17941794
emc_spindle_on_msg.spindle = s;
1795-
if(emcStatus->motion.spindle[s].css_maximum) {
1795+
if(canon.spindle[s].css_maximum) {
17961796
if(canon.lengthUnits == CANON_UNITS_INCHES){
1797-
emcStatus->motion.spindle[s].css_factor = 12 / (2 * M_PI) * emcStatus->motion.spindle[s].speed * TO_EXT_LEN(25.4);
1797+
canon.spindle[s].css_factor = 12 / (2 * M_PI) * canon.spindle[s].speed * TO_EXT_LEN(25.4);
17981798
} else {
1799-
emcStatus->motion.spindle[s].css_factor = 1000 / (2 * M_PI) * emcStatus->motion.spindle[s].speed * TO_EXT_LEN(1);
1799+
canon.spindle[s].css_factor = 1000 / (2 * M_PI) * canon.spindle[s].speed * TO_EXT_LEN(1);
18001800
}
1801-
emc_spindle_on_msg.speed = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].css_maximum;
1802-
emc_spindle_on_msg.factor = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].css_factor;
1801+
emc_spindle_on_msg.speed = canon.spindle[s].dir * canon.spindle[s].css_maximum;
1802+
emc_spindle_on_msg.factor = canon.spindle[s].dir * canon.spindle[s].css_factor;
18031803
emc_spindle_on_msg.xoffset = TO_EXT_LEN(canon.g5xOffset.x + canon.g92Offset.x + canon.toolOffset.tran.x);
18041804
} else {
1805-
emc_spindle_on_msg.speed = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].speed;
1805+
emc_spindle_on_msg.speed = canon.spindle[s].dir * canon.spindle[s].speed;
18061806
// canon.css_numerator = 0; FIXME: Do we need this?
18071807
}
18081808
emc_spindle_on_msg.wait_for_spindle_at_speed = wait_for_atspeed;
@@ -1814,19 +1814,19 @@ void START_SPINDLE_COUNTERCLOCKWISE(int s, int wait_for_atspeed)
18141814
EMC_SPINDLE_ON emc_spindle_on_msg;
18151815

18161816
flush_segments();
1817-
emcStatus->motion.spindle[s].direction = -1;
1817+
canon.spindle[s].dir = -1;
18181818
emc_spindle_on_msg.spindle = s;
1819-
if(emcStatus->motion.spindle[s].css_maximum) {
1819+
if(canon.spindle[s].css_maximum) {
18201820
if(canon.lengthUnits == CANON_UNITS_INCHES){
1821-
emcStatus->motion.spindle[s].css_factor = 12 / (2 * M_PI) * emcStatus->motion.spindle[s].speed * TO_EXT_LEN(25.4);
1821+
canon.spindle[s].css_factor = 12 / (2 * M_PI) * canon.spindle[s].speed * TO_EXT_LEN(25.4);
18221822
} else {
1823-
emcStatus->motion.spindle[s].css_factor = 1000 / (2 * M_PI) * emcStatus->motion.spindle[s].speed * TO_EXT_LEN(1);
1823+
canon.spindle[s].css_factor = 1000 / (2 * M_PI) * canon.spindle[s].speed * TO_EXT_LEN(1);
18241824
}
1825-
emc_spindle_on_msg.speed = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].css_maximum;
1826-
emc_spindle_on_msg.factor = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].css_factor;
1825+
emc_spindle_on_msg.speed = canon.spindle[s].dir * canon.spindle[s].css_maximum;
1826+
emc_spindle_on_msg.factor = canon.spindle[s].dir * canon.spindle[s].css_factor;
18271827
emc_spindle_on_msg.xoffset = TO_EXT_LEN(canon.g5xOffset.x + canon.g92Offset.x + canon.toolOffset.tran.x);
18281828
} else {
1829-
emc_spindle_on_msg.speed = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].speed;
1829+
emc_spindle_on_msg.speed = canon.spindle[s].dir * canon.spindle[s].speed;
18301830
// canon.css_numerator = 0; FIXME: Do we need this?
18311831
}
18321832
emc_spindle_on_msg.wait_for_spindle_at_speed = wait_for_atspeed;
@@ -1836,24 +1836,27 @@ void START_SPINDLE_COUNTERCLOCKWISE(int s, int wait_for_atspeed)
18361836
void SET_SPINDLE_SPEED(int s, double r)
18371837
{
18381838
// speed is in RPMs everywhere
1839-
emcStatus->motion.spindle[s].speed = fabs(r); // interp will never send negative anyway ...
1839+
for (int i = 0; i < 3; i++) {printf("Before: spindle %i speed %f\n", i, canon.spindle[i].speed) ;}
1840+
canon.spindle[s].speed = fabs(r); // interp will never send negative anyway ...
1841+
for (int i = 0; i < 3; i++) {printf("After: spindle %i speed %f\n", i, canon.spindle[i].speed) ;}
18401842

18411843
EMC_SPINDLE_SPEED emc_spindle_speed_msg;
18421844

18431845
flush_segments();
18441846

18451847
emc_spindle_speed_msg.spindle = s;
1846-
if(emcStatus->motion.spindle[s].css_maximum) {
1848+
if(canon.spindle[s].css_maximum) {
1849+
printf("CSS MAximum is true\n");
18471850
if(canon.lengthUnits == CANON_UNITS_INCHES){
1848-
emcStatus->motion.spindle[s].css_factor = 12 / (2 * M_PI) * emcStatus->motion.spindle[s].speed * TO_EXT_LEN(25.4);
1851+
canon.spindle[s].css_factor = 12 / (2 * M_PI) * canon.spindle[s].speed * TO_EXT_LEN(25.4);
18491852
} else {
1850-
emcStatus->motion.spindle[s].css_factor = 1000 / (2 * M_PI) * emcStatus->motion.spindle[s].speed * TO_EXT_LEN(1);
1853+
canon.spindle[s].css_factor = 1000 / (2 * M_PI) * canon.spindle[s].speed * TO_EXT_LEN(1);
18511854
}
1852-
emc_spindle_speed_msg.speed = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].css_maximum;
1853-
emc_spindle_speed_msg.factor = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].css_factor;
1855+
emc_spindle_speed_msg.speed = canon.spindle[s].dir * canon.spindle[s].css_maximum;
1856+
emc_spindle_speed_msg.factor = canon.spindle[s].dir * canon.spindle[s].css_factor;
18541857
emc_spindle_speed_msg.xoffset = TO_EXT_LEN(canon.g5xOffset.x + canon.g92Offset.x + canon.toolOffset.tran.x);
18551858
} else {
1856-
emc_spindle_speed_msg.speed = emcStatus->motion.spindle[s].direction * emcStatus->motion.spindle[s].speed;
1859+
emc_spindle_speed_msg.speed = canon.spindle[s].dir * canon.spindle[s].speed;
18571860
// canon.css_numerator = 0; FIXME: Do we need this?
18581861
}
18591862
interp_list.append(emc_spindle_speed_msg);
@@ -1866,8 +1869,8 @@ void STOP_SPINDLE_TURNING(int s)
18661869
flush_segments();
18671870
emc_spindle_off_msg.spindle = s;
18681871
interp_list.append(emc_spindle_off_msg);
1869-
// Added by atp 6/1/18 not sure this is right. There is a problem that the _sesond_ S word starts the spindle without M3/M4
1870-
emcStatus->motion.spindle[s].direction = 0;
1872+
// Added by atp 6/1/18 not sure this is right. There is a problem that the _second_ S word starts the spindle without M3/M4
1873+
canon.spindle[s].dir = 0;
18711874
}
18721875

18731876
void SPINDLE_RETRACT()
@@ -1962,9 +1965,9 @@ void USE_TOOL_LENGTH_OFFSET(EmcPose offset)
19621965
set_offset_msg.offset.w = TO_EXT_LEN(canon.toolOffset.w);
19631966

19641967
for (int s = 0; s < emcStatus->motion.traj.spindles; s++){
1965-
if(emcStatus->motion.spindle[s].css_maximum) {
1966-
SET_SPINDLE_SPEED(s, emcStatus->motion.spindle[s].speed);
1967-
}
1968+
if(canon.spindle[s].css_maximum) {
1969+
SET_SPINDLE_SPEED(s, canon.spindle[s].speed);
1970+
}
19681971
}
19691972
interp_list.append(set_offset_msg);
19701973
}
@@ -2042,7 +2045,7 @@ void CHANGE_TOOL(int slot)
20422045
interp_list.append(linearMoveMsg);
20432046

20442047
if(old_feed_mode)
2045-
START_SPEED_FEED_SYNCH(canon.spindle, canon.linearFeedRate, 1);
2048+
START_SPEED_FEED_SYNCH(canon.spindle_num, canon.linearFeedRate, 1);
20462049

20472050
canonUpdateEndPoint(x, y, z, a, b, c, u, v, w);
20482051
}
@@ -2462,7 +2465,6 @@ void INIT_CANON()
24622465
canon.xy_rotation = 0.0;
24632466
canon.rotary_unlock_for_traverse = -1;
24642467
canon.feed_mode = 0;
2465-
canon.synched = 0;
24662468
canon.g5xOffset.x = 0.0;
24672469
canon.g5xOffset.y = 0.0;
24682470
canon.g5xOffset.z = 0.0;
@@ -2485,8 +2487,10 @@ void INIT_CANON()
24852487
canonUpdateEndPoint(0, 0, 0, 0, 0, 0, 0, 0, 0);
24862488
SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0);
24872489
SET_NAIVECAM_TOLERANCE(0);
2488-
canon.spindleSpeed = 0.0;
2489-
// canon.preppedTool = 0;
2490+
for (int s = 0; s < EMCMOT_MAX_SPINDLES; s++) {
2491+
canon.spindle[s].speed = 0.0;
2492+
canon.spindle[s].synched = 0;
2493+
}
24902494
canon.optional_program_stop = ON; //set enabled by default (previous EMC behaviour)
24912495
canon.block_delete = ON; //set enabled by default (previous EMC behaviour)
24922496
canon.cartesian_move = 0;
@@ -2708,7 +2712,7 @@ int GET_EXTERNAL_FLOOD()
27082712
double GET_EXTERNAL_SPEED(int spindle)
27092713
{
27102714
// speed is in RPMs everywhere
2711-
return emcStatus->motion.spindle[spindle].speed;
2715+
return canon.spindle[spindle].speed;
27122716
}
27132717

27142718
CANON_DIRECTION GET_EXTERNAL_SPINDLE(int spindle)
@@ -3207,7 +3211,7 @@ int UNLOCK_ROTARY(int line_number, int joint_num) {
32073211
interp_list.append(m);
32083212
// no need to update endpoint
32093213
if(old_feed_mode)
3210-
START_SPEED_FEED_SYNCH(canon.spindle, canon.linearFeedRate, 1);
3214+
START_SPEED_FEED_SYNCH(canon.spindle_num, canon.linearFeedRate, 1);
32113215

32123216
// now, the next move is the real indexing move, so be ready
32133217
canon.rotary_unlock_for_traverse = joint_num;

0 commit comments

Comments
 (0)