code: def surface_velocity(msg):
      
  
      if common.typecode(msg) < 5 or common.typecode(msg) > 8:
          raise RuntimeError("%s: Not a surface message, expecting 5<TC<8" % msg)
  
      mb = common.hex2bin(msg)[32:]
  
      # ground track
      trk_status = int(mb[12])
      if trk_status == 1:
          trk = common.bin2int(mb[13:20]) * 360.0 / 128.0
          trk = round(trk, 1)
      else:
          trk = None
  
      # ground movment / speed
      mov = common.bin2int(mb[5:12])
  
      if mov == 0 or mov > 124:
          spd = None
      elif mov == 1:
          spd = 0
      elif mov == 124:
          spd = 175
      else:
          movs = [2, 9, 13, 39, 94, 109, 124]
          kts = [0.125, 1, 2, 15, 70, 100, 175]
          i = next(m[0] for m in enumerate(movs) if m[1] > mov)
          step = (kts[i] - kts[i-1]) * 1.0 / (movs[i]-movs[i-1])
          spd = kts[i-1] + (mov-movs[i-1]) * step
          spd = round(spd, 2)
  
      return spd, trk, 0, 'GS'
docs: Decode surface velocity from from a surface position message
      Args:
          msg (string): 28 bytes hexadecimal message string
  
      Returns:
          (int, float, int, string): speed (kt), ground track (degree),
              rate of climb/descend (ft/min), and speed type
              ('GS' for ground speed, 'AS' for airspeed)