namespace FSharp.Data.Tdms open System open System.IO open System.Numerics open System.Threading open System.Threading.Tasks type Channel = { Name: string FilePath: string Properties: Property seq RawDataBlocks: RawDataBlocks option BigEndian: bool } module Channel = let tryGetPropertyValue<'t> propertyName { Properties = properties } = properties |> Seq.tryFind (fun { Name = propertyName' } -> propertyName' = propertyName) |> Option.bind Property.tryGet<'t> let getPropertyValue<'t> propertyName = tryGetPropertyValue<'t> propertyName >> Option.get let tryGetRawData<'t> { FilePath = path RawDataBlocks = rawDataBlocks BigEndian = bigEndian } = let bufferSize = 65_536 match rawDataBlocks with | None -> None | Some (PrimitiveRawDataBlocks (ty, rawDataBlockArray)) -> if typeof<'t>.IsAssignableFrom ty then use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.None) if ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readPrimitiveRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readComplexRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readTimestampRawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> elif ty = typeof then Reader.readFloat80RawData fileStream rawDataBlockArray bigEndian |> box |> tryUnbox<'t []> else None else if ty = typeof then if typeof<'t> = typeof then use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.None) Reader.readTimestampRawData fileStream rawDataBlockArray bigEndian |> Array.map Timestamp.toDateTime |> box |> tryUnbox<'t []> else if typeof<'t> = typeof then use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.None) Reader.readTimestampRawData fileStream rawDataBlockArray bigEndian |> Array.map Timestamp.toDateTimeOffset |> box |> tryUnbox<'t []> else if typeof<'t> = typeof then use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.None) Reader.readTimestampRawData fileStream rawDataBlockArray bigEndian |> Array.map Timestamp.toTimeSpan |> box |> tryUnbox<'t []> else None else None | Some (StringRawDataBlocks stringRawDataBlockArray) -> if typeof<'t> = typeof then use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.None) Reader.readStringRawData fileStream stringRawDataBlockArray bigEndian |> box |> tryUnbox<'t []> else None #if !IS_DESIGNTIME let tryGetRawDataAsyncCt<'t> ct { FilePath = path RawDataBlocks = rawDataBlocks BigEndian = bigEndian } = let bufferSize = 65_536 match rawDataBlocks with | None -> Task.FromResult None | Some (PrimitiveRawDataBlocks (ty, rawDataBlockArray)) -> if ty = typeof<'t> then if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readPrimitiveRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readFloat80RawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else if ty = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readComplexRawDataAsync ct fileStream rawDataBlockArray bigEndian return box result |> tryUnbox<'t []> } else Task.FromResult None else if ty = typeof then if typeof<'t> = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readTimestampRawDataAsync ct fileStream rawDataBlockArray bigEndian return Array.map Timestamp.toDateTime result |> box |> tryUnbox<'t []> } else if typeof<'t> = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readTimestampRawDataAsync ct fileStream rawDataBlockArray bigEndian return Array.map Timestamp.toDateTimeOffset result |> box |> tryUnbox<'t []> } else if typeof<'t> = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readTimestampRawDataAsync ct fileStream rawDataBlockArray bigEndian return Array.map Timestamp.toTimeSpan result |> box |> tryUnbox<'t []> } else Task.FromResult None else Task.FromResult None | Some (StringRawDataBlocks stringRawDataBlockArray) -> if typeof<'t> = typeof then backgroundTask { use fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous) let! result = Reader.readStringRawDataAsync ct fileStream stringRawDataBlockArray bigEndian return result |> box |> tryUnbox<'t []> } else Task.FromResult None let tryRawDataAsync<'t> = tryGetRawDataAsyncCt<'t> CancellationToken.None #endif