synthetos / g2

g2core - The Next Generation
Other
625 stars 296 forks source link

incorrect input pin state after glitch #470

Open lllars opened 4 years ago

lllars commented 4 years ago

I found a bug in the input pin debounce / lockout code. If an input pin changes, and then changes back before the lockout time has expired, then it's state is never updated to reflect that it changed back.

As an example, on my machine, I have hall effect limit switches which are normally high. I first power up g2core by connecting it to my PC. Then, when I power on the machine, the switch state very briefly goes low, only for a few ms, and then returns to high. g2core correctly detects that that the switches go low, but then never updates that they have gone back to high: $in continues to display the incorrect state. Because of this g2core then fails to detect the next time the switches go low, but it does then update to the correct state when the switch goes back to high. This bug causes my machine to crash when homing.

I've worked around this issue by changing pin_changed() in gpio.cpp. I moved the code to record the pin state change up, so that the state change is recorded even if the pin is locked out. The lockout check is still there and prevents any actions from occurring during lockout even though the state has changed.

I am on firmware version 0.99, build 101.3. Target board is an Arduino Due with no shield. This is a 3 axis mill with independent stepper drivers.

Here is my re-ordering of the relevant section of gpio.cpp:

    void pin_changed() {
        if (D_IN_CHANNELS < ext_pin_number) { return; }

        d_in_t *in = &d_in[ext_pin_number-1];

        // return if input is disabled (not supposed to happen)
        if (in->mode == IO_MODE_DISABLED) {
            in->state = INPUT_DISABLED;
            return;
        }

    // return if no change in state
        bool pin_value = (bool)input_pin;
        int8_t pin_value_corrected = (pin_value ^ ((int)in->mode ^ 1));    // correct for NO or NC mode
        if (in->state == (ioState)pin_value_corrected) {
            return;
        }

    // record the changed state (we know it changed or we would have exited beforehand)
        in->state = (ioState)pin_value_corrected;
        if (pin_value_corrected == INPUT_ACTIVE) {
            in->edge = INPUT_EDGE_LEADING;
        } else {
            in->edge = INPUT_EDGE_TRAILING;
        }

        // return if the input is in lockout period (take no action)
        if (in->lockout_timer.isSet() && !in->lockout_timer.isPast()) {
            return;
        }

        // lockout the pin for lockout_ms
        in->lockout_timer.set(in->lockout_ms);

        // perform homing operations if in homing mode
        ...
justinclift commented 4 years ago

Interesting. The latest development code (in the edge-preview branch) has some substantial changes in parts. Not sure if any of the gpio code was touched though. It might be worth seeing if that has the same problem or not. :smile:

@giseburt Thoughts?

giseburt commented 4 years ago

Indeed, Justin, that was one reason for the refactor. That problem should be resolved in the edge-preview branch, along with other substantial improvements in GPIO.

justinclift commented 4 years ago

Awesome. :smile:

@lllars Any interest in compiling in the edge-preview branch, and seeing how that goes? It should work fine with the Arduino Due. :smile:

mhlong10 commented 4 years ago

I hate to say I ran into this same problem a few months ago but didn't bother to address it. I simply manually touched the touch plate to the z-probe if I saw that it was out of sync (which got it back in sync) and then probed again.

Looking at the change my concerns are that in->state is actually bouncing around following the actual state of the pin. gpio_read_input() and io_get_input() asynchronously read in->state and thus could get a "random" value depending on when called. I think this is probably benign for io_get_input, and it looks like gpio_read_input is only called when the machine is in a static state. So for current uses this change could be okay. However, the probing, homing, and subsequent actions will still miss reacting to very short pin transitions and fail to take appropriate action. This is probably no worse that what is happening today.

I do like the simplicity of the fix. I had a more elaborate / complete fix in mind but didn't get to it.

The plan I had was to start a retriggerable asynchronous timer for lockout_timer period of time whenever the pin state changes and once it expires call pin_changed() again to get the final resting state. This has the affect of stretching a pin transition for at least lockout_timer period of time, thus locking out other changes during that time. I've used this technique many times to debounce gpio pins on other projects. Unfortunately I'm not aware of any interrupt driven timer within the code so this wasn't straightforward to implement and I had to move on to my real but less fun job.

lllars commented 4 years ago

I'm happy to test out edge-preview. Is there a summary anywhere of what changes it incorporates?

@mhlong10 I was also thinking that checking the state of the pin after the lockout_timer expired would be a good solution. I just couldn't figure out an easy way to do that.

lllars commented 4 years ago

I'm getting a lot of errors when trying to compile edge-preview. I'll post the output I'm seeing. Let me know if there's anything I can try on my end to fix things. I'm compiling with:

make PLATFORM=DUE BOARD=gShield SETTINGS_FILE="settings_dynamyte_4000.h"

and the output is:

"Found that we're in Linux"
Compiling c ../Motate/MotateProject/motate/cmsis/TARGET_Atmel/sam3x/source/templates/exceptions.c
    -> build/gShield/motate/cmsis/TARGET_Atmel/sam3x/source/templates/exceptions.o 
Compiling c ../Motate/MotateProject/motate/cmsis/TARGET_Atmel/sam3x/source/templates/system_sam3x.c
    -> build/gShield/motate/cmsis/TARGET_Atmel/sam3x/source/templates/system_sam3x.o 
Compiling c ../Motate/MotateProject/motate/cmsis/TARGET_Atmel/sam3x/source/templates/gcc/startup_sam3x.c
    -> build/gShield/motate/cmsis/TARGET_Atmel/sam3x/source/templates/gcc/startup_sam3x.o 
Compiling c ../Motate/MotateProject/motate/platform/atmel_sam/cortex_handlers.c
    -> build/gShield/motate/platform/atmel_sam/cortex_handlers.o 
Compiling c ../Motate/MotateProject/motate/platform/atmel_sam/hooks.c
    -> build/gShield/motate/platform/atmel_sam/hooks.o 
Compiling cpp ../Motate/MotateProject/motate/MotateUtilities.cpp
    -> build/gShield/motate/MotateUtilities.o 
Compiling cpp ../Motate/MotateProject/motate/main.cpp
    -> build/gShield/motate/main.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamDMA.cpp
    -> build/gShield/motate/Atmel_sam_common/SamDMA.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamPins.cpp
    -> build/gShield/motate/Atmel_sam_common/SamPins.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamPower.cpp
    -> build/gShield/motate/Atmel_sam_common/SamPower.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamServiceCall.cpp
    -> build/gShield/motate/Atmel_sam_common/SamServiceCall.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamSPI.cpp
    -> build/gShield/motate/Atmel_sam_common/SamSPI.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamTimers.cpp
    -> build/gShield/motate/Atmel_sam_common/SamTimers.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamUART.cpp
    -> build/gShield/motate/Atmel_sam_common/SamUART.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam_common/SamUniqueID.cpp
    -> build/gShield/motate/Atmel_sam_common/SamUniqueID.o 
Compiling cpp ../Motate/MotateProject/motate/Atmel_sam3x/SamUSB.cpp
    -> build/gShield/motate/Atmel_sam3x/SamUSB.o 
Compiling cpp ../Motate/MotateProject/motate/platform/atmel_sam/syscalls.cpp
    -> build/gShield/motate/platform/atmel_sam/syscalls.o 
Compiling cpp ./alarm.cpp
    -> build/gShield/./alarm.o 
In file included from ./g2core.h:62:0,
                 from ./alarm.cpp:29:
./board/ArduinoDue/hardware.h:47:5: warning: "HAS_HOBBY_SERVO_MOTOR" is not defined [-Wundef]
 #if HAS_HOBBY_SERVO_MOTOR
     ^
In file included from ./board/ArduinoDue/hardware.h:32:0,
                 from ./g2core.h:62,
                 from ./alarm.cpp:29:
./config.h:341:38: error: declaration of 'operator[]' as non-function
     const cfgItem_t& operator[](std::size_t idx) const;
                                      ^
./config.h:341:31: error: expected ';' at end of member declaration
     const cfgItem_t& operator[](std::size_t idx) const;
                               ^
./config.h:341:45: error: expected ')' before 'idx'
     const cfgItem_t& operator[](std::size_t idx) const;
                                             ^
./config.h:349:46: error: 'get' declared as a 'virtual' field
     virtual const cfgItem_t * const get(std::size_t idx) const;
                                              ^
./config.h:349:37: error: expected ';' at end of member declaration
     virtual const cfgItem_t * const get(std::size_t idx) const;
                                     ^
./config.h:349:53: error: expected ')' before 'idx'
     virtual const cfgItem_t * const get(std::size_t idx) const;
                                                     ^
./config.h: In constructor 'constexpr configSubtable::configSubtable(size_t)':
./config.h:352:15: error: uninitialized const member in 'const struct cfgItem_t* const' [-fpermissive]
     constexpr configSubtable(const size_t l) : length{l} {};
               ^
./config.h:349:46: note: 'const cfgItem_t* const configSubtable::get' should be initialized
     virtual const cfgItem_t * const get(std::size_t idx) const;
                                              ^
./config.h:352:59: error: member 'configSubtable::get' must be initialized by mem-initializer in 'constexpr' constructor
     constexpr configSubtable(const size_t l) : length{l} {};
                                                           ^
./config.h:349:46: note: declared here
     virtual const cfgItem_t * const get(std::size_t idx) const;
                                              ^
./config.h: At global scope:
./config.h:367:29: error: expected ';' at end of member declaration
     const cfgItem_t * const get(std::size_t idx) const override {
                             ^
./config.h:367:45: error: expected ')' before 'idx'
     const cfgItem_t * const get(std::size_t idx) const override {
                                             ^
./config.h: In constructor 'constexpr cfgSubtableFromStaticArray::cfgSubtableFromStaticArray()':
./config.h:365:15: error: uninitialized const member in 'const struct cfgItem_t* const' [-fpermissive]
     constexpr cfgSubtableFromStaticArray() : configSubtable{0}, items{} {};
               ^
./config.h:367:38: note: 'const cfgItem_t* const cfgSubtableFromStaticArray::get' should be initialized
     const cfgItem_t * const get(std::size_t idx) const override {
                                      ^
./config.h:365:74: error: member 'cfgSubtableFromStaticArray::get' must be initialized by mem-initializer in 'constexpr' constructor
     constexpr cfgSubtableFromStaticArray() : configSubtable{0}, items{} {};
                                                                          ^
./config.h:367:38: note: declared here
     const cfgItem_t * const get(std::size_t idx) const override {
                                      ^
./config.h: In member function 'virtual index_t cfgSubtableFromStaticArray::find(const char*) const':
./config.h:372:9: error: 'size_t' is not a member of 'std'
         std::size_t idx = 0;
         ^
./config.h:372:9: note: suggested alternative:
In file included from /home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/sys/cdefs.h:45:0,
                 from /home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/ctype.h:5,
                 from ./g2core.h:29,
                 from ./alarm.cpp:29:
/home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include/stddef.h:216:23: note:   'size_t'
 typedef __SIZE_TYPE__ size_t;
                       ^
In file included from ./board/ArduinoDue/hardware.h:32:0,
                 from ./g2core.h:62,
                 from ./alarm.cpp:29:
./config.h:374:16: error: 'idx' was not declared in this scope
         while (idx < length) {
                ^
In file included from ./safety_manager.h:35:0,
                 from ./alarm.cpp:33:
./planner.h: At global scope:
./planner.h:568:24: error: expected initializer before 'HOT_DATA'
 extern mpPlanner_t *mp HOT_DATA;                 // currently active planner (global variable)
                        ^
./planner.h:569:24: error: expected initializer before 'HOT_DATA'
 extern mpPlanner_t mp1 HOT_DATA;                 // primary planning context
                        ^
./planner.h:570:24: error: expected initializer before 'HOT_DATA'
 extern mpPlanner_t mp2 HOT_DATA;                 // secondary planning context
                        ^
./planner.h:572:31: error: expected initializer before 'HOT_DATA'
 extern mpPlannerRuntime_t *mr HOT_DATA;          // context for block runtime
                               ^
./planner.h:573:31: error: expected initializer before 'HOT_DATA'
 extern mpPlannerRuntime_t mr1 HOT_DATA;          // primary planner runtime context
                               ^
./planner.h:574:31: error: expected initializer before 'HOT_DATA'
 extern mpPlannerRuntime_t mr2 HOT_DATA;          // secondary planner runtime context
                               ^
./planner.h:576:46: error: expected initializer before 'HOT_DATA'
 extern mpBuf_t mp1_queue[PLANNER_QUEUE_SIZE] HOT_DATA;   // storage allocation for primary planner queue buffers
                                              ^
./planner.h:594:56: error: expected initializer before 'HOT_FUNC'
 stat_t mp_set_target_steps(const float target_steps[]) HOT_FUNC;
                                                        ^
./planner.h:595:162: error: expected initializer before 'HOT_FUNC'
 t_t mp_set_target_steps(const float target_steps[MOTORS], const float start_velocities[MOTORS], const float end_velocities[MOTORS], const float segment_time) HOT_FUNC;
                                                                                                                                                               ^
./planner.h:634:38: error: expected initializer before 'HOT_FUNC'
 mpBuf_t * mp_get_write_buffer(void)  HOT_FUNC;
                                      ^
./planner.h:635:58: error: expected initializer before 'HOT_FUNC'
 void mp_commit_write_buffer(const blockType block_type)  HOT_FUNC;
                                                          ^
./planner.h:636:36: error: expected initializer before 'HOT_FUNC'
 mpBuf_t * mp_get_run_buffer(void)  HOT_FUNC;
                                    ^
./planner.h:637:32: error: expected initializer before 'HOT_FUNC'
 bool mp_free_run_buffer(void)  HOT_FUNC;
                                ^
In file included from ./safety_manager.h:36:0,
                 from ./alarm.cpp:33:
./gpio.h: In member function 'float ValueHistory<sample_count>::get_std_dev()':
./gpio.h:1100:16: error: 'sqrt' is not a member of 'std'
         return std::sqrt(std::abs(variance));
                ^
./gpio.h:1100:16: note: suggested alternative:
In file included from ./g2core.h:35:0,
                 from ./alarm.cpp:29:
/home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/math.h:135:15: note:   'sqrt'
 extern double sqrt _PARAMS((double));
               ^
In file included from ./safety_manager.h:36:0,
                 from ./alarm.cpp:33:
./gpio.h:1100:43: error: call of overloaded 'abs(float&)' is ambiguous
         return std::sqrt(std::abs(variance));
                                           ^
In file included from /home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/ctype.h:4:0,
                 from ./g2core.h:29,
                 from ./alarm.cpp:29:
/home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/stdlib.h:66:5: note: candidate: int abs(int)
 int _EXFUN(abs,(int));
     ^
In file included from /home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/c++/5.4.1/bits/stl_algo.h:59:0,
                 from /home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/c++/5.4.1/algorithm:62,
                 from ../Motate/MotateProject/motate/MotatePins.h:34,
                 from ./board/ArduinoDue/hardware.h:76,
                 from ./g2core.h:62,
                 from ./alarm.cpp:29:
/home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/c++/5.4.1/cstdlib:166:3: note: candidate: long int std::abs(long int)
   abs(long __i) { return __builtin_labs(__i); }
   ^
/home/lars/dynamyte/g2/Motate/Tools/linux/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include/c++/5.4.1/cstdlib:174:3: note: candidate: long long int std::abs(long long int)
   abs(long long __x) { return __builtin_llabs (__x); }
   ^
make: *** [../Motate/MotateProject/motate/Motate.mk:471: build/gShield/./alarm.o] Error 1
justinclift commented 4 years ago

It's probably caused by something in the settings_dynamyte_4000.h file. :angel:

When I hit stuff like that, I generally first try to find a settings file that compiles ok or start with the default one (settings_default.h, used as a fallback when no other settings file is specified).

So, try without giving any settings file on the command line, and see if that compiles successfully:

$ make PLATFORM=DUE BOARD=gShield 

That should compile ok, and use the above mentioned default settings. :smile:

If it does so, and the settings_dynamyte_4000.h file has the right pieces you actually want... the next step is figuring out what's wrong in the dynamyte settings file. I'd do that by making it just a direct copy of the default settings one, and then making a few changes to it at a time to figure out what breaks. It shouldn't take more than a few compile attempts to determine the culprit.

In theory. :smile:

lllars commented 4 years ago

Thanks, good suggestion, but it didn't work. Output was identical.

$ make PLATFORM=DUE BOARD=gShield SETTINGS_FILE="settings_dynamyte_4000.h" clean
"Found that we're in Linux"
rm -fR build/gShield
rm -fR bin/gShield
rm -fR gShield.elf gShield.map gShield.hex gShield.bin
rm -fR compile_commands.json ../Motate/MotateProject/motate/compile_commands.json
$ make PLATFORM=DUE BOARD=gShield
justinclift commented 4 years ago

Yep, you're right. Just tried it here, and same error.

@giseburt Looks like edge-preview has become busted. Something about HAS_HOBBY_SERVO_MOTOR maybe?

giseburt commented 4 years ago

Checking the build now.

Also re:

Unfortunately I'm not aware of any interrupt driven timer within the code so this wasn't straightforward to implement and I had to move on to my real but less fun job.

The homing and probing are all interrupt driven now. The debounce code was causing so much trouble because sometimes a probe would only briefly fire a pulse and the subset backoff would be fast enough that the next time we checked it wasn't triggered anymore.

See here for the handler: https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L132-L147 https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L132-L147 Here for the setup (registration for interrupt events): https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L361-L362 https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L361-L362 And here for the teardown (reregistration): https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L295-L296 https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L295-L296

The interrupt handling itself is in Motate, but in g2core it comes in here: https://github.com/synthetos/g2/blob/1e2d02c460e5f188f204edd455246c78eaf3e09e/g2core/gpio.h#L486-L525 https://github.com/synthetos/g2/blob/1e2d02c460e5f188f204edd455246c78eaf3e09e/g2core/gpio.h#L486-L525

There is a lockout timer, so multiple interrupts are not fired for the same pin in a brief period. Note that we're not glitch filtering, but instead ignoring anything after the initial event for a brief amount of time, trusting that the initial event was genuine.

If there are noise spikes on the lines causing glitches then you'll need to filter it in hardware. Luckily this is fairly simple.

-Rob

On Jun 21, 2020, at 5:47 PM, Justin Clift notifications@github.com wrote:

Yep, you're right. Just tried it here, and same error.

@giseburt https://github.com/giseburt Looks like edge-preview has become busted. Something about HAS_HOBBY_SERVO_MOTOR maybe?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/synthetos/g2/issues/470#issuecomment-647191398, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAC6HUPPOANVP7WSQMAFGFLRX2EW3ANCNFSM4OB4UY2A.

giseburt commented 4 years ago

Ok, that should be fixed in the latest commit.

I tested with compiling for: make CONFIG=MiniMillgShield

Which is defined here: https://github.com/synthetos/g2/blob/404106b75e95a3a12c981d2e1ff42ad626c3e015/g2core/boards.mk#L75-L81 https://github.com/synthetos/g2/blob/404106b75e95a3a12c981d2e1ff42ad626c3e015/g2core/boards.mk#L75-L81

-Rob

On Jun 21, 2020, at 6:33 PM, Rob giseburt@gmail.com wrote:

Checking the build now.

Also re:

Unfortunately I'm not aware of any interrupt driven timer within the code so this wasn't straightforward to implement and I had to move on to my real but less fun job.

The homing and probing are all interrupt driven now. The debounce code was causing so much trouble because sometimes a probe would only briefly fire a pulse and the subset backoff would be fast enough that the next time we checked it wasn't triggered anymore.

See here for the handler: https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L132-L147 https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L132-L147 Here for the setup (registration for interrupt events): https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L361-L362 https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L361-L362 And here for the teardown (reregistration): https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L295-L296 https://github.com/synthetos/g2/blob/d6ae0db69db2e5e6f02294a599f1318dd967817a/g2core/cycle_probing.cpp#L295-L296

The interrupt handling itself is in Motate, but in g2core it comes in here: https://github.com/synthetos/g2/blob/1e2d02c460e5f188f204edd455246c78eaf3e09e/g2core/gpio.h#L486-L525 https://github.com/synthetos/g2/blob/1e2d02c460e5f188f204edd455246c78eaf3e09e/g2core/gpio.h#L486-L525

There is a lockout timer, so multiple interrupts are not fired for the same pin in a brief period. Note that we're not glitch filtering, but instead ignoring anything after the initial event for a brief amount of time, trusting that the initial event was genuine.

If there are noise spikes on the lines causing glitches then you'll need to filter it in hardware. Luckily this is fairly simple.

-Rob

On Jun 21, 2020, at 5:47 PM, Justin Clift <notifications@github.com mailto:notifications@github.com> wrote:

Yep, you're right. Just tried it here, and same error.

@giseburt https://github.com/giseburt Looks like edge-preview has become busted. Something about HAS_HOBBY_SERVO_MOTOR maybe?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/synthetos/g2/issues/470#issuecomment-647191398, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAC6HUPPOANVP7WSQMAFGFLRX2EW3ANCNFSM4OB4UY2A.

lllars commented 4 years ago

I still have many many errors, even trying the same "make CONFIG=MiniMillgShield" line.

The bit about HAS_HOBBY_SERVO_MOTOR is resolved, but I'm still seeing all the config.h, planner.h, and gpio.h errors.

lllars commented 4 years ago

Adding #include <iostream> fixes config.h, and #include <cmath> fixes gpio.h

I'm still stumped on the planner.h errors though.

justinclift commented 4 years ago

Just tried now, and for me it worked.

@lllars Did you run a git clean -dffx in the root of the repository directory, to get rid of any files from previous compile attempts?

eg:

$ git clean -dffx
$ git pull
$ git submodule update
$ make CONFIG=MiniMillgShield
...
Linking bin/MiniMillgShield-gShield/g2core.elf 
Using linker script: ../Motate/MotateProject/motate/cmsis/TARGET_Atmel/linker_scripts/sam3x/sam3x8/gcc/flash.ld 
--- SIZE INFO ---
   text    data     bss     dec     hex filename
 205556       0   27900  233456   38ff0 bin/MiniMillgShield-gShield/g2core.elf
Making binary bin/MiniMillgShield-gShield/g2core.bin 
Exporting symbols bin/MiniMillgShield-gShield/g2core.elf.txt 
Build 101.03 101.03-533-g490e
lllars commented 4 years ago

@justinclift Thanks, that worked.

Note that I did still run into a couple errors involving settings_default.h when I compiled with BOARD=gShield instead of CONFIG=MiniMillgShield. SPINDLE_ACTIVE_HIGH was undeclared and I need to define SPINDLE_SPEED_CHANGE_PER_MS

It's probably too late for today, but I will try this out on my machine tomorrow.

lllars commented 4 years ago

I've now tried out edge-preview on my machine and am happy to report that the input pin state remains correct following a glitch. I was able to home the machine without problems.

justinclift commented 4 years ago

Whoo Hooo!

Sounds like good progress. :smile:

willmackey2nd commented 3 years ago

Current HEAD didn't compile with gShield. Not with default settings nor MiniMillgShield. Took commit https://github.com/synthetos/g2/commit/490eb6cc9a7c55a44b078a564f1126912a56d9fe based on dates in this discussion and it did compile with MiniMill.

Modified default settings with my machines parameters and taking missing stuff from MiniMill until it compiled.

Tested probing with CNCjs + kreso autolevel. Single probing worked fine. Autolevel on the other hand crashes in different ways after 1 or 3 probes. Sometimes it just hangs with feeder> (AL: probing point 19) {"sr":{"vel":0,"posz":-1,"mpoz":-1.065}} in console. Sometimes it crashes Z against bed and continues to push down few seconds, misses some probing point commands during this then continues from some point suddenly. I also get some {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} messages.

Using DUE.

willmackey2nd commented 3 years ago

Linking some comments about the issue and recent changes here to help anyone googling themselves here. https://github.com/synthetos/g2/issues/237#issuecomment-711033764 https://github.com/synthetos/g2/issues/237#issuecomment-711060708

willmackey2nd commented 3 years ago

Did some digging but the source as a whole just looks too complicated to get a quick understanding what happens and where. I was planning to fix this by making sure input state is updated after lockout but no idea where I should be polling that / where's the callback or...

This is a real bummer. I switched from a crappy Chinese controller to G2 in hope of getting auto leveling for PCB milling and kinda took it for granted that stuff like this surely works in G2 and thought a lot of people are using if for this. Reading that this isn't fixable with simple HW filtering, I guess my quick options are to go with GRBL or buy PlanetCNC controller + SW.

giseburt commented 3 years ago

I am using probing heavily as I use it at least once for every job. Bantam tools and ShopBot are also using it regularly, as they're the ones that collectively found most of the bugs I've mentioned recently.

The only part of that that I don't use and can't say works well is CNCjs with an auto -leveling extension. I know we've tested CNCjs and there are people that use it with g2, but in this exact case I can't say how well it works or if the problem exists somewhere in how it's communicating with g2.

If you have a log file or something with a few notes about what's happening at what points along the log we can maybe help sort it out.

justinclift commented 3 years ago

@willmackey2nd That kreso autolevel extension for CNCjs looks nifty. If we can get it working decently well with g2, that'd be useful. :smile:

willmackey2nd commented 3 years ago

@justinclift yeah it's simple and works and also only alternative for me for now AFAIK. I don't know any better alternatives to use with G2 besides CNCjs. Feel free to slap me in face and point me to a better gcode feeder.

@giseburt Kreso AL works so that it sends the whole measurement task at once to CNCjs which then starts to execute the gcode. AL then just waits for probe status data, taking notes. Just means that AL itself shouldn't have anything todo with the motion control during probing.

Single probing commands haven't failed once for me but grid probing with AL seems unreliable. I've done now ~30 tests and

I don't know if this helps in any way but here's the whole console capture from AL cycle, probing 40x40 area with 7.5mm between probes. This was the kind of fail where it actually told something in console. Somewhere in the middle it crashed Z, continued pushing down and then suddenly proceeded skipping several probe points. @giseburt I'm happy to dig more info or test other stuff if you want / if it helps you. I did give up for now and ordered MK3Eco as I need to get some stuff done for Christmas but I'd probably have use for g2 anyway later and also I hate giving up / am poor loser.

CNCjs Console log

``` {"r":{},"f":[1,0,24]} feeder> (AL: probing point 7) feeder> G90 G0 X0.250 Y8.405 Z1 {"qr":46} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,14]} feeder> G0 Z1 feeder> (AL: probing point 8) {"qr":45} feeder> G90 G0 X8.100 Y8.405 Z1 {"sr":{"stat":5,"vel":640.26,"momo":0,"posz":0.90518,"mpoz":-9.81504}} {"qr":46} feeder> G38.2 Z-1 F50 {"sr":{"vel":1896.35,"posx":1.04479,"posz":1,"mpox":1.04479,"mpoz":-9.72023}} {"sr":{"vel":2990.2,"posx":5.90479,"mpox":5.90479}} {"qr":47} feeder> G0 Z1 {"sr":{"vel":0.17,"posx":8.10001,"mpox":8.10001}} {"qr":48} feeder> (AL: probing point 9) {"qr":46} feeder> G90 G0 X15.950 Y8.405 Z1 {"sr":{"stat":7,"vel":50,"feed":50,"momo":1,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"vel":49.2,"posz":0.06837,"mpoz":-10.65186}} {"qr":47} feeder> G38.2 Z-1 F50 {"qr":46} feeder> G0 Z1 {"sr":{"vel":0.93,"posz":0.0666,"mpoz":-10.65363}} {"qr":47} feeder> (AL: probing point 10) {"qr":48} feeder> G90 G0 X23.801 Y8.405 Z1 {"prb":{"e":1,"x":8.10000,"y":0.25000,"z":-10.64523,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} feeder> G38.2 Z-1 F50 feeder> G0 Z1 {"qr":46} feeder> (AL: probing point 11) {"r":{},"f":[1,0,22]} feeder> G90 G0 X31.651 Y8.405 Z1 feeder> G38.2 Z-1 F50 {"qr":47} feeder> G0 Z1 {"r":{},"f":[1,0,25]} feeder> (AL: probing point 12) feeder> G90 G0 X39.501 Y8.405 Z1 {"qr":46} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,14]} feeder> G0 Z1 feeder> (AL: probing point 13) {"qr":45} feeder> G90 G0 X0.250 Y16.560 Z1 {"sr":{"stat":5,"vel":175.74,"momo":0,"posz":0.98864,"mpoz":-9.73159}} {"qr":46} feeder> G38.2 Z-1 F50 {"sr":{"vel":2630.28,"posx":9.5356,"posz":1,"mpox":9.62588,"mpoz":-9.72023}} {"sr":{"vel":2743.24,"posx":14.51441,"mpox":14.60281}} {"qr":47} feeder> G0 Z1 {"qr":48} feeder> (AL: probing point 14) {"qr":46} feeder> G90 G0 X8.100 Y16.560 Z1 {"sr":{"stat":7,"vel":0,"momo":1,"posx":15.95,"posz":-1,"mpox":15.95,"mpoz":-11.72023}} {"sr":{"vel":50,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65274}} {"qr":47} feeder> G38.2 Z-1 F50 {"sr":{"vel":0,"posz":0.0425,"mpoz":-10.67773}} {"qr":46} feeder> G0 Z1 {"qr":47} feeder> (AL: probing point 15) {"qr":48} feeder> G90 G0 X15.950 Y16.560 Z1 {"prb":{"e":1,"x":15.95000,"y":0.25000,"z":-10.67773,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} feeder> G38.2 Z-1 F50 feeder> G0 Z1 {"qr":46} feeder> (AL: probing point 16) {"r":{},"f":[1,0,22]} feeder> G90 G0 X23.801 Y16.560 Z1 feeder> G38.2 Z-1 F50 {"qr":47} feeder> G0 Z1 {"r":{},"f":[1,0,25]} feeder> (AL: probing point 17) feeder> G90 G0 X31.651 Y16.560 Z1 {"qr":46} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,14]} feeder> G0 Z1 feeder> (AL: probing point 18) {"qr":45} feeder> G90 G0 X39.501 Y16.560 Z1 {"sr":{"stat":5,"vel":208.85,"momo":0,"posz":0.98473,"mpoz":-9.73549}} {"qr":46} feeder> G38.2 Z-1 F50 {"sr":{"vel":2565.89,"posx":17.2972,"posz":1,"mpox":17.3856,"mpoz":-9.72023}} {"sr":{"vel":2791.56,"posx":22.27513,"mpox":22.36541}} {"qr":47} feeder> G0 Z1 {"qr":48} feeder> (AL: probing point 19) {"qr":46} feeder> G90 G0 X0.250 Y24.715 Z1 {"sr":{"stat":7,"vel":0,"momo":1,"posx":23.801,"posz":-1,"mpox":23.801,"mpoz":-11.72023}} {"sr":{"vel":50,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65274}} {"qr":47} feeder> G38.2 Z-1 F50 {"sr":{"vel":0,"posz":0.05,"mpoz":-10.67023}} {"qr":46} feeder> G0 Z1 {"qr":47} feeder> (AL: probing point 20) {"qr":48} feeder> G90 G0 X8.100 Y24.715 Z1 {"prb":{"e":1,"x":23.80100,"y":0.25000,"z":-10.67023,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} feeder> G38.2 Z-1 F50 feeder> G0 Z1 {"qr":46} feeder> (AL: probing point 21) {"r":{},"f":[1,0,22]} feeder> G90 G0 X15.950 Y24.715 Z1 feeder> G38.2 Z-1 F50 {"qr":47} feeder> G0 Z1 {"r":{},"f":[1,0,25]} feeder> (AL: probing point 22) feeder> G90 G0 X23.801 Y24.715 Z1 {"qr":46} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,14]} feeder> G0 Z1 feeder> (AL: probing point 23) {"qr":45} feeder> G90 G0 X31.651 Y24.715 Z1 {"sr":{"stat":5,"vel":223.59,"momo":0,"posz":0.98833,"mpoz":-9.7319}} {"qr":46} feeder> G38.2 Z-1 F50 {"sr":{"vel":2565.89,"posx":25.1482,"posz":1,"mpox":25.1482,"mpoz":-9.72023}} {"sr":{"vel":2791.56,"posx":30.12513,"mpox":30.12513}} {"qr":47} feeder> G0 Z1 {"qr":46} feeder> (AL: probing point 24) {"sr":{"stat":7,"vel":49.2,"momo":1,"posx":31.65101,"posz":0.99399,"mpox":31.65101,"mpoz":-9.72623}} {"sr":{"vel":50,"posz":0.90901,"mpoz":-9.81288}} {"sr":{"posz":0.82402,"mpoz":-9.8962}} {"sr":{"posz":0.73904,"mpoz":-9.98285}} {"sr":{"posz":0.65405,"mpoz":-10.06617}} {"sr":{"posz":0.56907,"mpoz":-10.15283}} {"sr":{"posz":0.48408,"mpoz":-10.23614}} {"sr":{"posz":0.39743,"mpoz":-10.3228}} {"sr":{"posz":0.31411,"mpoz":-10.40611}} {"sr":{"posz":0.22913,"mpoz":-10.49277}} {"sr":{"posz":0.14414,"mpoz":-10.57608}} {"sr":{"posz":0.05916,"mpoz":-10.66274}} {"qr":47} feeder> G90 G0 X39.501 Y24.715 Z1 {"sr":{"vel":0,"posz":0,"mpoz":-10.72023}} {"qr":46} feeder> G38.2 Z-1 F50 {"qr":47} feeder> G0 Z1 {"qr":48} feeder> (AL: probing point 25) {"prb":{"e":1,"x":31.65100,"y":0.25000,"z":-10.72023,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} feeder> G90 G0 X0.250 Y32.870 Z1 feeder> G38.2 Z-1 F50 {"qr":46} feeder> G0 Z1 {"r":{},"f":[1,0,22]} feeder> (AL: probing point 26) feeder> G90 G0 X8.100 Y32.870 Z1 {"qr":47} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,25]} feeder> G0 Z1 feeder> (AL: probing point 27) {"qr":46} feeder> G90 G0 X15.950 Y32.870 Z1 {"r":{},"f":[1,0,14]} feeder> G38.2 Z-1 F50 feeder> G0 Z1 {"qr":45} feeder> (AL: probing point 28) {"sr":{"stat":5,"vel":214.99,"momo":0,"posz":0.98405,"mpoz":-9.73617}} {"qr":46} feeder> G90 G0 X23.801 Y32.870 Z1 {"sr":{"vel":2496.49,"posx":32.9982,"posz":1,"mpox":32.9982,"mpoz":-9.72023}} {"sr":{"vel":2834.36,"posx":37.97513,"mpox":37.97513}} {"qr":47} feeder> G38.2 Z-1 F50 {"qr":46} feeder> G0 Z1 {"sr":{"stat":7,"vel":44.82,"momo":1,"posx":39.50101,"posz":0.99548,"mpox":39.50101,"mpoz":-9.72474}} {"sr":{"vel":50,"posz":0.91067,"mpoz":-9.80955}} {"sr":{"posz":0.82569,"mpoz":-9.8962}} {"sr":{"posz":0.7407,"mpoz":-9.97952}} {"sr":{"posz":0.65572,"mpoz":-10.06617}} {"sr":{"posz":0.57073,"mpoz":-10.14949}} {"sr":{"posz":0.48575,"mpoz":-10.23614}} {"sr":{"posz":0.40076,"mpoz":-10.31946}} {"sr":{"posz":0.31578,"mpoz":-10.40611}} {"sr":{"posz":0.23079,"mpoz":-10.48943}} {"qr":47} feeder> (AL: probing point 29) {"qr":46} feeder> G90 G0 X31.651 Y32.870 Z1 {"qr":47} feeder> G38.2 Z-1 F50 {"qr":48} feeder> G0 Z1 {"prb":{"e":1,"x":39.50100,"y":0.25000,"z":-10.53773,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} feeder> (AL: probing point 30) feeder> G90 G0 X39.501 Y32.870 Z1 {"qr":46} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,22]} feeder> G0 Z1 feeder> (AL: probing point 31) {"qr":47} feeder> G90 G0 X0.250 Y41.025 Z1 {"r":{},"f":[1,0,24]} feeder> G38.2 Z-1 F50 feeder> G0 Z1 {"qr":46} feeder> (AL: probing point 32) {"r":{},"f":[1,0,14]} feeder> G90 G0 X8.100 Y41.025 Z1 feeder> G38.2 Z-1 F50 {"qr":45} feeder> G0 Z1 {"sr":{"stat":5,"vel":101.56,"momo":0,"posz":0.99543,"mpoz":-9.72282}} {"qr":46} feeder> (AL: probing point 33) {"sr":{"vel":2801.83,"posx":37.88315,"posy":0.58613,"posz":1,"mpox":37.88315,"mpoy":0.58613,"mpoz":-9.72023}} {"sr":{"vel":3064.07,"posx":32.81297,"posy":1.63954,"mpox":32.71306,"mpoy":1.6603}} {"sr":{"posx":27.71791,"posy":2.69812,"mpox":27.71791,"mpoy":2.69812}} {"sr":{"posx":22.62285,"posy":3.77745,"mpox":22.52294,"mpoy":3.77745}} {"sr":{"posx":17.52778,"posy":4.81528,"mpox":17.52778,"mpoy":4.81528}} {"sr":{"posx":12.43272,"posy":5.87385,"mpox":12.43272,"mpoy":5.87385}} {"sr":{"posx":7.33766,"posy":6.93243,"mpox":7.33766,"mpoy":6.93243}} {"sr":{"vel":3014.88,"posx":2.24909,"posy":7.98966,"mpox":2.24909,"mpoy":7.98966}} {"qr":47} feeder> G90 G0 X15.950 Y41.025 Z1 {"qr":48} feeder> G38.2 Z-1 F50 {"qr":46} feeder> G0 Z1 {"sr":{"stat":7,"vel":0,"momo":1,"posx":0.25,"posy":8.405,"posz":-1,"mpox":0.25,"mpoy":8.405,"mpoz":-11.72023}} {"sr":{"vel":50,"posx":0.25001,"posz":0.91901,"mpox":0.25001,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65274}} {"qr":47} feeder> (AL: probing point 34) {"sr":{"vel":0,"posx":0.25,"posz":0.0225,"mpox":0.25,"mpoz":-10.69773}} {"qr":46} feeder> G90 G0 X23.801 Y41.025 Z1 {"qr":47} feeder> G38.2 Z-1 F50 {"qr":48} feeder> G0 Z1 {"prb":{"e":1,"x":0.25000,"y":8.40500,"z":-10.69773,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} feeder> (AL: probing point 35) feeder> G90 G0 X31.651 Y41.025 Z1 {"qr":46} feeder> G38.2 Z-1 F50 {"r":{},"f":[1,0,22]} feeder> G0 Z1 feeder> (AL: probing point 36) {"qr":47} feeder> G90 G0 X39.501 Y41.025 Z1 {"r":{},"f":[1,0,24]} feeder> G38.2 Z-1 F50 feeder> G0 Z1 {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":211.75,"momo":0,"posz":0.98441,"mpoz":-9.73581}} {"qr":46} {"sr":{"vel":2565.89,"posx":1.59719,"posz":1,"mpox":1.59719,"mpoz":-9.72023}} {"sr":{"vel":2791.56,"posx":6.57412,"mpox":6.57412}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":0,"momo":1,"posx":8.1,"posz":-1,"mpox":8.1,"mpoz":-11.72023}} {"sr":{"vel":50,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65274}} {"sr":{"posz":-0.01583,"mpoz":-10.73606}} {"sr":{"posz":-0.10082,"mpoz":-10.82271}} {"sr":{"posz":-0.1858,"mpoz":-10.90603}} {"sr":{"posz":-0.27079,"mpoz":-10.99268}} {"qr":47} {"qr":46} {"sr":{"vel":1.46,"posz":-0.28163,"mpoz":-11.00186}} {"qr":47} {"prb":{"e":1,"x":8.10000,"y":8.40500,"z":-11.00023,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,22]} {"qr":47} {"r":{},"f":[1,0,25]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":591.97,"momo":0,"posz":0.92506,"mpoz":-9.79517}} {"qr":46} {"sr":{"vel":1991.66,"posx":8.96555,"posz":1,"mpox":8.96555,"mpoz":-9.72023}} {"sr":{"vel":2981.4,"posx":13.85317,"mpox":13.85317}} {"qr":47} {"sr":{"vel":0.17,"posx":15.95,"mpox":15.95}} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.31113}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65274}} {"sr":{"posz":-0.01583,"mpoz":-10.73606}} {"sr":{"posz":-0.10082,"mpoz":-10.82271}} {"sr":{"posz":-0.1858,"mpoz":-10.90603}} {"qr":47} {"sr":{"vel":0,"posz":-0.225,"mpoz":-10.94523}} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":15.95000,"y":8.40500,"z":-10.94523,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,25]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":485.6,"momo":0,"posz":0.93621,"mpoz":-9.78402}} {"qr":46} {"sr":{"vel":2174.38,"posx":16.88926,"posz":1,"mpox":16.88926,"mpoz":-9.72023}} {"sr":{"vel":2951.84,"posx":21.89886,"mpox":21.89886}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":0,"momo":1,"posx":23.801,"posz":-1,"mpox":23.801,"mpoz":-11.72023}} {"sr":{"vel":50,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65107}} {"sr":{"posz":-0.01583,"mpoz":-10.73606}} {"sr":{"posz":-0.10082,"mpoz":-10.82271}} {"sr":{"posz":-0.1858,"mpoz":-10.90603}} {"sr":{"posz":-0.27079,"mpoz":-10.99268}} {"sr":{"posz":-0.35577,"mpoz":-11.076}} {"sr":{"posz":-0.44076,"mpoz":-11.16265}} {"sr":{"posz":-0.52574,"mpoz":-11.24597}} {"sr":{"posz":-0.61073,"mpoz":-11.33262}} {"sr":{"posz":-0.69571,"mpoz":-11.41594}} {"sr":{"posz":-0.7807,"mpoz":-11.50259}} {"sr":{"posz":-0.86568,"mpoz":-11.58591}} {"sr":{"posz":-0.95067,"mpoz":-11.67256}} {"qr":47} {"qr":48} {"er":{"fb":101.06,"st":250,"msg":"Probe cycle failed - probing failed"}} {"prb":{"e":0,"x":23.80100,"y":8.40500,"z":-11.72023,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"sr":{"stat":6,"vel":0.23,"momo":0,"posz":-0.99996,"mpoz":-11.72019}} {"qr":47} {"sr":{"vel":1266.14,"posz":0.61333,"mpoz":-10.1069}} {"er":{"fb":101.06,"st":207,"msg":"Kill job - Job killed by ^d"}} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,26]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,204,25]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,14]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,204,6]} {"err":{"code":204,"msg":"Command rejected by ALARM [$clear to reset]"}} {"r":{},"f":[1,0,23]} {"r":{},"f":[1,0,25]} {"sr":{"stat":5,"vel":0,"posx":8.1,"posy":32.87,"posz":1,"mpox":8.1,"mpoy":32.87,"mpoz":-9.72023}} {"qr":47} {"r":{},"f":[1,0,14]} {"qr":46} {"sr":{"vel":3542.58,"posx":22.26502,"posy":10.79834,"posz":0.9998,"mpox":22.26502,"mpoy":10.79834,"mpoz":-9.72043}} {"sr":{"vel":3564.67,"posx":18.99592,"posy":15.89218,"posz":0.99984,"mpox":18.99592,"mpoy":15.89218,"mpoz":-9.72038}} {"sr":{"posx":15.7261,"posy":20.98715,"posz":0.99989,"mpox":15.7261,"mpoy":20.98715,"mpoz":-9.72034}} {"sr":{"posx":12.45628,"posy":26.08213,"posz":0.99994,"mpox":12.45628,"mpoy":26.08213,"mpoz":-9.72029}} {"sr":{"vel":3412.17,"posx":9.1983,"posy":31.15865,"posz":0.99998,"mpox":9.1983,"mpoy":31.15865,"mpoz":-9.72024}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":0,"momo":1,"posx":8.1,"posy":32.87,"posz":-1,"mpox":8.1,"mpoy":32.87,"mpoz":-11.72023}} {"sr":{"vel":50,"posz":0.91901,"mpoz":-9.80122}} {"sr":{"posz":0.83402,"mpoz":-9.88621}} {"sr":{"posz":0.74904,"mpoz":-9.97286}} {"sr":{"posz":0.66405,"mpoz":-10.05618}} {"sr":{"posz":0.57907,"mpoz":-10.14283}} {"sr":{"posz":0.49408,"mpoz":-10.22615}} {"sr":{"posz":0.40909,"mpoz":-10.3128}} {"sr":{"posz":0.32411,"mpoz":-10.39612}} {"sr":{"posz":0.23913,"mpoz":-10.48277}} {"sr":{"posz":0.15414,"mpoz":-10.56609}} {"sr":{"posz":0.06915,"mpoz":-10.65274}} {"sr":{"posz":-0.01583,"mpoz":-10.73606}} {"sr":{"posz":-0.10082,"mpoz":-10.82271}} {"sr":{"posz":-0.1858,"mpoz":-10.90603}} {"sr":{"posz":-0.27079,"mpoz":-10.99268}} {"sr":{"posz":-0.35577,"mpoz":-11.076}} {"sr":{"posz":-0.44076,"mpoz":-11.16265}} {"sr":{"posz":-0.52574,"mpoz":-11.24597}} {"sr":{"posz":-0.61073,"mpoz":-11.33262}} {"sr":{"posz":-0.69571,"mpoz":-11.41594}} {"sr":{"posz":-0.7807,"mpoz":-11.50259}} {"sr":{"vel":0.8,"posz":-0.85836,"mpoz":-11.57858}} {"qr":47} {"sr":{"vel":0,"posz":-0.85523,"mpoz":-11.57545}} {"qr":46} {"qr":47} {"prb":{"e":1,"x":8.10000,"y":32.87000,"z":-11.57545,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1137.11,"momo":0,"posz":0.69039,"mpoz":-10.02983}} {"qr":46} {"sr":{"vel":1200.96,"posx":8.44345,"posz":1,"mpox":8.44345,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":13.05965,"mpox":13.05965}} {"sr":{"vel":69.79,"posx":15.94703,"mpox":15.94835}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":15.95,"posz":0.959,"mpox":15.95,"mpoz":-9.76123}} {"sr":{"posz":0.87401,"mpoz":-9.84621}} {"sr":{"posz":0.78903,"mpoz":-9.9312}} {"sr":{"posz":0.70404,"mpoz":-10.01618}} {"sr":{"posz":0.61906,"mpoz":-10.10117}} {"sr":{"posz":0.53407,"mpoz":-10.18615}} {"sr":{"posz":0.44909,"mpoz":-10.27114}} {"sr":{"posz":0.3641,"mpoz":-10.35612}} {"sr":{"posz":0.27912,"mpoz":-10.44111}} {"sr":{"posz":0.19413,"mpoz":-10.52609}} {"sr":{"posz":0.10915,"mpoz":-10.61108}} {"sr":{"posz":0.02416,"mpoz":-10.69606}} {"sr":{"posz":-0.06082,"mpoz":-10.78105}} {"sr":{"posz":-0.14581,"mpoz":-10.86603}} {"sr":{"posz":-0.23079,"mpoz":-10.95102}} {"sr":{"posz":-0.31578,"mpoz":-11.036}} {"sr":{"posz":-0.40076,"mpoz":-11.12099}} {"sr":{"posz":-0.48575,"mpoz":-11.20597}} {"sr":{"posz":-0.57073,"mpoz":-11.29096}} {"sr":{"posz":-0.65572,"mpoz":-11.37594}} {"sr":{"posz":-0.7407,"mpoz":-11.46093}} {"qr":47} {"qr":46} {"sr":{"vel":0.96,"posz":-0.77993,"mpoz":-11.50015}} {"qr":47} {"qr":48} {"prb":{"e":1,"x":15.95000,"y":32.87000,"z":-11.49545,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1049.14,"momo":0,"posz":0.73696,"mpoz":-9.98326}} {"qr":46} {"sr":{"vel":1299.79,"posx":16.33831,"posz":1,"mpox":16.3865,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":20.91061,"mpox":21.00919}} {"sr":{"vel":48.16,"posx":23.79935,"mpox":23.79935}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":23.801,"posz":0.95733,"mpox":23.801,"mpoz":-9.76289}} {"sr":{"posz":0.87235,"mpoz":-9.84788}} {"sr":{"posz":0.78736,"mpoz":-9.93286}} {"sr":{"posz":0.70238,"mpoz":-10.01785}} {"sr":{"posz":0.61739,"mpoz":-10.10283}} {"sr":{"posz":0.53241,"mpoz":-10.18782}} {"sr":{"posz":0.44742,"mpoz":-10.2728}} {"sr":{"posz":0.36244,"mpoz":-10.35779}} {"sr":{"posz":0.27745,"mpoz":-10.44277}} {"sr":{"posz":0.19247,"mpoz":-10.52776}} {"sr":{"posz":0.10748,"mpoz":-10.61275}} {"sr":{"posz":0.0225,"mpoz":-10.69773}} {"sr":{"posz":-0.06249,"mpoz":-10.78271}} {"sr":{"posz":-0.14747,"mpoz":-10.8677}} {"sr":{"posz":-0.23246,"mpoz":-10.95269}} {"sr":{"posz":-0.31744,"mpoz":-11.03767}} {"sr":{"posz":-0.40243,"mpoz":-11.12266}} {"sr":{"posz":-0.48741,"mpoz":-11.20764}} {"sr":{"posz":-0.5724,"mpoz":-11.29263}} {"sr":{"posz":-0.65738,"mpoz":-11.37761}} {"sr":{"vel":5.18,"posz":-0.73837,"mpoz":-11.45859}} {"qr":47} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":23.80100,"y":32.87000,"z":-11.44795,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1009.51,"momo":0,"posz":0.75623,"mpoz":-9.96399}} {"qr":46} {"sr":{"vel":1299.79,"posx":24.2375,"posz":1,"mpox":24.2375,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":28.85919,"mpox":28.85919}} {"sr":{"vel":48.16,"posx":31.64935,"mpox":31.64935}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":31.651,"posz":0.95733,"mpox":31.651,"mpoz":-9.76289}} {"sr":{"posz":0.87235,"mpoz":-9.84788}} {"sr":{"posz":0.78736,"mpoz":-9.93286}} {"sr":{"posz":0.70238,"mpoz":-10.01785}} {"sr":{"posz":0.61739,"mpoz":-10.10283}} {"sr":{"posz":0.53241,"mpoz":-10.18782}} {"sr":{"posz":0.44742,"mpoz":-10.2728}} {"sr":{"posz":0.36244,"mpoz":-10.35779}} {"sr":{"posz":0.27745,"mpoz":-10.44277}} {"sr":{"posz":0.19247,"mpoz":-10.52776}} {"sr":{"posz":0.10748,"mpoz":-10.61275}} {"sr":{"posz":0.0225,"mpoz":-10.69773}} {"sr":{"posz":-0.06249,"mpoz":-10.78271}} {"sr":{"posz":-0.14747,"mpoz":-10.8677}} {"sr":{"posz":-0.23246,"mpoz":-10.95269}} {"sr":{"posz":-0.31744,"mpoz":-11.03767}} {"sr":{"posz":-0.40243,"mpoz":-11.12266}} {"sr":{"posz":-0.48741,"mpoz":-11.20764}} {"sr":{"posz":-0.5724,"mpoz":-11.29263}} {"sr":{"posz":-0.65738,"mpoz":-11.37761}} {"sr":{"posz":-0.74237,"mpoz":-11.4626}} {"qr":47} {"qr":48} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":31.65100,"y":32.87000,"z":-11.48045,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1043.22,"momo":0,"posz":0.73918,"mpoz":-9.98104}} {"qr":46} {"sr":{"vel":1399.64,"posx":32.0875,"posz":1,"mpox":32.0875,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":36.70918,"mpox":36.70918}} {"sr":{"vel":31.23,"posx":39.50017,"mpox":39.50017}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":39.501,"posz":0.95567,"mpox":39.501,"mpoz":-9.76456}} {"sr":{"posz":0.87068,"mpoz":-9.84955}} {"sr":{"posz":0.7857,"mpoz":-9.93453}} {"sr":{"posz":0.70071,"mpoz":-10.01951}} {"sr":{"posz":0.61573,"mpoz":-10.1045}} {"sr":{"posz":0.53074,"mpoz":-10.18949}} {"sr":{"posz":0.44576,"mpoz":-10.27447}} {"sr":{"posz":0.36077,"mpoz":-10.35946}} {"sr":{"posz":0.27579,"mpoz":-10.44444}} {"sr":{"posz":0.1908,"mpoz":-10.52943}} {"sr":{"posz":0.10581,"mpoz":-10.61441}} {"sr":{"posz":0.02083,"mpoz":-10.6994}} {"sr":{"posz":-0.06416,"mpoz":-10.78438}} {"sr":{"posz":-0.14914,"mpoz":-10.86937}} {"sr":{"posz":-0.23413,"mpoz":-10.95435}} {"sr":{"posz":-0.31911,"mpoz":-11.03934}} {"sr":{"posz":-0.4041,"mpoz":-11.12432}} {"sr":{"posz":-0.48908,"mpoz":-11.20931}} {"sr":{"posz":-0.57407,"mpoz":-11.29429}} {"sr":{"posz":-0.65905,"mpoz":-11.37928}} {"qr":47} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":39.50100,"y":32.87000,"z":-11.45045,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,25]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1010.48,"momo":0,"posz":0.75588,"mpoz":-9.96435}} {"qr":46} {"sr":{"vel":1429.53,"posx":39.0645,"posy":32.96069,"posz":1,"mpox":39.0645,"mpoy":32.96069,"mpoz":-9.72023}} {"sr":{"vel":3064.07,"posx":34.41141,"posy":33.92744,"mpox":34.31151,"mpoy":33.9482}} {"sr":{"posx":29.31635,"posy":34.98602,"mpox":29.31635,"mpoy":34.98602}} {"sr":{"posx":24.22129,"posy":36.0446,"mpox":24.12139,"mpoy":36.06536}} {"sr":{"posx":19.12623,"posy":37.10318,"mpox":19.12623,"mpoy":37.10318}} {"sr":{"posx":14.03116,"posy":38.16176,"mpox":13.93126,"mpoy":38.18251}} {"sr":{"posx":8.9361,"posy":39.22034,"mpox":8.9361,"mpoy":39.22034}} {"sr":{"posx":3.84104,"posy":40.27891,"mpox":3.74114,"mpoy":40.29967}} {"sr":{"vel":317.18,"posx":0.28026,"posy":41.01871,"mpox":0.28026,"mpoy":41.01871}} {"qr":47} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":0.25,"posy":41.025,"posz":0.94234,"mpox":0.25,"mpoy":41.025,"mpoz":-9.77789}} {"sr":{"posz":0.85902,"mpoz":-9.86121}} {"sr":{"posz":0.77403,"mpoz":-9.94619}} {"sr":{"posz":0.68905,"mpoz":-10.03118}} {"sr":{"posz":0.60406,"mpoz":-10.11616}} {"sr":{"posz":0.51908,"mpoz":-10.20115}} {"sr":{"posz":0.43409,"mpoz":-10.28614}} {"sr":{"posz":0.34911,"mpoz":-10.37112}} {"sr":{"posz":0.26412,"mpoz":-10.45611}} {"sr":{"posz":0.17914,"mpoz":-10.54109}} {"sr":{"posz":0.09415,"mpoz":-10.62608}} {"sr":{"posz":0.00916,"mpoz":-10.71106}} {"sr":{"posz":-0.07582,"mpoz":-10.79605}} {"sr":{"posz":-0.1608,"mpoz":-10.88103}} {"sr":{"posz":-0.24579,"mpoz":-10.96602}} {"sr":{"posz":-0.33078,"mpoz":-11.051}} {"sr":{"posz":-0.41576,"mpoz":-11.13599}} {"sr":{"posz":-0.50075,"mpoz":-11.22097}} {"sr":{"posz":-0.58573,"mpoz":-11.30596}} {"sr":{"posz":-0.67072,"mpoz":-11.39094}} {"sr":{"vel":44.82,"posz":-0.75482,"mpoz":-11.47505}} {"sr":{"vel":0,"posz":-0.74773,"mpoz":-11.46795}} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":0.25000,"y":41.02500,"z":-11.46795,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,25]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"qr":46} {"sr":{"stat":5,"vel":1299.79,"momo":0,"posx":0.63832,"posz":1,"mpox":0.6865,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":5.20965,"mpox":5.30819}} {"sr":{"vel":48.16,"posx":8.09835,"mpox":8.09835}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":8.1,"posz":0.95733,"mpox":8.1,"mpoz":-9.76289}} {"sr":{"posz":0.87235,"mpoz":-9.84788}} {"sr":{"posz":0.78736,"mpoz":-9.93286}} {"sr":{"posz":0.70238,"mpoz":-10.01785}} {"sr":{"posz":0.61739,"mpoz":-10.10283}} {"sr":{"posz":0.53241,"mpoz":-10.18782}} {"sr":{"posz":0.44742,"mpoz":-10.2728}} {"sr":{"posz":0.36244,"mpoz":-10.35779}} {"sr":{"posz":0.27745,"mpoz":-10.44277}} {"sr":{"posz":0.19247,"mpoz":-10.52776}} {"sr":{"posz":0.10748,"mpoz":-10.61275}} {"sr":{"posz":0.0225,"mpoz":-10.69773}} {"sr":{"posz":-0.06249,"mpoz":-10.78271}} {"sr":{"posz":-0.14747,"mpoz":-10.8677}} {"sr":{"posz":-0.23246,"mpoz":-10.95269}} {"sr":{"posz":-0.31744,"mpoz":-11.03767}} {"sr":{"posz":-0.40243,"mpoz":-11.12266}} {"sr":{"posz":-0.48741,"mpoz":-11.20764}} {"sr":{"posz":-0.5724,"mpoz":-11.29263}} {"sr":{"posz":-0.65738,"mpoz":-11.37761}} {"qr":47} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":8.10000,"y":41.02500,"z":-11.44295,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1007.56,"momo":0,"posz":0.75694,"mpoz":-9.96329}} {"qr":46} {"sr":{"vel":1299.79,"posx":8.5365,"posz":1,"mpox":8.5365,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":13.15819,"mpox":13.15819}} {"sr":{"vel":48.16,"posx":15.94835,"mpox":15.94835}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":15.95,"posz":0.95733,"mpox":15.95,"mpoz":-9.76289}} {"sr":{"posz":0.87235,"mpoz":-9.84788}} {"sr":{"posz":0.78736,"mpoz":-9.93286}} {"sr":{"posz":0.70238,"mpoz":-10.01785}} {"sr":{"posz":0.61739,"mpoz":-10.10283}} {"sr":{"posz":0.53241,"mpoz":-10.18782}} {"sr":{"posz":0.44742,"mpoz":-10.2728}} {"sr":{"posz":0.36244,"mpoz":-10.35779}} {"sr":{"posz":0.27745,"mpoz":-10.44277}} {"sr":{"posz":0.19247,"mpoz":-10.52776}} {"sr":{"posz":0.10748,"mpoz":-10.61275}} {"sr":{"posz":0.0225,"mpoz":-10.69773}} {"sr":{"posz":-0.06249,"mpoz":-10.78271}} {"sr":{"posz":-0.14747,"mpoz":-10.8677}} {"sr":{"posz":-0.23246,"mpoz":-10.95269}} {"sr":{"posz":-0.31744,"mpoz":-11.03767}} {"sr":{"posz":-0.40243,"mpoz":-11.12266}} {"sr":{"posz":-0.48741,"mpoz":-11.20764}} {"sr":{"posz":-0.5724,"mpoz":-11.29263}} {"sr":{"posz":-0.65738,"mpoz":-11.37761}} {"qr":48} {"qr":46} {"sr":{"vel":0,"posz":-0.71523,"mpoz":-11.43545}} {"qr":47} {"prb":{"e":1,"x":15.95000,"y":41.02500,"z":-11.43545,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1004.61,"momo":0,"posz":0.75801,"mpoz":-9.96222}} {"qr":46} {"sr":{"vel":1399.64,"posx":16.3865,"posz":1,"mpox":16.3865,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":21.00919,"mpox":21.00919}} {"sr":{"vel":31.22,"posx":23.80018,"mpox":23.80018}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":23.80101,"posz":0.95567,"mpox":23.80101,"mpoz":-9.76456}} {"sr":{"posz":0.87068,"mpoz":-9.84955}} {"sr":{"posz":0.7857,"mpoz":-9.93453}} {"sr":{"posz":0.70071,"mpoz":-10.01951}} {"sr":{"posz":0.61573,"mpoz":-10.1045}} {"sr":{"posz":0.53074,"mpoz":-10.18949}} {"sr":{"posz":0.44576,"mpoz":-10.27447}} {"sr":{"posz":0.36077,"mpoz":-10.35946}} {"sr":{"posz":0.27579,"mpoz":-10.44444}} {"sr":{"posz":0.1908,"mpoz":-10.52943}} {"sr":{"posz":0.10581,"mpoz":-10.61441}} {"sr":{"posz":0.02083,"mpoz":-10.6994}} {"sr":{"posz":-0.06416,"mpoz":-10.78438}} {"sr":{"posz":-0.14914,"mpoz":-10.86937}} {"sr":{"posz":-0.23413,"mpoz":-10.95435}} {"sr":{"posz":-0.31911,"mpoz":-11.03934}} {"sr":{"posz":-0.4041,"mpoz":-11.12432}} {"sr":{"posz":-0.48908,"mpoz":-11.20931}} {"sr":{"posz":-0.57407,"mpoz":-11.29429}} {"sr":{"posz":-0.65905,"mpoz":-11.37928}} {"sr":{"posz":-0.74404,"mpoz":-11.46426}} {"qr":47} {"qr":46} {"sr":{"vel":1.07,"posz":-0.77324,"mpoz":-11.49347}} {"qr":47} {"prb":{"e":1,"x":23.80100,"y":41.02500,"z":-11.48795,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":1046.24,"momo":0,"posz":0.73805,"mpoz":-9.98217}} {"qr":46} {"sr":{"vel":1299.79,"posx":24.2375,"posz":1,"mpox":24.2375,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":28.85919,"mpox":28.85919}} {"sr":{"vel":48.16,"posx":31.64935,"mpox":31.64935}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":31.65101,"posz":0.95733,"mpox":31.65101,"mpoz":-9.76289}} {"sr":{"posz":0.87235,"mpoz":-9.84788}} {"sr":{"posz":0.78736,"mpoz":-9.93286}} {"sr":{"posz":0.70238,"mpoz":-10.01785}} {"sr":{"posz":0.61739,"mpoz":-10.10283}} {"sr":{"posz":0.53241,"mpoz":-10.18782}} {"sr":{"posz":0.44742,"mpoz":-10.2728}} {"sr":{"posz":0.36244,"mpoz":-10.35779}} {"sr":{"posz":0.27745,"mpoz":-10.44277}} {"sr":{"posz":0.19247,"mpoz":-10.52776}} {"sr":{"posz":0.10748,"mpoz":-10.61275}} {"sr":{"posz":0.0225,"mpoz":-10.69773}} {"sr":{"posz":-0.06249,"mpoz":-10.78271}} {"sr":{"posz":-0.14747,"mpoz":-10.8677}} {"sr":{"posz":-0.23246,"mpoz":-10.95269}} {"sr":{"posz":-0.31744,"mpoz":-11.03767}} {"sr":{"posz":-0.40243,"mpoz":-11.12266}} {"sr":{"posz":-0.48741,"mpoz":-11.20764}} {"sr":{"posz":-0.5724,"mpoz":-11.29263}} {"sr":{"posz":-0.65738,"mpoz":-11.37761}} {"qr":47} {"sr":{"vel":0,"posz":-0.68023,"mpoz":-11.40045}} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":31.65100,"y":41.02500,"z":-11.40045,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"r":{},"f":[1,0,23]} {"qr":47} {"r":{},"f":[1,0,26]} {"qr":46} {"r":{},"f":[1,0,14]} {"qr":45} {"sr":{"stat":5,"vel":990.92,"momo":0,"posz":0.7925,"mpoz":-9.92773}} {"qr":46} {"sr":{"vel":1399.64,"posx":32.13903,"posz":1,"mpox":32.13903,"mpoz":-9.72023}} {"sr":{"vel":3000,"posx":36.80889,"mpox":36.80889}} {"sr":{"vel":31.23,"posx":39.50018,"mpox":39.50018}} {"qr":47} {"qr":48} {"qr":46} {"sr":{"stat":7,"vel":50,"momo":1,"posx":39.501,"posz":0.95567,"mpox":39.501,"mpoz":-9.76456}} {"sr":{"posz":0.87068,"mpoz":-9.84955}} {"sr":{"posz":0.7857,"mpoz":-9.93453}} {"sr":{"posz":0.70071,"mpoz":-10.01951}} {"sr":{"posz":0.61573,"mpoz":-10.1045}} {"sr":{"posz":0.53074,"mpoz":-10.18949}} {"sr":{"posz":0.44576,"mpoz":-10.27447}} {"sr":{"posz":0.36077,"mpoz":-10.35946}} {"sr":{"posz":0.27579,"mpoz":-10.44444}} {"sr":{"posz":0.1908,"mpoz":-10.52943}} {"sr":{"posz":0.10581,"mpoz":-10.61441}} {"sr":{"posz":0.02083,"mpoz":-10.6994}} {"sr":{"posz":-0.06416,"mpoz":-10.78438}} {"sr":{"posz":-0.14914,"mpoz":-10.86937}} {"sr":{"posz":-0.23413,"mpoz":-10.95435}} {"sr":{"posz":-0.31911,"mpoz":-11.03934}} {"sr":{"posz":-0.4041,"mpoz":-11.12432}} {"sr":{"posz":-0.48908,"mpoz":-11.20931}} {"sr":{"posz":-0.57407,"mpoz":-11.29429}} {"sr":{"posz":-0.65905,"mpoz":-11.37928}} {"qr":47} {"sr":{"vel":0,"posz":-0.69273,"mpoz":-11.41295}} {"qr":46} {"qr":47} {"qr":48} {"prb":{"e":1,"x":39.50100,"y":41.02500,"z":-11.41295,"a":0.00000,"b":0.00000,"c":0.00000}} {"r":{},"f":[1,0,6]} {"qr":46} {"sr":{"stat":5,"vel":0.24,"momo":0,"posz":-0.69269,"mpoz":-11.41291}} {"qr":47} {"sr":{"vel":995.83,"posz":0.79095,"mpoz":-9.92927}} {"qr":48} {"sr":{"stat":3,"vel":0,"posz":1,"mpoz":-9.72023}} > ```