Obtains all the points in the edna_service, including real-time values.

    :param edna_service: The full Site.Service name of the eDNA service.
    :return: A pandas DataFrame of points in the form [Tag, Value, Time,
        Description, Units]

def GetPoints(edna_service):
    """
    Obtains all the points in the edna_service, including real-time values.

    :param edna_service: The full Site.Service name of the eDNA service.
    :return: A pandas DataFrame of points in the form [Tag, Value, Time,
        Description, Units]
    """
    # Define all required variables in the correct ctypes format
    szServiceName = c_char_p(edna_service.encode('utf-8'))
    nStarting, pulKey, pdValue = c_ushort(0), c_ulong(0), c_double(-9999)
    szPoint, szTime = create_string_buffer(30), create_string_buffer(30)
    szStatus, szDesc = create_string_buffer(20), create_string_buffer(90)
    szUnits = create_string_buffer(20)
    szPoint2, szTime2 = create_string_buffer(30), create_string_buffer(30)
    szStatus2, szDesc2 = create_string_buffer(20), create_string_buffer(90)
    szUnits2, pdValue2 = create_string_buffer(20), c_double(-9999)
    nPoint, nTime, nStatus = c_ushort(30), c_ushort(30), c_ushort(20)
    nDesc, nUnits = c_ushort(90), c_ushort(20)

    # Call the eDNA function. nRet is zero if the function is successful.
    points = []
    nRet = dna_dll.DnaGetPointEntry(szServiceName, nStarting, byref(pulKey),
        byref(szPoint), nPoint, byref(pdValue), byref(szTime), nTime,
        byref(szStatus), nStatus, byref(szDesc), nDesc, byref(szUnits), nUnits)
    tag = _FormatPoints(szPoint, pdValue, szTime, szStatus, szDesc, szUnits)
    if tag:
        points.append(tag)

    # Iterate across all the returned services
    while nRet == 0:
        nRet = dna_dll.DnaGetNextPointEntry(pulKey, byref(szPoint2), nPoint,
            byref(pdValue2), byref(szTime2), nTime, byref(szStatus2), nStatus,
            byref(szDesc2), nDesc, byref(szUnits2), nUnits)
        # We want to ensure only UTF-8 characters are returned. Ignoring
        # characters is slightly unsafe, but they should only occur in the
        # units or description, so it's not a huge issue.
        tag = _FormatPoints(szPoint2, pdValue2, szTime2, szStatus2, szDesc2,
                            szUnits2)
        if tag:
            points.append(tag)

    # If no results were returned, raise a warning
    df = pd.DataFrame()
    if points:
        df = pd.DataFrame(points, columns=["Tag", "Value", "Time", "Status",
                                           "Description", "Units"])
    else:
        warnings.warn("WARNING- No points were returned. Check that the " +
                      "service exists and contains points.")
    return df