package main import ( "os" "io/ioutil" "errors" ) const ( FSStatusOk = 0x01 FSStatusError = 0x02 ) var ( ErrFileNotExists = errors.New("file does not exist") ErrFileReadOnly = errors.New("file is read only") ErrFileWriteOnly = errors.New("file is write only") ErrInvalidOffset = errors.New("invalid file offset") ErrOffsetChanged = errors.New("offset has already been changed") ErrReadOpen = errors.New("only one file can be opened for reading at a time") ErrWriteOpen = errors.New("only one file can be opened for writing at a time") ErrNoRemoveRoot = errors.New("refusing to remove root directory") ) type Device struct { } type FS struct { } type DirEntry struct { status int8 flags uint32 modtime uint64 size uint32 path string } type File struct { fs *FS path string fp *os.File isReadOnly bool isWriteOnly bool } func (i *Device) HeartRate() (uint8, error) { return 10, nil } func (i *Device) BatteryLevel() (uint8, error) { return 95, nil } func (i *Device) StepCount() (uint32, error) { return 27000, nil } type MotionValues struct { X int16 Y int16 Z int16 } func (i *Device) Motion() (MotionValues, error) { return MotionValues{-12, +64, -19}, nil } func (i *Device) Address() string { return "FA:E4:00:00:00:00" } func (i *Device) Version() (string, error) { return "1.11.0", nil } func (blefs *FS) ReadDir(path string) ([]DirEntry, error) { var out []DirEntry files, err := ioutil.ReadDir("./root/" + path) if err != nil { return nil, nil } for _, f := range files { listing := DirEntry{} listing.status = FSStatusOk listing.modtime = uint64(f.ModTime().Unix()) listing.size = uint32(f.Size()) listing.path = path + "/" + f.Name() if f.IsDir() { listing.flags = 1; } else { listing.flags = 0; } out = append(out, listing) } return out, nil } func (blefs *FS) Mkdir(path string) error { return os.Mkdir("./root/" + path, os.ModePerm) } func (blefs *FS) Rename(old, new string) error { return os.Rename("./root/" + old, "./root/" + new) } func (blefs *FS) Remove(path string) error { return os.Remove("./root/" + path) } func (blefs *FS) Open(path string) (*File, error) { fp, _ := os.Open("./root/" + path) return &File{ fs : blefs, path : path, fp : fp, isReadOnly : true, isWriteOnly : false, }, nil } func (blefs *FS) Create(path string, size uint32) (*File, error) { fp, _ := os.Create("./root/" + path) return &File{ fs : blefs, path : path, fp : fp, isReadOnly : false, isWriteOnly : true, }, nil } func (fl *File) Read(b []byte) (n int, err error) { if fl.isWriteOnly { return 0, ErrFileWriteOnly } return fl.fp.Read(b) } func (fl *File) Write(b []byte) (n int, err error) { if fl.isReadOnly { return 0, ErrFileReadOnly } return fl.fp.Write(b) } func (fl *File) Close() error { return fl.fp.Close() }