Source Code

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-not-found (err u101))

(define-map gps-satellites
  (string-ascii 32)
  {orbit-slot: uint, health-status: (string-ascii 32), signal-accuracy: uint, operational: bool})

(define-map position-fixes
  uint
  {
    user: principal,
    latitude: int,
    longitude: int,
    altitude: uint,
    satellites-used: uint,
    hdop: uint,
    timestamp: uint
  })

(define-data-var next-fix-id uint u0)

(define-read-only (get-satellite (sat-id (string-ascii 32)))
  (ok (map-get? gps-satellites sat-id)))

(define-read-only (get-fix (fix-id uint))
  (ok (map-get? position-fixes fix-id)))

(define-public (register-satellite (sat-id (string-ascii 32)) (orbit uint) (accuracy uint))
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (ok (map-set gps-satellites sat-id
      {orbit-slot: orbit, health-status: "healthy", signal-accuracy: accuracy, operational: true}))))

(define-public (update-satellite-health (sat-id (string-ascii 32)) (status (string-ascii 32)))
  (let ((satellite (unwrap! (map-get? gps-satellites sat-id) err-not-found)))
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (ok (map-set gps-satellites sat-id (merge satellite {health-status: status})))))

(define-public (record-position (lat int) (lon int) (alt uint) (sats uint) (hdop uint))
  (let ((fix-id (var-get next-fix-id)))
    (map-set position-fixes fix-id
      {user: tx-sender, latitude: lat, longitude: lon, altitude: alt,
       satellites-used: sats, hdop: hdop, timestamp: stacks-block-height})
    (var-set next-fix-id (+ fix-id u1))
    (ok fix-id)))

Functions (5)

FunctionAccessArgs
get-satelliteread-onlysat-id: (string-ascii 32
get-fixread-onlyfix-id: uint
register-satellitepublicsat-id: (string-ascii 32
update-satellite-healthpublicsat-id: (string-ascii 32
record-positionpubliclat: int, lon: int, alt: uint, sats: uint, hdop: uint