
import bitstruct

# ssh -L 27182:10.10.10.10:27182 user@cnc
# target = ("127.0.0.1", 27182)

target = ("10.10.10.10", 27182)


format_string = ("s32s8s8s32s32s32s32s32s32p8s8p8s32s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8s8")


def pack_mpg_data_struct(
    header,
    byte0,
    byte1,
    xPos,
    yPos,
    zPos,
    aPos,
    bPos,
    cPos,
    byte24,
    reset,
    byte26,
    spindle_rpm,
    spindle_on,
    feed_rate_override,
    slow_jog_rate,
    spindle_rate_override,
    spare35,
    parameter_select,
    axis_select,
    mpg_multiplier,
    spare39,
    spare40,
    spare41,
    spare42,
    spare43,
    spare44,
    spare45,
    spare46,
    spare47,
    spare48,
    spare49,
    spare50,
):
    return bitstruct.pack(
        format_string,
        header,
        byte0,
        byte1,
        xPos,
        yPos,
        zPos,
        aPos,
        bPos,
        cPos,
        byte24,
        reset,
        byte26,
        spindle_rpm,
        spindle_on,
        feed_rate_override,
        slow_jog_rate,
        spindle_rate_override,
        spare35,
        parameter_select,
        axis_select,
        mpg_multiplier,
        spare39,
        spare40,
        spare41,
        spare42,
        spare43,
        spare44,
        spare45,
        spare46,
        spare47,
        spare48,
        spare49,
        spare50,
    )


import socket
from random import randint

udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


try:
    udp_client_socket.connect(target)
    while True:
        msg = pack_mpg_data_struct(
            header=0x6D706764,
            byte0=0x5A,
            byte1=0x5A,
            xPos=randint(0, 127),
            yPos=randint(0, 127),
            zPos=randint(0, 127),
            aPos=randint(0, 127),
            bPos=randint(0, 127),
            cPos=randint(0, 127),
            byte24=0,
            reset=randint(0, 1),
            byte26=0,
            spindle_rpm=randint(0, 127),
            spindle_on=randint(0, 1),
            feed_rate_override=randint(0, 127),
            slow_jog_rate=randint(0, 127),
            spindle_rate_override=randint(0, 127),
            spare35=0,
            parameter_select=randint(0, 2),
            axis_select=randint(0, 5),
            mpg_multiplier=randint(0, 3),
            spare39=0,
            spare40=0,
            spare41=0,
            spare42=0,
            spare43=0,
            spare44=0,
            spare45=0,
            spare46=0,
            spare47=0,
            spare48=0,
            spare49=0,
            spare50=0,
        )
        udp_client_socket.send(msg)
finally:
    udp_client_socket.close()
