import pigpio
import time

TX_PIN = 17  # GPIO17 connected to GPS RX
RX_PIN = 23  # GPIO27 connected to GPS TX
BAUD_RATE = 9600

# Initialize pigpio
pi = pigpio.pi()

# Setup bit-banged serial RX
pi.bb_serial_read_open(RX_PIN, BAUD_RATE)  # Open RX for reading GPS data

def send_nmea(sentence):
    """Send an NMEA sentence over bit-banged TX using pigpio waves."""
    checksum = 0
    for char in sentence:
        checksum ^= ord(char)  # XOR checksum calculation

    nmea_msg = f'${sentence}*{checksum:02X}\r\n'  # Full NMEA sentence

    pi.wave_clear()  # Clear any existing waveforms
    pi.wave_add_serial(TX_PIN, BAUD_RATE, nmea_msg.encode())  # Add serial wave
    wave_id = pi.wave_create()  # Create waveform

    if wave_id >= 0:
        pi.wave_send_once(wave_id)  # Send waveform once
        while pi.wave_tx_busy():  # Wait for transmission to finish
            time.sleep(0.01)
        pi.wave_delete(wave_id)  # Delete waveform after sending

def read_gps():
    """Read data from the GPS module."""
    while True:
        (count, data) = pi.bb_serial_read(RX_PIN)
        if count:
            print(data.decode('utf-8', errors='ignore'), end="")  # Print incoming NMEA messages
        time.sleep(0.1)

try:
    send_nmea("PMTK220,1000")  # Set GPS update rate to 1Hz
    read_gps()  # Start reading GPS data
except KeyboardInterrupt:
    print("\nExiting...")
finally:
    pi.bb_serial_read_close(RX_PIN)  # Close software serial
    pi.stop()
