G-codes/offsets/tools with .Net
Moderators: TomKerekes, dynomotion
Re: G-codes/offsets/tools with .Net
Thanks Tom.
That was far less painful than I thought it would be. I may have to actually learn the whole bit/byte bashing thing at some point, as it's something I have only a very vague recollection off covering many years ago.
Next step will be working out to implement the icons in a similar way to KMotionCNC, and return results.
My initial research tells me Abort, Retry, and Ignore are not available in WPF message boxes, along with the Modal options.
That was far less painful than I thought it would be. I may have to actually learn the whole bit/byte bashing thing at some point, as it's something I have only a very vague recollection off covering many years ago.
Next step will be working out to implement the icons in a similar way to KMotionCNC, and return results.
My initial research tells me Abort, Retry, and Ignore are not available in WPF message boxes, along with the Modal options.
Re: G-codes/offsets/tools with .Net
Tom, that conversion works well, however it seems to produce a string I can't add anything to, and I'm not even sure how to diagnose the problem.
What I'm trying to do, is for the button options no longer supported, is add extra lines to the messagebox text, advising the options no longer work, and that the buttons are mapped accordingly.
At the moment I have MB_ABORTRETRYIGNORE mapped to generate a MessageBoxButton.YesNoCancel
And I want to add to the message "MB_ABORTRETRYIGNORE not available. Yes = RETRY, No = ABORT, Cancel = IGNORE".
However, although I can add text to the string read from the KFlop, it doesn't show in the message box.
Some testing with outputting code to my debug text box, results in the text showing in the text box, however if you try copying and pasting the text from the text box, it doesn't paste the additional text (I only realised this after trying to paste the text into Notepad++ to check for any hidden characters).
I've stripped back my code to the basics to try and understand this-
Using the same KFlop C code as my previous post, to just generate a basic messagebox with just an OK button, I get this in my debug text output-
However although I can select the text, and copy it, whatever I paste it into, only pastes the TK Rocks!!! part. I've even tried generating more lines in my textbox, and removing the !!! but any text after the string read from the KFlop, doesn't get pasted. I suspect whatever is causing this, is also causing the lack of text to be added to the message box.
To me it's like there is some kind of magic charachter being added to the KFlop string that blocks all text after it, and I'm not even sure what to google for to even start looking for a solution
Any ideas?
What I'm trying to do, is for the button options no longer supported, is add extra lines to the messagebox text, advising the options no longer work, and that the buttons are mapped accordingly.
At the moment I have MB_ABORTRETRYIGNORE mapped to generate a MessageBoxButton.YesNoCancel
And I want to add to the message "MB_ABORTRETRYIGNORE not available. Yes = RETRY, No = ABORT, Cancel = IGNORE".
However, although I can add text to the string read from the KFlop, it doesn't show in the message box.
Some testing with outputting code to my debug text box, results in the text showing in the text box, however if you try copying and pasting the text from the text box, it doesn't paste the additional text (I only realised this after trying to paste the text into Notepad++ to check for any hidden characters).
I've stripped back my code to the basics to try and understand this-
Code: Select all
string s;
if (!GetStringFromGather(MS.PC_comm[1], out s, 50)) break;
messageDisplayed = true;
MS.PC_comm[0] = 0; // clear the command now that it has been executed
s += "more text";
TextBox_Debug.AppendText("\r\n" + s);
//MessageBoxResult result = DisplayMessageBox(s, MS.PC_comm[2]);
MessageBoxResult result = MessageBox.Show(s, "KMoCNCC");
messageDisplayed = false;
string st = string.Format("SetPersistDec%d %d", 103, result);
KM.WriteLine(st);
SetKFlopCommandResult(0);
To me it's like there is some kind of magic charachter being added to the KFlop string that blocks all text after it, and I'm not even sure what to google for to even start looking for a solution
Any ideas?
- TomKerekes
- Posts: 2676
- Joined: Mon Dec 04, 2017 1:49 am
Re: G-codes/offsets/tools with .Net
Hi Moray,
Oops I mistakenly added the zero terminator to the string. I'm not sure exactly how C# strings work internally but the null isn't needed it already is a terminated string. Change:
to
Oops I mistakenly added the zero terminator to the string. I'm not sure exactly how C# strings work internally but the null isn't needed it already is a terminated string. Change:
Code: Select all
msg += Convert.ToChar(val); // add to string
Code: Select all
if (val != 0) msg += Convert.ToChar(val); // if not the null terminator add to string
Regards,
Tom Kerekes
Dynomotion, Inc.
Tom Kerekes
Dynomotion, Inc.
Re: G-codes/offsets/tools with .Net
Thanks Tom, that has fixed the problem.
C# generally handles strings poorly.
I've got to admit I never knew what a zero terminator was, but having reminded myself how to watch variables in Visual Studio, the \0 is blatantly obvious.
C# generally handles strings poorly.
I've got to admit I never knew what a zero terminator was, but having reminded myself how to watch variables in Visual Studio, the \0 is blatantly obvious.
Re: G-codes/offsets/tools with .Net
Tom,
I'm nearly there with input boxes, but I can't seem to transfer the value back to the KFlop.
This is my test KFlop code-
which works as expected in KMotionCNC, however when I try it in my program, the correct response for how the dialog was closed is returned, but the KFlop always returns an entered value of 0.000 via the console.
This is my code that writes the value to the KFlop-
and this is what it prints to my debug screen, and is what should be getting written to the KFlop-
For reference, the corresponding code from KMotionCNC is-
Any idea why I can't get this to work?
I'm nearly there with input boxes, but I can't seem to transfer the value back to the KFlop.
This is my test KFlop code-
Code: Select all
#include "KMotionDef.h"
#define TMP 10 // which spare persist to use to transfer data
#include "KFLOPToKMotionCNCFunctions.c"
float inputResult;
void main()
{
//DoPCFloat(PC_COMM_SET_X,1);
printf("Running...\n");
int Answer = InputBox("Enter a number",&inputResult);
printf("Answer:%d\n",Answer);
if (Answer){
printf("Operator Canceled\n");
} else {
printf("Operator Entered Value of %.3f\n",inputResult);
}
}
This is my code that writes the value to the KFlop-
Code: Select all
st = "SetPersistHex102 " + DoubleToHex(fvalue,8);
TextBox_Debug.AppendText("\r\n" + st);
KM.WriteLine(st);
st = "SetPersistDec103 " + result;
TextBox_Debug.AppendText("\r\n" + st);
KM.WriteLine(st);
SetKFlopCommandResult(0);
I'm not sure if the hex conversion is correct (c# doesn't support converting double to hex, so I'm using something I found which I think is correct), but even if it was wrong, surely the KFlop should still display some kind of value?SetPersistHex102 C.1EB85
SetPersistDec103 0
For reference, the corresponding code from KMotionCNC is-
Code: Select all
//s.Format("SetPersistHex%d %x", PC_COMM_PERSIST + 2, *(int*)&fvalue);
//if (TheFrame->KMotionDLL->WriteLine(s)) break;
//s.Format("SetPersistDec%d %d", PC_COMM_PERSIST + 3, result);
//if (TheFrame->KMotionDLL->WriteLine(s)) break;
Re: G-codes/offsets/tools with .Net
I've just been trying this some more, and even if I hard code a value into Persist102, I still get zero, unless I hardcode a big value, such as FFFFFFFF, where I then get a NaN value.
I've even tried using SetPersistDec102, but it still the same.
What am I missing?
I've even tried using SetPersistDec102, but it still the same.
What am I missing?
- TomKerekes
- Posts: 2676
- Joined: Mon Dec 04, 2017 1:49 am
Re: G-codes/offsets/tools with .Net
Hi Moray,
InputBox is expecting a 32-bit float not a 64-bit double and persist variables are only 32 bits.
You should be able to use KM.SetUserDataFloat()
HTH
InputBox is expecting a 32-bit float not a 64-bit double and persist variables are only 32 bits.
You should be able to use KM.SetUserDataFloat()
HTH
Regards,
Tom Kerekes
Dynomotion, Inc.
Tom Kerekes
Dynomotion, Inc.
Re: G-codes/offsets/tools with .Net
Thanks Tom.
Why didn't I think of that far simpler method of transferring values?
Anyway, Input Boxes now work, and I've just ticked PC_COMM_MDI off the list, which I think means most of the more complicated PC_COMM commands have now been ticked off the list. At least the ones I need to implement -
Once I get the tool offset handling sorted, I might even get back to working on my touch probe routines
Why didn't I think of that far simpler method of transferring values?
Anyway, Input Boxes now work, and I've just ticked PC_COMM_MDI off the list, which I think means most of the more complicated PC_COMM commands have now been ticked off the list. At least the ones I need to implement -
Once I get the tool offset handling sorted, I might even get back to working on my touch probe routines
Re: G-codes/offsets/tools with .Net
Tom, a couple hopefully simple questions for you, in my attempt to replicate all the PC_COMM functionality.
What is the equivalent of tool_table_index (D number) in dotNet?
This is my code so far for PC_COMM_GET_MISC_SETTINGS, with the original KMotionCNC code commented out.
Also, not as important, but for the PC_COMM_GET/SET_VARS, am I correct in thinking this accesses the emc var file values?
KMotionCNC code line is-
And is there a dotNet equivalent?
If it does access the var file, I'm not too bothered about it, as I don't use that file. I only use a copy, as the interpreter needs it to exist, and I store all values in my own config file.
What is the equivalent of tool_table_index (D number) in dotNet?
This is my code so far for PC_COMM_GET_MISC_SETTINGS, with the original KMotionCNC code commented out.
Code: Select all
case PC_COMM_GET_MISC_SETTINGS: // Units, T, H, D indexes
{
//s.Format("SetPersistHex%d %x", MainStatus.PC_comm[1], Interpreter->p_setup->length_units);
KM.SetUserData(MS.PC_comm[1], (int)KM.CoordMotion.Interpreter.SetupParams.LengthUnits);
//if (TheFrame->KMotionDLL->WriteLine(s)) break;
//s.Format("SetPersistHex%d %x", MainStatus.PC_comm[1] + 1, Interpreter->p_setup->selected_tool_slot);
KM.SetUserData(MS.PC_comm[1] + 1, (int)KM.CoordMotion.Interpreter.SetupParams.SelectedToolSlot);
//if (TheFrame->KMotionDLL->WriteLine(s)) break;
//s.Format("SetPersistHex%d %x", MainStatus.PC_comm[1] + 2, Interpreter->p_setup->length_offset_index); // H number
KM.SetUserData(MS.PC_comm[1] + 2, (int)KM.CoordMotion.Interpreter.SetupParams.ToolLengthOffsetIndex);
//if (TheFrame->KMotionDLL->WriteLine(s)) break;
//s.Format("SetPersistHex%d %x", MainStatus.PC_comm[1] + 3, Interpreter->p_setup->tool_table_index); // D number
KM.SetUserData(MS.PC_comm[1]+3, KM.CoordMotion.Interpreter.SetupParams.????)
//if (TheFrame->KMotionDLL->WriteLine(s)) break;
SetKFlopCommandResult(0);
}
break;
Also, not as important, but for the PC_COMM_GET/SET_VARS, am I correct in thinking this accesses the emc var file values?
KMotionCNC code line is-
Code: Select all
double d = Interpreter->p_setup->parameters[MainStatus.PC_comm[1] + i];
If it does access the var file, I'm not too bothered about it, as I don't use that file. I only use a copy, as the interpreter needs it to exist, and I store all values in my own config file.
- TomKerekes
- Posts: 2676
- Joined: Mon Dec 04, 2017 1:49 am
Re: G-codes/offsets/tools with .Net
Hi Moray,
tool_table_index isn't currently exported to .NET. It would need to be added. I don't know of anyone who used it for anything. You might set it the same as H as they usually the same.
Similarly with Interpreter->p_setup->parameters[] it would need to be added. It isn't really accessing the file btw. The variables are read from the file on startup and then GCode or other code may change the variables and in that case they would be different from the file. On exit certain values have the option to be saved to the file.
tool_table_index isn't currently exported to .NET. It would need to be added. I don't know of anyone who used it for anything. You might set it the same as H as they usually the same.
Similarly with Interpreter->p_setup->parameters[] it would need to be added. It isn't really accessing the file btw. The variables are read from the file on startup and then GCode or other code may change the variables and in that case they would be different from the file. On exit certain values have the option to be saved to the file.
Regards,
Tom Kerekes
Dynomotion, Inc.
Tom Kerekes
Dynomotion, Inc.