First commit after moving files
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -30,3 +30,5 @@
|
|||||||
*.exe
|
*.exe
|
||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
Debug/*
|
||||||
|
|||||||
31
Makefile
Normal file
31
Makefile
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
CC := g++
|
||||||
|
INC := -I include -I include/wiringPi -I /usr/local/include
|
||||||
|
CFLAGS := -c --std=c++11 -Wall $(shell pkg-config --cflags --libs libmongocxx)
|
||||||
|
LIB := -L /usr/local/lib -lmongocxx -lbsoncxx
|
||||||
|
|
||||||
|
|
||||||
|
SRCDIR := src
|
||||||
|
SRCEXT := cpp
|
||||||
|
LIBDIR := lib
|
||||||
|
BUILDDIR := build
|
||||||
|
TARGETDIR := bin
|
||||||
|
TARGET := bin/POCpp
|
||||||
|
|
||||||
|
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
|
||||||
|
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
|
||||||
|
|
||||||
|
# Main target
|
||||||
|
$(TARGET): $(OBJECTS)
|
||||||
|
@mkdir -p $(TARGETDIR)
|
||||||
|
@echo " Linking..."
|
||||||
|
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)
|
||||||
|
|
||||||
|
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
|
||||||
|
@mkdir -p $(BUILDDIR)
|
||||||
|
@echo " Bulding..."
|
||||||
|
@echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo " Cleaning...";
|
||||||
|
@echo " $(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)
|
||||||
373
POCpp.xcodeproj/project.pbxproj
Normal file
373
POCpp.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 46;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
C568AED71F13E97F00524D66 /* libbson-1.0.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C568AED11F13E97F00524D66 /* libbson-1.0.0.dylib */; };
|
||||||
|
C568AED81F13E97F00524D66 /* libbsoncxx.3.1.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C568AED21F13E97F00524D66 /* libbsoncxx.3.1.1.dylib */; };
|
||||||
|
C568AED91F13E97F00524D66 /* libbsoncxx.3.1.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C568AED31F13E97F00524D66 /* libbsoncxx.3.1.1.dylib */; };
|
||||||
|
C568AEDA1F13E97F00524D66 /* libmongoc-1.0.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C568AED41F13E97F00524D66 /* libmongoc-1.0.0.dylib */; };
|
||||||
|
C568AEDB1F13E97F00524D66 /* libmongocxx.3.1.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C568AED51F13E97F00524D66 /* libmongocxx.3.1.1.dylib */; };
|
||||||
|
C568AEDC1F13E97F00524D66 /* libmongocxx.3.1.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C568AED61F13E97F00524D66 /* libmongocxx.3.1.1.dylib */; };
|
||||||
|
C568AEF61F13EA5000524D66 /* AnalogIn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEDE1F13EA5000524D66 /* AnalogIn.cpp */; };
|
||||||
|
C568AEF71F13EA5000524D66 /* Card.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEE01F13EA5000524D66 /* Card.cpp */; };
|
||||||
|
C568AEF81F13EA5000524D66 /* Database.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEE21F13EA5000524D66 /* Database.cpp */; };
|
||||||
|
C568AEF91F13EA5000524D66 /* DigitalIn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEE41F13EA5000524D66 /* DigitalIn.cpp */; };
|
||||||
|
C568AEFA1F13EA5000524D66 /* DigitalOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEE61F13EA5000524D66 /* DigitalOut.cpp */; };
|
||||||
|
C568AEFB1F13EA5000524D66 /* FluidShot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEE81F13EA5000524D66 /* FluidShot.cpp */; };
|
||||||
|
C568AEFC1F13EA5000524D66 /* LPPair.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEEA1F13EA5000524D66 /* LPPair.cpp */; };
|
||||||
|
C568AEFD1F13EA5000524D66 /* LPStatus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEEC1F13EA5000524D66 /* LPStatus.cpp */; };
|
||||||
|
C568AEFE1F13EA5000524D66 /* Measurement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEEE1F13EA5000524D66 /* Measurement.cpp */; };
|
||||||
|
C568AEFF1F13EA5000524D66 /* MuxSetup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEF01F13EA5000524D66 /* MuxSetup.cpp */; };
|
||||||
|
C568AF001F13EA5000524D66 /* Well.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEF21F13EA5000524D66 /* Well.cpp */; };
|
||||||
|
C568AF011F13EA5000524D66 /* WellTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C568AEF41F13EA5000524D66 /* WellTest.cpp */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
C568AEBE1F13D1F800524D66 /* CopyFiles */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = /usr/share/man/man1/;
|
||||||
|
dstSubfolderSpec = 0;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 1;
|
||||||
|
};
|
||||||
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
C568AEC01F13D1F800524D66 /* POCpp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = POCpp; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
C568AECA1F13D25200524D66 /* src */ = {isa = PBXFileReference; lastKnownFileType = folder; path = src; sourceTree = "<group>"; };
|
||||||
|
C568AECB1F13D28500524D66 /* bin */ = {isa = PBXFileReference; lastKnownFileType = folder; path = bin; sourceTree = "<group>"; };
|
||||||
|
C568AECC1F13D28500524D66 /* build */ = {isa = PBXFileReference; lastKnownFileType = folder; path = build; sourceTree = "<group>"; };
|
||||||
|
C568AECD1F13D28500524D66 /* include */ = {isa = PBXFileReference; lastKnownFileType = folder; path = include; sourceTree = "<group>"; };
|
||||||
|
C568AECE1F13D28500524D66 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
|
||||||
|
C568AED11F13E97F00524D66 /* libbson-1.0.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libbson-1.0.0.dylib"; path = "../../../../../usr/local/lib/libbson-1.0.0.dylib"; sourceTree = "<group>"; };
|
||||||
|
C568AED21F13E97F00524D66 /* libbsoncxx.3.1.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbsoncxx.3.1.1.dylib; path = ../../../../../usr/local/lib/libbsoncxx.3.1.1.dylib; sourceTree = "<group>"; };
|
||||||
|
C568AED31F13E97F00524D66 /* libbsoncxx.3.1.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbsoncxx.3.1.1.dylib; path = ../../../../../usr/local/lib/libbsoncxx.3.1.1.dylib; sourceTree = "<group>"; };
|
||||||
|
C568AED41F13E97F00524D66 /* libmongoc-1.0.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libmongoc-1.0.0.dylib"; path = "../../../../../usr/local/lib/libmongoc-1.0.0.dylib"; sourceTree = "<group>"; };
|
||||||
|
C568AED51F13E97F00524D66 /* libmongocxx.3.1.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libmongocxx.3.1.1.dylib; path = ../../../../../usr/local/lib/libmongocxx.3.1.1.dylib; sourceTree = "<group>"; };
|
||||||
|
C568AED61F13E97F00524D66 /* libmongocxx.3.1.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libmongocxx.3.1.1.dylib; path = ../../../../../usr/local/lib/libmongocxx.3.1.1.dylib; sourceTree = "<group>"; };
|
||||||
|
C568AEDE1F13EA5000524D66 /* AnalogIn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AnalogIn.cpp; path = src/AnalogIn.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEDF1F13EA5000524D66 /* AnalogIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnalogIn.h; path = src/AnalogIn.h; sourceTree = "<group>"; };
|
||||||
|
C568AEE01F13EA5000524D66 /* Card.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Card.cpp; path = src/Card.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEE11F13EA5000524D66 /* Card.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Card.h; path = src/Card.h; sourceTree = "<group>"; };
|
||||||
|
C568AEE21F13EA5000524D66 /* Database.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Database.cpp; path = src/Database.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEE31F13EA5000524D66 /* Database.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Database.h; path = src/Database.h; sourceTree = "<group>"; };
|
||||||
|
C568AEE41F13EA5000524D66 /* DigitalIn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DigitalIn.cpp; path = src/DigitalIn.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEE51F13EA5000524D66 /* DigitalIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DigitalIn.h; path = src/DigitalIn.h; sourceTree = "<group>"; };
|
||||||
|
C568AEE61F13EA5000524D66 /* DigitalOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DigitalOut.cpp; path = src/DigitalOut.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEE71F13EA5000524D66 /* DigitalOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DigitalOut.h; path = src/DigitalOut.h; sourceTree = "<group>"; };
|
||||||
|
C568AEE81F13EA5000524D66 /* FluidShot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FluidShot.cpp; path = src/FluidShot.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEE91F13EA5000524D66 /* FluidShot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FluidShot.h; path = src/FluidShot.h; sourceTree = "<group>"; };
|
||||||
|
C568AEEA1F13EA5000524D66 /* LPPair.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LPPair.cpp; path = src/LPPair.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEEB1F13EA5000524D66 /* LPPair.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LPPair.h; path = src/LPPair.h; sourceTree = "<group>"; };
|
||||||
|
C568AEEC1F13EA5000524D66 /* LPStatus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LPStatus.cpp; path = src/LPStatus.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEED1F13EA5000524D66 /* LPStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LPStatus.h; path = src/LPStatus.h; sourceTree = "<group>"; };
|
||||||
|
C568AEEE1F13EA5000524D66 /* Measurement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Measurement.cpp; path = src/Measurement.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEEF1F13EA5000524D66 /* Measurement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Measurement.h; path = src/Measurement.h; sourceTree = "<group>"; };
|
||||||
|
C568AEF01F13EA5000524D66 /* MuxSetup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MuxSetup.cpp; path = src/MuxSetup.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEF11F13EA5000524D66 /* MuxSetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MuxSetup.h; path = src/MuxSetup.h; sourceTree = "<group>"; };
|
||||||
|
C568AEF21F13EA5000524D66 /* Well.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Well.cpp; path = src/Well.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEF31F13EA5000524D66 /* Well.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Well.h; path = src/Well.h; sourceTree = "<group>"; };
|
||||||
|
C568AEF41F13EA5000524D66 /* WellTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WellTest.cpp; path = src/WellTest.cpp; sourceTree = "<group>"; };
|
||||||
|
C568AEF51F13EA5000524D66 /* WellTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WellTest.h; path = src/WellTest.h; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
C568AEBD1F13D1F800524D66 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C568AED71F13E97F00524D66 /* libbson-1.0.0.dylib in Frameworks */,
|
||||||
|
C568AED81F13E97F00524D66 /* libbsoncxx.3.1.1.dylib in Frameworks */,
|
||||||
|
C568AED91F13E97F00524D66 /* libbsoncxx.3.1.1.dylib in Frameworks */,
|
||||||
|
C568AEDA1F13E97F00524D66 /* libmongoc-1.0.0.dylib in Frameworks */,
|
||||||
|
C568AEDB1F13E97F00524D66 /* libmongocxx.3.1.1.dylib in Frameworks */,
|
||||||
|
C568AEDC1F13E97F00524D66 /* libmongocxx.3.1.1.dylib in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
C568AEB71F13D1F800524D66 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C568AECB1F13D28500524D66 /* bin */,
|
||||||
|
C568AECC1F13D28500524D66 /* build */,
|
||||||
|
C568AECD1F13D28500524D66 /* include */,
|
||||||
|
C568AECE1F13D28500524D66 /* Makefile */,
|
||||||
|
C568AEDD1F13EA2B00524D66 /* src */,
|
||||||
|
C568AEC11F13D1F800524D66 /* Products */,
|
||||||
|
C568AED01F13E97F00524D66 /* Frameworks */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
C568AEC11F13D1F800524D66 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C568AEC01F13D1F800524D66 /* POCpp */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
C568AED01F13E97F00524D66 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C568AED11F13E97F00524D66 /* libbson-1.0.0.dylib */,
|
||||||
|
C568AED21F13E97F00524D66 /* libbsoncxx.3.1.1.dylib */,
|
||||||
|
C568AED31F13E97F00524D66 /* libbsoncxx.3.1.1.dylib */,
|
||||||
|
C568AED41F13E97F00524D66 /* libmongoc-1.0.0.dylib */,
|
||||||
|
C568AED51F13E97F00524D66 /* libmongocxx.3.1.1.dylib */,
|
||||||
|
C568AED61F13E97F00524D66 /* libmongocxx.3.1.1.dylib */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
C568AEDD1F13EA2B00524D66 /* src */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C568AEDE1F13EA5000524D66 /* AnalogIn.cpp */,
|
||||||
|
C568AEDF1F13EA5000524D66 /* AnalogIn.h */,
|
||||||
|
C568AEE01F13EA5000524D66 /* Card.cpp */,
|
||||||
|
C568AEE11F13EA5000524D66 /* Card.h */,
|
||||||
|
C568AEE21F13EA5000524D66 /* Database.cpp */,
|
||||||
|
C568AEE31F13EA5000524D66 /* Database.h */,
|
||||||
|
C568AEE41F13EA5000524D66 /* DigitalIn.cpp */,
|
||||||
|
C568AEE51F13EA5000524D66 /* DigitalIn.h */,
|
||||||
|
C568AEE61F13EA5000524D66 /* DigitalOut.cpp */,
|
||||||
|
C568AEE71F13EA5000524D66 /* DigitalOut.h */,
|
||||||
|
C568AEE81F13EA5000524D66 /* FluidShot.cpp */,
|
||||||
|
C568AEE91F13EA5000524D66 /* FluidShot.h */,
|
||||||
|
C568AEEA1F13EA5000524D66 /* LPPair.cpp */,
|
||||||
|
C568AEEB1F13EA5000524D66 /* LPPair.h */,
|
||||||
|
C568AEEC1F13EA5000524D66 /* LPStatus.cpp */,
|
||||||
|
C568AEED1F13EA5000524D66 /* LPStatus.h */,
|
||||||
|
C568AEEE1F13EA5000524D66 /* Measurement.cpp */,
|
||||||
|
C568AEEF1F13EA5000524D66 /* Measurement.h */,
|
||||||
|
C568AEF01F13EA5000524D66 /* MuxSetup.cpp */,
|
||||||
|
C568AEF11F13EA5000524D66 /* MuxSetup.h */,
|
||||||
|
C568AEF21F13EA5000524D66 /* Well.cpp */,
|
||||||
|
C568AEF31F13EA5000524D66 /* Well.h */,
|
||||||
|
C568AEF41F13EA5000524D66 /* WellTest.cpp */,
|
||||||
|
C568AEF51F13EA5000524D66 /* WellTest.h */,
|
||||||
|
C568AECA1F13D25200524D66 /* src */,
|
||||||
|
);
|
||||||
|
name = src;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
C568AEBF1F13D1F800524D66 /* POCpp */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = C568AEC71F13D1F800524D66 /* Build configuration list for PBXNativeTarget "POCpp" */;
|
||||||
|
buildPhases = (
|
||||||
|
C568AEBC1F13D1F800524D66 /* Sources */,
|
||||||
|
C568AEBD1F13D1F800524D66 /* Frameworks */,
|
||||||
|
C568AEBE1F13D1F800524D66 /* CopyFiles */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = POCpp;
|
||||||
|
productName = POCpp;
|
||||||
|
productReference = C568AEC01F13D1F800524D66 /* POCpp */;
|
||||||
|
productType = "com.apple.product-type.tool";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
C568AEB81F13D1F800524D66 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 0830;
|
||||||
|
ORGANIZATIONNAME = "Henry Pump";
|
||||||
|
TargetAttributes = {
|
||||||
|
C568AEBF1F13D1F800524D66 = {
|
||||||
|
CreatedOnToolsVersion = 8.3.3;
|
||||||
|
DevelopmentTeam = JNP6SX52H9;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = C568AEBB1F13D1F800524D66 /* Build configuration list for PBXProject "POCpp" */;
|
||||||
|
compatibilityVersion = "Xcode 3.2";
|
||||||
|
developmentRegion = English;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
);
|
||||||
|
mainGroup = C568AEB71F13D1F800524D66;
|
||||||
|
productRefGroup = C568AEC11F13D1F800524D66 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
C568AEBF1F13D1F800524D66 /* POCpp */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
C568AEBC1F13D1F800524D66 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
C568AEF61F13EA5000524D66 /* AnalogIn.cpp in Sources */,
|
||||||
|
C568AEFE1F13EA5000524D66 /* Measurement.cpp in Sources */,
|
||||||
|
C568AEFF1F13EA5000524D66 /* MuxSetup.cpp in Sources */,
|
||||||
|
C568AEF81F13EA5000524D66 /* Database.cpp in Sources */,
|
||||||
|
C568AEFA1F13EA5000524D66 /* DigitalOut.cpp in Sources */,
|
||||||
|
C568AEF71F13EA5000524D66 /* Card.cpp in Sources */,
|
||||||
|
C568AEFB1F13EA5000524D66 /* FluidShot.cpp in Sources */,
|
||||||
|
C568AEFD1F13EA5000524D66 /* LPStatus.cpp in Sources */,
|
||||||
|
C568AEFC1F13EA5000524D66 /* LPPair.cpp in Sources */,
|
||||||
|
C568AF011F13EA5000524D66 /* WellTest.cpp in Sources */,
|
||||||
|
C568AEF91F13EA5000524D66 /* DigitalIn.cpp in Sources */,
|
||||||
|
C568AF001F13EA5000524D66 /* Well.cpp in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
C568AEC51F13D1F800524D66 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C568AEC61F13D1F800524D66 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
C568AEC81F13D1F800524D66 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
DEVELOPMENT_TEAM = JNP6SX52H9;
|
||||||
|
LIBRARY_SEARCH_PATHS = "/usr/local/lib/**";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
USER_HEADER_SEARCH_PATHS = "include/** /usr/local/include/libmongoc-1.0/** /usr/local/include/mongocxx/v_noabi/** /usr/local/include/bsoncxx/v_noabi/** /usr/local/include/libbson-1.0/** include/wiringPi ./include/** ./include/mraa/**";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C568AEC91F13D1F800524D66 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
DEVELOPMENT_TEAM = JNP6SX52H9;
|
||||||
|
LIBRARY_SEARCH_PATHS = "/usr/local/lib/**";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
USER_HEADER_SEARCH_PATHS = "include/** /usr/local/include/libmongoc-1.0/** /usr/local/include/mongocxx/v_noabi/** /usr/local/include/bsoncxx/v_noabi/** /usr/local/include/libbson-1.0/** include/wiringPi ./include/** ./include/mraa/**";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
C568AEBB1F13D1F800524D66 /* Build configuration list for PBXProject "POCpp" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
C568AEC51F13D1F800524D66 /* Debug */,
|
||||||
|
C568AEC61F13D1F800524D66 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
C568AEC71F13D1F800524D66 /* Build configuration list for PBXNativeTarget "POCpp" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
C568AEC81F13D1F800524D66 /* Debug */,
|
||||||
|
C568AEC91F13D1F800524D66 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = C568AEB81F13D1F800524D66 /* Project object */;
|
||||||
|
}
|
||||||
7
POCpp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
POCpp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:POCpp.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
BIN
POCpp.xcodeproj/project.xcworkspace/xcuserdata/patrickjmcd.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
BIN
POCpp.xcodeproj/project.xcworkspace/xcuserdata/patrickjmcd.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
Binary file not shown.
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Bucket
|
||||||
|
type = "1"
|
||||||
|
version = "2.0">
|
||||||
|
</Bucket>
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "0830"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C568AEBF1F13D1F800524D66"
|
||||||
|
BuildableName = "POCpp"
|
||||||
|
BlueprintName = "POCpp"
|
||||||
|
ReferencedContainer = "container:POCpp.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C568AEBF1F13D1F800524D66"
|
||||||
|
BuildableName = "POCpp"
|
||||||
|
BlueprintName = "POCpp"
|
||||||
|
ReferencedContainer = "container:POCpp.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C568AEBF1F13D1F800524D66"
|
||||||
|
BuildableName = "POCpp"
|
||||||
|
BlueprintName = "POCpp"
|
||||||
|
ReferencedContainer = "container:POCpp.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C568AEBF1F13D1F800524D66"
|
||||||
|
BuildableName = "POCpp"
|
||||||
|
BlueprintName = "POCpp"
|
||||||
|
ReferencedContainer = "container:POCpp.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>SchemeUserState</key>
|
||||||
|
<dict>
|
||||||
|
<key>POCpp.xcscheme</key>
|
||||||
|
<dict>
|
||||||
|
<key>orderHint</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>SuppressBuildableAutocreation</key>
|
||||||
|
<dict>
|
||||||
|
<key>C568AEBF1F13D1F800524D66</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
40
include/mraa.h
Normal file
40
include/mraa.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright © 2014 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mraa/pwm.h"
|
||||||
|
#include "mraa/aio.h"
|
||||||
|
#include "mraa/gpio.h"
|
||||||
|
#include "mraa/spi.h"
|
||||||
|
#include "mraa/i2c.h"
|
||||||
|
#include "mraa/uart.h"
|
||||||
|
#include "mraa/uart_ow.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
33
include/mraa.hpp
Normal file
33
include/mraa.hpp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "mraa/common.hpp"
|
||||||
|
#include "mraa/pwm.hpp"
|
||||||
|
#include "mraa/aio.hpp"
|
||||||
|
#include "mraa/gpio.hpp"
|
||||||
|
#include "mraa/i2c.hpp"
|
||||||
|
#include "mraa/spi.hpp"
|
||||||
|
#include "mraa/uart.hpp"
|
||||||
107
include/mraa/aio.h
Normal file
107
include/mraa/aio.h
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Author: Nandkishor Sonar
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief Analog input/output
|
||||||
|
*
|
||||||
|
* AIO is the anlog input & output interface to libmraa. It is used to read or
|
||||||
|
* set the voltage applied to an AIO pin.
|
||||||
|
*
|
||||||
|
* @snippet analogin_a0.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer definition to the internal struct _aio. This context refers
|
||||||
|
* to one single AIO pin on the board.
|
||||||
|
*/
|
||||||
|
typedef struct _aio* mraa_aio_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise an Analog input device, connected to the specified pin
|
||||||
|
*
|
||||||
|
* @param pin Channel number to read ADC inputs
|
||||||
|
* @returns aio context or NULL
|
||||||
|
*/
|
||||||
|
mraa_aio_context mraa_aio_init(unsigned int pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the input voltage. By default mraa will shift the raw value up or down
|
||||||
|
* to a 10 bit value.
|
||||||
|
*
|
||||||
|
* @param dev The AIO context
|
||||||
|
* @returns The current input voltage or -1 for error
|
||||||
|
*/
|
||||||
|
int mraa_aio_read(mraa_aio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the input voltage and return it as a normalized float (0.0f-1.0f).
|
||||||
|
*
|
||||||
|
* @param dev The AIO context
|
||||||
|
* @returns The current input voltage as a normalized float (0.0f-1.0f), error
|
||||||
|
* will be signaled by -1.0f
|
||||||
|
*/
|
||||||
|
float mraa_aio_read_float(mraa_aio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the analog input context, this will free the memory for the context
|
||||||
|
*
|
||||||
|
* @param dev The AIO context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_aio_close(mraa_aio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the bit value which mraa will shift the raw reading
|
||||||
|
* from the ADC to. I.e. 10bits
|
||||||
|
* @param dev the analog input context
|
||||||
|
* @param bits the bits the return from read should be i.e 10
|
||||||
|
*
|
||||||
|
* @return mraa result type
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_aio_set_bit(mraa_aio_context dev, int bits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the bit value mraa is shifting the analog read to.
|
||||||
|
* @param dev the analog input context
|
||||||
|
*
|
||||||
|
* @return bit value mraa is set return from the read function
|
||||||
|
*/
|
||||||
|
int mraa_aio_get_bit(mraa_aio_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
133
include/mraa/aio.hpp
Normal file
133
include/mraa/aio.hpp
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include "aio.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to Analog IO
|
||||||
|
*
|
||||||
|
* This file defines the aio interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet AioA0.cpp Interesting
|
||||||
|
*/
|
||||||
|
class Aio
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Aio Constructor, takes a pin number which will map directly to the
|
||||||
|
* board number
|
||||||
|
*
|
||||||
|
* @param pin channel number to read ADC inputs
|
||||||
|
*/
|
||||||
|
Aio(int pin)
|
||||||
|
{
|
||||||
|
m_aio = mraa_aio_init(pin);
|
||||||
|
if (m_aio == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid AIO pin specified - do you have an ADC?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Aio Constructor, takes a pointer to the AIO context and initialises
|
||||||
|
* the AIO class
|
||||||
|
*
|
||||||
|
* @param void * to an AIO context
|
||||||
|
*/
|
||||||
|
Aio(void* aio_context)
|
||||||
|
{
|
||||||
|
m_aio = (mraa_aio_context) aio_context;
|
||||||
|
if (m_aio == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid AIO context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Aio destructor
|
||||||
|
*/
|
||||||
|
~Aio()
|
||||||
|
{
|
||||||
|
mraa_aio_close(m_aio);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Read a value from the AIO pin. By default mraa will shift
|
||||||
|
* the raw value up or down to a 10 bit value.
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @returns The current input voltage. By default, a 10bit value
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
read()
|
||||||
|
{
|
||||||
|
int x = mraa_aio_read(m_aio);
|
||||||
|
if (x == -1) {
|
||||||
|
throw std::invalid_argument("Unknown error in Aio::read()");
|
||||||
|
}
|
||||||
|
return (unsigned int) x;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Read a value from the AIO pin and return it as a normalized float.
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @returns The current input voltage as a normalized float (0.0f-1.0f)
|
||||||
|
*/
|
||||||
|
float
|
||||||
|
readFloat()
|
||||||
|
{
|
||||||
|
float x = mraa_aio_read_float(m_aio);
|
||||||
|
if (x == -1.0f) {
|
||||||
|
throw std::invalid_argument("Unknown error in Aio::readFloat()");
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the bit value which mraa will shift the raw reading
|
||||||
|
* from the ADC to. I.e. 10bits
|
||||||
|
* @param bits the bits the return from read should be i.e 10
|
||||||
|
* @return mraa::Result type
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
setBit(int bits)
|
||||||
|
{
|
||||||
|
return (Result) mraa_aio_set_bit(m_aio, bits);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Gets the bit value mraa is shifting the analog read to.
|
||||||
|
*
|
||||||
|
* @return bit value mraa is set return from the read function
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
getBit()
|
||||||
|
{
|
||||||
|
return mraa_aio_get_bit(m_aio);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_aio_context m_aio;
|
||||||
|
};
|
||||||
|
}
|
||||||
311
include/mraa/common.h
Normal file
311
include/mraa/common.h
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Copyright © 2014 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#define MRAA_PLATFORM_NAME_MAX_SIZE 64
|
||||||
|
#define MRAA_PIN_NAME_SIZE 12
|
||||||
|
|
||||||
|
#define MRAA_SUB_PLATFORM_BIT_SHIFT 9
|
||||||
|
#define MRAA_SUB_PLATFORM_MASK (1<<MRAA_SUB_PLATFORM_BIT_SHIFT)
|
||||||
|
|
||||||
|
#define MRAA_MAIN_PLATFORM_OFFSET 0
|
||||||
|
#define MRAA_SUB_PLATFORM_OFFSET 1
|
||||||
|
|
||||||
|
/** Executes function func and returns its result in case of error
|
||||||
|
*/
|
||||||
|
#define MRAA_RETURN_FOR_ERROR(func) do { \
|
||||||
|
mraa_result_t res; \
|
||||||
|
res = func; \
|
||||||
|
if (res != MRAA_SUCCESS) \
|
||||||
|
return res;} while(0)
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* This file defines the basic shared values for libmraa
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA boolean type
|
||||||
|
* 1 For TRUE
|
||||||
|
*/
|
||||||
|
typedef unsigned int mraa_boolean_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise MRAA
|
||||||
|
*
|
||||||
|
* Detects running platform and attempts to use included pinmap, this is run on
|
||||||
|
* module/library init/load but is handy to rerun to check board initialised
|
||||||
|
* correctly. MRAA_SUCCESS inidicates correct initialisation.
|
||||||
|
*
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
#if (defined SWIGPYTHON) || (defined SWIG)
|
||||||
|
mraa_result_t mraa_init();
|
||||||
|
#else
|
||||||
|
// this sets a compiler attribute (supported by GCC & clang) to have mraa_init()
|
||||||
|
// be called as a constructor make sure your libc supports this! uclibc needs
|
||||||
|
// to be compiled with UCLIBC_CTOR_DTOR
|
||||||
|
mraa_result_t mraa_init() __attribute__((constructor));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* De-Initilise MRAA
|
||||||
|
*
|
||||||
|
* This is not a strict requirement but useful to test memory leaks and for
|
||||||
|
* people who like super clean code. If dynamically loading & unloading
|
||||||
|
* libmraa you need to call this before unloading the library.
|
||||||
|
*/
|
||||||
|
void mraa_deinit();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a pin is able to use the passed in mode.
|
||||||
|
*
|
||||||
|
* @param pin Physical Pin to be checked.
|
||||||
|
* @param mode the mode to be tested.
|
||||||
|
* @return boolean if the mode is supported, 0=false.
|
||||||
|
*/
|
||||||
|
mraa_boolean_t mraa_pin_mode_test(int pin, mraa_pinmodes_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check the board's bit size when reading the value
|
||||||
|
*
|
||||||
|
* @return raw bits being read from kernel module. zero if no ADC
|
||||||
|
*/
|
||||||
|
unsigned int mraa_adc_raw_bits();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check the specified board's bit size when reading the value
|
||||||
|
*
|
||||||
|
* @param specified platform offset; 0 for main platform, 1 foor sub platform
|
||||||
|
* @return raw bits being read from kernel module. zero if no ADC
|
||||||
|
*/
|
||||||
|
unsigned int mraa_get_platform_adc_raw_bits(uint8_t platform_offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return value that the raw value should be shifted to. Zero if no ADC
|
||||||
|
*
|
||||||
|
* @return return actual bit size the adc value should be understood as.
|
||||||
|
*/
|
||||||
|
unsigned int mraa_adc_supported_bits();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return value that the raw value should be shifted to. Zero if no ADC
|
||||||
|
*
|
||||||
|
* @param specified platform offset; 0 for main platform, 1 foor sub platform
|
||||||
|
* @return return actual bit size the adc value should be understood as.
|
||||||
|
*/
|
||||||
|
unsigned int mraa_get_platform_adc_supported_bits(int platform_offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the log level to use from 0-7 where 7 is very verbose. These are the
|
||||||
|
* syslog log levels, see syslog(3) for more information on the levels.
|
||||||
|
*
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_set_log_level(int level);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Platform's Name, If no platform detected return NULL
|
||||||
|
*
|
||||||
|
* @return platform name
|
||||||
|
*/
|
||||||
|
const char* mraa_get_platform_name();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the platform's versioning info, the information given depends per
|
||||||
|
* platform and can be NULL. platform_offset has to be given. Do not modify
|
||||||
|
* this pointer
|
||||||
|
*
|
||||||
|
* @param specified platform offset; 0 for main platform, 1 for sub platform
|
||||||
|
* @return platform's versioning string
|
||||||
|
*/
|
||||||
|
const char* mraa_get_platform_version(int platform_offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function attempts to set the mraa process to a given priority and the
|
||||||
|
* scheduler to SCHED_RR. Highest * priority is typically 99 and minimum is 0.
|
||||||
|
* This function * will set to MAX if * priority is > MAX. Function will return
|
||||||
|
* -1 on failure.
|
||||||
|
*
|
||||||
|
* @param priority Value from typically 0 to 99
|
||||||
|
* @return The priority value set
|
||||||
|
*/
|
||||||
|
int mraa_set_priority(const int priority);
|
||||||
|
|
||||||
|
/** Get the version string of mraa autogenerated from git tag
|
||||||
|
*
|
||||||
|
* The version returned may not be what is expected however it is a reliable
|
||||||
|
* number associated with the git tag closest to that version at build time
|
||||||
|
*
|
||||||
|
* @return version string from version.h
|
||||||
|
*/
|
||||||
|
const char* mraa_get_version();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a textual representation of the mraa_result_t
|
||||||
|
*
|
||||||
|
* @param result the result to print
|
||||||
|
*/
|
||||||
|
void mraa_result_print(mraa_result_t result);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get platform type, board must be initialised.
|
||||||
|
*
|
||||||
|
* @return mraa_platform_t Platform type enum
|
||||||
|
*/
|
||||||
|
mraa_platform_t mraa_get_platform_type();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get combined platform type, board must be initialised.
|
||||||
|
* The combined type is represented as
|
||||||
|
* (sub_platform_type << 8) | main_platform_type
|
||||||
|
*
|
||||||
|
* @return int combined platform type
|
||||||
|
*/
|
||||||
|
int mraa_get_platform_combined_type();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get platform pincount, board must be initialised.
|
||||||
|
*
|
||||||
|
* @return uint of physical pin count on the in-use platform
|
||||||
|
*/
|
||||||
|
unsigned int mraa_get_pin_count();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get platform usable I2C bus count, board must be initialised.
|
||||||
|
*
|
||||||
|
* @return number f usable I2C bus count on the current platform. Function will
|
||||||
|
* return -1 on failure
|
||||||
|
*/
|
||||||
|
int mraa_get_i2c_bus_count();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get I2C adapter number in sysfs.
|
||||||
|
*
|
||||||
|
* @param i2c_bus the logical I2C bus number
|
||||||
|
* @return I2C adapter number in sysfs. Function will return -1 on failure
|
||||||
|
*/
|
||||||
|
int mraa_get_i2c_bus_id(int i2c_bus);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get specified platform pincount, board must be initialised.
|
||||||
|
*
|
||||||
|
* @param specified platform offset; 0 for main platform, 1 foor sub platform
|
||||||
|
* @return uint of physical pin count on the in-use platform
|
||||||
|
*/
|
||||||
|
unsigned int mraa_get_platform_pin_count(uint8_t platform_offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get name of pin, board must be initialised.
|
||||||
|
*
|
||||||
|
* @param pin number
|
||||||
|
* @return char* of pin name
|
||||||
|
*/
|
||||||
|
char* mraa_get_pin_name(int pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get default i2c bus, board must be initialised.
|
||||||
|
*
|
||||||
|
* @return int default i2c bus index
|
||||||
|
*/
|
||||||
|
int mraa_get_default_i2c_bus(uint8_t platform_offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect presence of sub platform.
|
||||||
|
*
|
||||||
|
* @return mraa_boolean_t 1 if sub platform is present and initialized, 0 otherwise
|
||||||
|
*/
|
||||||
|
mraa_boolean_t mraa_has_sub_platform();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if pin or bus id includes sub platform mask.
|
||||||
|
*
|
||||||
|
* @param int pin or bus number
|
||||||
|
*
|
||||||
|
* @return mraa_boolean_t 1 if pin or bus is for sub platform, 0 otherwise
|
||||||
|
*/
|
||||||
|
mraa_boolean_t mraa_is_sub_platform_id(int pin_or_bus_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert pin or bus index to corresponding sub platform id.
|
||||||
|
*
|
||||||
|
* @param int pin or bus index
|
||||||
|
*
|
||||||
|
* @return int sub platform pin or bus number
|
||||||
|
*/
|
||||||
|
int mraa_get_sub_platform_id(int pin_or_bus_index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert pin or bus sub platform id to index.
|
||||||
|
*
|
||||||
|
* @param int sub platform pin or bus id
|
||||||
|
*
|
||||||
|
* @return int pin or bus index
|
||||||
|
*/
|
||||||
|
int mraa_get_sub_platform_index(int pin_or_bus_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add mraa subplatform
|
||||||
|
*
|
||||||
|
* @param subplatform type
|
||||||
|
* @param uart device subplatform is on
|
||||||
|
*
|
||||||
|
* @return mraa_result_t indicating success
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_add_subplatform(mraa_platform_t subplatformtype, const char* uart_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a mraa subplatform
|
||||||
|
*
|
||||||
|
* @param subplatform type
|
||||||
|
*
|
||||||
|
* @return mraa_result indicating success
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_remove_subplatform(mraa_platform_t subplatformtype);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create IO using a description in the format:
|
||||||
|
* [io]-[pin]
|
||||||
|
* [io]-[raw]-[pin]
|
||||||
|
* [io]-[raw]-[id]-[pin]
|
||||||
|
* [io]-[raw]-[path]
|
||||||
|
*
|
||||||
|
* @param IO description
|
||||||
|
*
|
||||||
|
* @return void* to IO context or NULL
|
||||||
|
*/
|
||||||
|
void* mraa_init_io(const char* desc);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
330
include/mraa/common.hpp
Normal file
330
include/mraa/common.hpp
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
/*
|
||||||
|
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace mraa namespace
|
||||||
|
*/
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief API to common functions of MRAA
|
||||||
|
*
|
||||||
|
* This file defines the interface for libmraa common functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise MRAA
|
||||||
|
*
|
||||||
|
* Detects running platform and attempts to use included pinmap, this is run on
|
||||||
|
* module/library init/load but is handy to rerun to check board initialised
|
||||||
|
* correctly. mraa::SUCCESS inidicates correct initialisation.
|
||||||
|
*
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
inline Result
|
||||||
|
init()
|
||||||
|
{
|
||||||
|
return (Result) mraa_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get libmraa version.
|
||||||
|
*
|
||||||
|
* @return libmraa version (e.g. v0.4.0-20-gb408207)
|
||||||
|
*/
|
||||||
|
inline std::string
|
||||||
|
getVersion()
|
||||||
|
{
|
||||||
|
std::string ret = mraa_get_version();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function attempts to set the mraa process to a given priority and the
|
||||||
|
* scheduler to SCHED_RR. Highest * priority is typically 99 and minimum is 0.
|
||||||
|
* This function * will set to MAX if * priority is > MAX. Function will return
|
||||||
|
* -1 on failure.
|
||||||
|
*
|
||||||
|
* @param priority Value from typically 0 to 99
|
||||||
|
* @return The priority value set
|
||||||
|
*/
|
||||||
|
inline int
|
||||||
|
setPriority(const int priority)
|
||||||
|
{
|
||||||
|
return mraa_set_priority(priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get platform type, board must be initialised.
|
||||||
|
*
|
||||||
|
* @return mraa::platform Platform type enum
|
||||||
|
*/
|
||||||
|
inline Platform
|
||||||
|
getPlatformType()
|
||||||
|
{
|
||||||
|
return (Platform) mraa_get_platform_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a textual representation of the mraa::Result
|
||||||
|
*
|
||||||
|
* @param Result the Result to print
|
||||||
|
*/
|
||||||
|
inline void
|
||||||
|
printError(Result result)
|
||||||
|
{
|
||||||
|
mraa_result_print((mraa_result_t) result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a pin is able to use the passed in mode.
|
||||||
|
*
|
||||||
|
* @param pin Physical Pin to be checked.
|
||||||
|
* @param mode the mode to be tested.
|
||||||
|
* @return boolean if the mode is supported, 0=false.
|
||||||
|
*/
|
||||||
|
inline bool
|
||||||
|
pinModeTest(int pin, Pinmodes mode)
|
||||||
|
{
|
||||||
|
return (bool) mraa_pin_mode_test(pin, (mraa_pinmodes_t) mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check the board's bit size when reading the value
|
||||||
|
*
|
||||||
|
* @return raw bits being read from kernel module. Zero if no ADC
|
||||||
|
*/
|
||||||
|
inline unsigned int
|
||||||
|
adcRawBits()
|
||||||
|
{
|
||||||
|
return mraa_adc_raw_bits();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return value that the raw value should be shifted to. Zero if no ADC
|
||||||
|
*
|
||||||
|
* @return return actual bit size the adc value should be understood as.
|
||||||
|
*/
|
||||||
|
inline unsigned int
|
||||||
|
adcSupportedBits()
|
||||||
|
{
|
||||||
|
return mraa_adc_supported_bits();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return Platform Name. Returns NULL if no platform inited.
|
||||||
|
*
|
||||||
|
* @return platform name
|
||||||
|
*/
|
||||||
|
inline std::string
|
||||||
|
getPlatformName()
|
||||||
|
{
|
||||||
|
std::string ret_val(mraa_get_platform_name());
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return platform versioning info. Returns NULL if no info present.
|
||||||
|
*
|
||||||
|
* @param optional subplatform identifier
|
||||||
|
* @return platform versioning info
|
||||||
|
*/
|
||||||
|
inline std::string
|
||||||
|
getPlatformVersion(int platform_offset=MRAA_MAIN_PLATFORM_OFFSET)
|
||||||
|
{
|
||||||
|
std::string ret_val(mraa_get_platform_version(platform_offset));
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return count of physical pins on the running platform
|
||||||
|
*
|
||||||
|
* @return uint of physical pins.
|
||||||
|
*/
|
||||||
|
inline unsigned int
|
||||||
|
getPinCount()
|
||||||
|
{
|
||||||
|
return mraa_get_pin_count();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get platform usable I2C bus count, board must be initialised.
|
||||||
|
*
|
||||||
|
* @return number f usable I2C bus count on the current platform. Function will
|
||||||
|
* return -1 on failure
|
||||||
|
*/
|
||||||
|
inline int
|
||||||
|
getI2cBusCount()
|
||||||
|
{
|
||||||
|
return mraa_get_i2c_bus_count();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get I2C adapter number in sysfs.
|
||||||
|
*
|
||||||
|
* @param i2c_bus the logical I2C bus number
|
||||||
|
* @return I2C adapter number in sysfs. Function will return -1 on failure
|
||||||
|
*/
|
||||||
|
inline int
|
||||||
|
getI2cBusId(int i2c_bus)
|
||||||
|
{
|
||||||
|
return mraa_get_i2c_bus_id(i2c_bus);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get name of pin, board must be initialised.
|
||||||
|
*
|
||||||
|
* @param pin number
|
||||||
|
*
|
||||||
|
* @return char* of pin name
|
||||||
|
*/
|
||||||
|
inline std::string
|
||||||
|
getPinName(int pin)
|
||||||
|
{
|
||||||
|
std::string ret_val(mraa_get_pin_name(pin));
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the log level to use from 0-7 where 7 is very verbose. These are the
|
||||||
|
* syslog log levels, see syslog(3) for more information on the levels.
|
||||||
|
*
|
||||||
|
* @param level
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
inline Result
|
||||||
|
setLogLevel(int level)
|
||||||
|
{
|
||||||
|
return (Result) mraa_set_log_level(level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect presence of sub platform.
|
||||||
|
*
|
||||||
|
* @return bool true if sub platform is present and initialized, false otherwise
|
||||||
|
*/
|
||||||
|
inline bool
|
||||||
|
hasSubPlatform()
|
||||||
|
{
|
||||||
|
return static_cast<bool>(mraa_has_sub_platform());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if pin or bus id includes sub platform mask.
|
||||||
|
*
|
||||||
|
* @param int pin or bus number
|
||||||
|
*
|
||||||
|
* @return mraa_boolean_t 1 if pin or bus is for sub platform, 0 otherwise
|
||||||
|
*/
|
||||||
|
inline bool
|
||||||
|
isSubPlatformId(int pin_or_bus_id)
|
||||||
|
{
|
||||||
|
return static_cast<bool>(mraa_is_sub_platform_id(pin_or_bus_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert pin or bus index to corresponding sub platform id.
|
||||||
|
*
|
||||||
|
* @param int pin or bus index
|
||||||
|
*
|
||||||
|
* @return int sub platform pin or bus number
|
||||||
|
*/
|
||||||
|
inline int
|
||||||
|
getSubPlatformId(int pin_or_bus_index)
|
||||||
|
{
|
||||||
|
return mraa_get_sub_platform_id(pin_or_bus_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert pin or bus sub platform id to index.
|
||||||
|
*
|
||||||
|
* @param int sub platform pin or bus id
|
||||||
|
*
|
||||||
|
* @return int pin or bus index
|
||||||
|
*/
|
||||||
|
inline int
|
||||||
|
getSubPlatformIndex(int pin_or_bus_id)
|
||||||
|
{
|
||||||
|
return mraa_get_sub_platform_index(pin_or_bus_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get default i2c bus, board must be initialised.
|
||||||
|
*
|
||||||
|
* @param optional subplatform identifier
|
||||||
|
* @return default i2c bus for paltform
|
||||||
|
*/
|
||||||
|
inline int
|
||||||
|
getDefaultI2cBus(int platform_offset=MRAA_MAIN_PLATFORM_OFFSET)
|
||||||
|
{
|
||||||
|
return mraa_get_default_i2c_bus(platform_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add mraa subplatform
|
||||||
|
*
|
||||||
|
* @param subplatformtype the type of subplatform to add
|
||||||
|
* (e.g. MRAA_GENERIC_FIRMATA)
|
||||||
|
* @param uart_dev subplatform device string (e.g. "/dev/ttyACM0")
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
inline Result
|
||||||
|
addSubplatform(Platform subplatformtype, std::string uart_dev)
|
||||||
|
{
|
||||||
|
return (Result) mraa_add_subplatform((mraa_platform_t) subplatformtype, uart_dev.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Result
|
||||||
|
removeSubplatform(Platform subplatformtype)
|
||||||
|
{
|
||||||
|
return (Result) mraa_remove_subplatform((mraa_platform_t) subplatformtype);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create IO using a description in the format:
|
||||||
|
* [io]-[pin]
|
||||||
|
* [io]-[raw]-[pin]
|
||||||
|
* [io]-[raw]-[id]-[pin]
|
||||||
|
* [io]-[raw]-[path]
|
||||||
|
*
|
||||||
|
* @param IO description
|
||||||
|
*
|
||||||
|
* @return class T initialised using pointer to IO or NULL
|
||||||
|
*/
|
||||||
|
template <class T>
|
||||||
|
inline T*
|
||||||
|
initIo(std::string desc)
|
||||||
|
{
|
||||||
|
return new T(mraa_init_io(desc.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
101
include/mraa/firmata.h
Normal file
101
include/mraa/firmata.h
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2016 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief Firmata IO
|
||||||
|
*
|
||||||
|
* Firmata IO lets you SYSEX messages construct and ask for a callback on a
|
||||||
|
* SYSEX messages. This is meant to provide a way to call custom firmata APIs
|
||||||
|
* especially using the Custom firmata API
|
||||||
|
*
|
||||||
|
* @snippet firmata_curie_imu.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer definition to the internal struct _firmata. This context
|
||||||
|
* refers to one firmata 'extension' letting you write/return SYSEX messages
|
||||||
|
* directly
|
||||||
|
*/
|
||||||
|
typedef struct _firmata* mraa_firmata_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise firmata context on a feature. This feature is what will be
|
||||||
|
* listened on if you request a response callback
|
||||||
|
*
|
||||||
|
* @param firmata feature
|
||||||
|
* @return firmata context or NULL
|
||||||
|
*/
|
||||||
|
mraa_firmata_context mraa_firmata_init(int feature);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a custom SYSEX message to the firmata board.
|
||||||
|
*
|
||||||
|
* @param dev The Firmata context
|
||||||
|
* @param msg The SYSEX message
|
||||||
|
* @param length The length of the sysex message
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_firmata_write_sysex(mraa_firmata_context dev, char* msg, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a callback on 'feature'. This function is not thread safe and threads
|
||||||
|
* calling it need to make sure they are the only thread calling this.
|
||||||
|
*
|
||||||
|
* @param dev The Firmata context
|
||||||
|
* @param fptr Function pointer to function to be called when interrupt is
|
||||||
|
* triggered, the returned buffer and length are the arguments.
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_firmata_response(mraa_firmata_context dev, void (*fptr)(uint8_t*, int));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop getting events on feature. This is more efficient than mraa_firmata_close
|
||||||
|
* as it can be re-enabled without adding a feature
|
||||||
|
*
|
||||||
|
* @param dev The Firmata context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_firmata_response_stop(mraa_firmata_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free all firmata handle resources, this will leave an element in an array
|
||||||
|
* internally that will be skipped, avoid closing many firmata contexts often
|
||||||
|
* as there is a cost to doing this
|
||||||
|
*
|
||||||
|
* @param dev The Firmata context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_firmata_close(mraa_firmata_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
225
include/mraa/gpio.h
Normal file
225
include/mraa/gpio.h
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
/*
|
||||||
|
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief General Purpose IO
|
||||||
|
*
|
||||||
|
* Gpio is the General Purpose IO interface to libmraa. Its features depend on
|
||||||
|
* the board type used, it can use gpiolibs (exported via a kernel module
|
||||||
|
* through sysfs), or memory mapped IO via a /dev/uio device or /dev/mem
|
||||||
|
* depending again on the board configuration.
|
||||||
|
*
|
||||||
|
* @snippet gpio_read6.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#if defined(SWIGJAVA) || defined(JAVACALLBACK)
|
||||||
|
#include <jni.h>
|
||||||
|
extern "C" {
|
||||||
|
void mraa_java_isr_callback(void *args);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer definition to the internal struct _gpio
|
||||||
|
*/
|
||||||
|
typedef struct _gpio* mraa_gpio_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gpio Output modes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_GPIO_STRONG = 0, /**< Default. Strong high and low */
|
||||||
|
MRAA_GPIO_PULLUP = 1, /**< Resistive High */
|
||||||
|
MRAA_GPIO_PULLDOWN = 2, /**< Resistive Low */
|
||||||
|
MRAA_GPIO_HIZ = 3 /**< High Z State */
|
||||||
|
} mraa_gpio_mode_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gpio Direction options
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_GPIO_OUT = 0, /**< Output. A Mode can also be set */
|
||||||
|
MRAA_GPIO_IN = 1, /**< Input */
|
||||||
|
MRAA_GPIO_OUT_HIGH = 2, /**< Output. Init High */
|
||||||
|
MRAA_GPIO_OUT_LOW = 3 /**< Output. Init Low */
|
||||||
|
} mraa_gpio_dir_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gpio Edge types for interrupts
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_GPIO_EDGE_NONE = 0, /**< No interrupt on Gpio */
|
||||||
|
MRAA_GPIO_EDGE_BOTH = 1, /**< Interrupt on rising & falling */
|
||||||
|
MRAA_GPIO_EDGE_RISING = 2, /**< Interrupt on rising only */
|
||||||
|
MRAA_GPIO_EDGE_FALLING = 3 /**< Interrupt on falling only */
|
||||||
|
} mraa_gpio_edge_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise gpio_context, based on board number
|
||||||
|
*
|
||||||
|
* @param pin Pin number read from the board, i.e IO3 is 3
|
||||||
|
* @returns gpio context or NULL
|
||||||
|
*/
|
||||||
|
mraa_gpio_context mraa_gpio_init(int pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise gpio context without any mapping to a pin
|
||||||
|
*
|
||||||
|
* @param gpiopin gpio pin as listed in SYSFS
|
||||||
|
* @return gpio context or NULL
|
||||||
|
*/
|
||||||
|
mraa_gpio_context mraa_gpio_init_raw(int gpiopin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the edge mode on the gpio
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param mode The edge mode to set the gpio into
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_edge_mode(mraa_gpio_context dev, mraa_gpio_edge_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an interrupt on pin
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param edge The edge mode to set the gpio into
|
||||||
|
* @param fptr Function pointer to function to be called when interrupt is
|
||||||
|
* triggered
|
||||||
|
* @param args Arguments passed to the interrupt handler (fptr)
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_isr(mraa_gpio_context dev, mraa_gpio_edge_t edge, void (*fptr)(void*), void* args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the current interrupt watcher on this Gpio, and set the Gpio edge mode
|
||||||
|
* to MRAA_GPIO_EDGE_NONE
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_isr_exit(mraa_gpio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Gpio Output Mode,
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param mode The Gpio Output Mode
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Gpio direction
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param dir The direction of the Gpio
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read Gpio direction
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param dir The address where to store the Gpio direction
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_read_dir(mraa_gpio_context dev, mraa_gpio_dir_t *dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the Gpio context
|
||||||
|
* - Will free the memory for the context and unexport the Gpio
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_close(mraa_gpio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the Gpio value. This can be 0 or 1. A resonse of -1 means that there
|
||||||
|
* was a fatal error.
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
int mraa_gpio_read(mraa_gpio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write to the Gpio Value.
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param value Integer value to write
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_write(mraa_gpio_context dev, int value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change ownership of the context.
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param owner Does this context own the pin
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_owner(mraa_gpio_context dev, mraa_boolean_t owner);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable using memory mapped io instead of sysfs
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @param mmap Use mmap instead of sysfs
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_gpio_use_mmaped(mraa_gpio_context dev, mraa_boolean_t mmap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a pin number of the gpio, invalid will return -1
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @return Pin number
|
||||||
|
*/
|
||||||
|
int mraa_gpio_get_pin(mraa_gpio_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a gpio number as used within sysfs, invalid will return -1
|
||||||
|
*
|
||||||
|
* @param dev The Gpio context
|
||||||
|
* @return gpio number
|
||||||
|
*/
|
||||||
|
int mraa_gpio_get_pin_raw(mraa_gpio_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
325
include/mraa/gpio.hpp
Normal file
325
include/mraa/gpio.hpp
Normal file
@@ -0,0 +1,325 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#if defined(SWIGJAVASCRIPT)
|
||||||
|
#if NODE_MODULE_VERSION >= 0x000D
|
||||||
|
#include <uv.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
// These enums must match the enums in gpio.h
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gpio Output modes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MODE_STRONG = 0, /**< Default. Strong High and Low */
|
||||||
|
MODE_PULLUP = 1, /**< Resistive High */
|
||||||
|
MODE_PULLDOWN = 2, /**< Resistive Low */
|
||||||
|
MODE_HIZ = 3 /**< High Z State */
|
||||||
|
} Mode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gpio Direction options
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
DIR_OUT = 0, /**< Output. A Mode can also be set */
|
||||||
|
DIR_IN = 1, /**< Input */
|
||||||
|
DIR_OUT_HIGH = 2, /**< Output. Init High */
|
||||||
|
DIR_OUT_LOW = 3 /**< Output. Init Low */
|
||||||
|
} Dir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gpio Edge types for interrupts
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
EDGE_NONE = 0, /**< No interrupt on Gpio */
|
||||||
|
EDGE_BOTH = 1, /**< Interrupt on rising & falling */
|
||||||
|
EDGE_RISING = 2, /**< Interrupt on rising only */
|
||||||
|
EDGE_FALLING = 3 /**< Interrupt on falling only */
|
||||||
|
} Edge;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to General Purpose IO
|
||||||
|
*
|
||||||
|
* This file defines the gpio interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet Blink-IO.cpp Interesting
|
||||||
|
*/
|
||||||
|
class Gpio
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Instantiates a Gpio object
|
||||||
|
*
|
||||||
|
* @param pin pin number to use
|
||||||
|
* @param owner (optional) Set pin owner, default behaviour is to 'own'
|
||||||
|
* the pin if we exported it. This means we will close it on destruct.
|
||||||
|
* Otherwise it will get left open. This is only valid in sysfs use
|
||||||
|
* cases
|
||||||
|
* @param raw (optional) Raw pins will use gpiolibs pin numbering from
|
||||||
|
* the kernel module. Note that you will not get any muxers set up for
|
||||||
|
* you so this may not always work as expected.
|
||||||
|
*/
|
||||||
|
Gpio(int pin, bool owner = true, bool raw = false)
|
||||||
|
{
|
||||||
|
if (raw) {
|
||||||
|
m_gpio = mraa_gpio_init_raw(pin);
|
||||||
|
} else {
|
||||||
|
m_gpio = mraa_gpio_init(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_gpio == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid GPIO pin specified");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!owner) {
|
||||||
|
mraa_gpio_owner(m_gpio, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Gpio Constructor, takes a pointer to the GPIO context and initialises
|
||||||
|
* the GPIO class
|
||||||
|
*
|
||||||
|
* @param void * to GPIO context
|
||||||
|
*/
|
||||||
|
Gpio(void* gpio_context)
|
||||||
|
{
|
||||||
|
m_gpio = (mraa_gpio_context) gpio_context;
|
||||||
|
if (m_gpio == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid GPIO context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Gpio object destructor, this will only unexport the gpio if we where
|
||||||
|
* the owner
|
||||||
|
*/
|
||||||
|
~Gpio()
|
||||||
|
{
|
||||||
|
mraa_gpio_close(m_gpio);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the edge mode for ISR
|
||||||
|
*
|
||||||
|
* @param mode The edge mode to set
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
edge(Edge mode)
|
||||||
|
{
|
||||||
|
return (Result) mraa_gpio_edge_mode(m_gpio, (mraa_gpio_edge_t) mode);
|
||||||
|
}
|
||||||
|
#if defined(SWIGPYTHON)
|
||||||
|
Result
|
||||||
|
isr(Edge mode, PyObject* pyfunc, PyObject* args)
|
||||||
|
{
|
||||||
|
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, (void (*) (void*)) pyfunc, (void*) args);
|
||||||
|
}
|
||||||
|
#elif defined(SWIGJAVASCRIPT)
|
||||||
|
static void
|
||||||
|
v8isr(uv_work_t* req, int status)
|
||||||
|
{
|
||||||
|
#if NODE_MODULE_VERSION >= 0x000D
|
||||||
|
v8::HandleScope scope(v8::Isolate::GetCurrent());
|
||||||
|
#endif
|
||||||
|
mraa::Gpio* This = (mraa::Gpio*) req->data;
|
||||||
|
int argc = 1;
|
||||||
|
v8::Local<v8::Value> argv[] = { SWIGV8_INTEGER_NEW(-1) };
|
||||||
|
#if NODE_MODULE_VERSION >= 0x000D
|
||||||
|
v8::Local<v8::Function> f = v8::Local<v8::Function>::New(v8::Isolate::GetCurrent(), This->m_v8isr);
|
||||||
|
f->Call(SWIGV8_CURRENT_CONTEXT()->Global(), argc, argv);
|
||||||
|
#else
|
||||||
|
This->m_v8isr->Call(SWIGV8_CURRENT_CONTEXT()->Global(), argc, argv);
|
||||||
|
#endif
|
||||||
|
delete req;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nop(uv_work_t* req)
|
||||||
|
{
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
uvwork(void* ctx)
|
||||||
|
{
|
||||||
|
uv_work_t* req = new uv_work_t;
|
||||||
|
req->data = ctx;
|
||||||
|
uv_queue_work(uv_default_loop(), req, nop, v8isr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result
|
||||||
|
isr(Edge mode, v8::Handle<v8::Function> func)
|
||||||
|
{
|
||||||
|
#if NODE_MODULE_VERSION >= 0x000D
|
||||||
|
m_v8isr.Reset(v8::Isolate::GetCurrent(), func);
|
||||||
|
#else
|
||||||
|
m_v8isr = v8::Persistent<v8::Function>::New(func);
|
||||||
|
#endif
|
||||||
|
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, &uvwork, this);
|
||||||
|
}
|
||||||
|
#elif defined(SWIGJAVA) || defined(JAVACALLBACK)
|
||||||
|
Result
|
||||||
|
isr(Edge mode, jobject runnable)
|
||||||
|
{
|
||||||
|
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, mraa_java_isr_callback, runnable);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* Sets a callback to be called when pin value changes
|
||||||
|
*
|
||||||
|
* @param mode The edge mode to set
|
||||||
|
* @param fptr Function pointer to function to be called when interrupt is
|
||||||
|
* triggered
|
||||||
|
* @param args Arguments passed to the interrupt handler (fptr)
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
isr(Edge mode, void (*fptr)(void*), void* args)
|
||||||
|
{
|
||||||
|
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, fptr, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exits callback - this call will not kill the isr thread immediately
|
||||||
|
* but only when it is out of it's critical section
|
||||||
|
*
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
isrExit()
|
||||||
|
{
|
||||||
|
#if defined(SWIGJAVASCRIPT)
|
||||||
|
#if NODE_MODULE_VERSION >= 0x000D
|
||||||
|
m_v8isr.Reset();
|
||||||
|
#else
|
||||||
|
m_v8isr.Dispose();
|
||||||
|
m_v8isr.Clear();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
return (Result) mraa_gpio_isr_exit(m_gpio);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Change Gpio mode
|
||||||
|
*
|
||||||
|
* @param mode The mode to change the gpio into
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
mode(Mode mode)
|
||||||
|
{
|
||||||
|
return (Result )mraa_gpio_mode(m_gpio, (mraa_gpio_mode_t) mode);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Change Gpio direction
|
||||||
|
*
|
||||||
|
* @param dir The direction to change the gpio into
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
dir(Dir dir)
|
||||||
|
{
|
||||||
|
return (Result )mraa_gpio_dir(m_gpio, (mraa_gpio_dir_t) dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read Gpio direction
|
||||||
|
*
|
||||||
|
* @throw std::runtime_error in case of failure
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Dir
|
||||||
|
readDir()
|
||||||
|
{
|
||||||
|
mraa_gpio_dir_t dir;
|
||||||
|
if (mraa_gpio_read_dir(m_gpio, &dir) != MRAA_SUCCESS) {
|
||||||
|
throw std::runtime_error("Failed to read direction");
|
||||||
|
}
|
||||||
|
return (Dir) dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read value from Gpio
|
||||||
|
*
|
||||||
|
* @return Gpio value
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
read()
|
||||||
|
{
|
||||||
|
return mraa_gpio_read(m_gpio);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Write value to Gpio
|
||||||
|
*
|
||||||
|
* @param value Value to write to Gpio
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
write(int value)
|
||||||
|
{
|
||||||
|
return (Result) mraa_gpio_write(m_gpio, value);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Enable use of mmap i/o if available.
|
||||||
|
*
|
||||||
|
* @param enable true to use mmap
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
useMmap(bool enable)
|
||||||
|
{
|
||||||
|
return (Result) mraa_gpio_use_mmaped(m_gpio, (mraa_boolean_t) enable);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get pin number of Gpio. If raw param is True will return the
|
||||||
|
* number as used within sysfs. Invalid will return -1.
|
||||||
|
*
|
||||||
|
* @param raw (optional) get the raw gpio number.
|
||||||
|
* @return Pin number
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
getPin(bool raw = false)
|
||||||
|
{
|
||||||
|
if (raw) {
|
||||||
|
return mraa_gpio_get_pin_raw(m_gpio);
|
||||||
|
}
|
||||||
|
return mraa_gpio_get_pin(m_gpio);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_gpio_context m_gpio;
|
||||||
|
#if defined(SWIGJAVASCRIPT)
|
||||||
|
v8::Persistent<v8::Function> m_v8isr;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
}
|
||||||
186
include/mraa/i2c.h
Normal file
186
include/mraa/i2c.h
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief Inter-Integrated Circuit
|
||||||
|
*
|
||||||
|
* An i2c context represents a master on an i2c bus and that context can
|
||||||
|
* communicate to multiple i2c slaves by configuring the address.
|
||||||
|
* @htmlinclude i2c.txt
|
||||||
|
*
|
||||||
|
* @snippet i2c_HMC5883L.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer definition to the internal struct _i2c
|
||||||
|
*/
|
||||||
|
typedef struct _i2c* mraa_i2c_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise i2c context, using board defintions
|
||||||
|
*
|
||||||
|
* @param bus i2c bus to use
|
||||||
|
* @return i2c context or NULL
|
||||||
|
*/
|
||||||
|
mraa_i2c_context mraa_i2c_init(int bus);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise i2c context, passing in the i2c bus to use.
|
||||||
|
*
|
||||||
|
* @param bus The i2c bus to use i.e. /dev/i2c-2 would be "2"
|
||||||
|
* @return i2c context or NULL
|
||||||
|
*/
|
||||||
|
mraa_i2c_context mraa_i2c_init_raw(unsigned int bus);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the frequency of the i2c context. Most platforms do not support this.
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param mode The bus mode
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_frequency(mraa_i2c_context dev, mraa_i2c_mode_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple bulk read from an i2c context
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param data pointer to the byte array to read data in to
|
||||||
|
* @param length max number of bytes to read
|
||||||
|
* @return length of the read in bytes or -1
|
||||||
|
*/
|
||||||
|
int mraa_i2c_read(mraa_i2c_context dev, uint8_t* data, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple read for a single byte from the i2c context
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @return The result of the read or -1 if failed
|
||||||
|
*/
|
||||||
|
int mraa_i2c_read_byte(mraa_i2c_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a single byte from i2c context, from designated register
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param command The register
|
||||||
|
* @return The result of the read or -1 if failed
|
||||||
|
*/
|
||||||
|
int mraa_i2c_read_byte_data(mraa_i2c_context dev, const uint8_t command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a single word from i2c context, from designated register
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param command The register
|
||||||
|
* @return The result of the read or -1 if failed
|
||||||
|
*/
|
||||||
|
int mraa_i2c_read_word_data(mraa_i2c_context dev, const uint8_t command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bulk read from i2c context, starting from designated register
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param command The register
|
||||||
|
* @param data pointer to the byte array to read data in to
|
||||||
|
* @param length max number of bytes to read
|
||||||
|
* @return The length in bytes passed to the function or -1
|
||||||
|
*/
|
||||||
|
int mraa_i2c_read_bytes_data(mraa_i2c_context dev, uint8_t command, uint8_t* data, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write length bytes to the bus, the first byte in the array is the
|
||||||
|
* command/register to write
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param data pointer to the byte array to be written
|
||||||
|
* @param length the number of bytes to transmit
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_write(mraa_i2c_context dev, const uint8_t* data, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a single byte to an i2c context
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param data The byte to write
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_write_byte(mraa_i2c_context dev, const uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a single byte to an i2c context
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param data The byte to write
|
||||||
|
* @param command The register
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_write_byte_data(mraa_i2c_context dev, const uint8_t data, const uint8_t command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a single word to an i2c context
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param data The word to write
|
||||||
|
* @param command The register
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_write_word_data(mraa_i2c_context dev, const uint16_t data, const uint8_t command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the i2c slave address.
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @param address The address to set for the slave (7-bit address)
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_address(mraa_i2c_context dev, uint8_t address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* De-inits an mraa_i2c_context device
|
||||||
|
*
|
||||||
|
* @param dev The i2c context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_i2c_stop(mraa_i2c_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
250
include/mraa/i2c.hpp
Normal file
250
include/mraa/i2c.hpp
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "i2c.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to Inter-Integrated Circuit
|
||||||
|
*
|
||||||
|
* An I2c object represents an i2c master and can talk multiple i2c slaves by
|
||||||
|
* selecting the correct address
|
||||||
|
* @htmlinclude i2c.txt
|
||||||
|
*
|
||||||
|
* @snippet I2c-compass.cpp Interesting
|
||||||
|
*/
|
||||||
|
class I2c
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Instantiates an i2c bus. Multiple instances of the same bus can
|
||||||
|
* exist and the bus is not guarranteed to be on the correct address
|
||||||
|
* before read/write.
|
||||||
|
*
|
||||||
|
* @param bus The i2c bus to use
|
||||||
|
* @param raw Whether to disable pinmapper for your board
|
||||||
|
*/
|
||||||
|
I2c(int bus, bool raw = false)
|
||||||
|
{
|
||||||
|
if (raw) {
|
||||||
|
m_i2c = mraa_i2c_init_raw(bus);
|
||||||
|
} else {
|
||||||
|
m_i2c = mraa_i2c_init(bus);
|
||||||
|
}
|
||||||
|
if (m_i2c == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid i2c bus");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* I2C constructor, takes a pointer to a I2C context and initialises the I2C class
|
||||||
|
*
|
||||||
|
* @param void * to an I2C context
|
||||||
|
*/
|
||||||
|
I2c(void* i2c_context)
|
||||||
|
{
|
||||||
|
m_i2c = (mraa_i2c_context) i2c_context;
|
||||||
|
if (m_i2c == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid I2C context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the I2c Bus used. This does not guarrantee the bus will not
|
||||||
|
* be usable by anyone else or communicates this disconnect to any
|
||||||
|
* slaves.
|
||||||
|
*/
|
||||||
|
~I2c()
|
||||||
|
{
|
||||||
|
mraa_i2c_stop(m_i2c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the i2c Frequency for communication. Your board may not support
|
||||||
|
* the set frequency. Anyone can change this at any time and this will
|
||||||
|
* affect every slave on the bus
|
||||||
|
*
|
||||||
|
* @param mode Frequency to set the bus to
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
frequency(I2cMode mode)
|
||||||
|
{
|
||||||
|
return (Result) mraa_i2c_frequency(m_i2c, (mraa_i2c_mode_t) mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the slave to talk to, typically called before every read/write
|
||||||
|
* operation
|
||||||
|
*
|
||||||
|
* @param address Communicate to the i2c slave on this address
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
address(uint8_t address)
|
||||||
|
{
|
||||||
|
return (Result) mraa_i2c_address(m_i2c, address);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read exactly one byte from the bus
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @return char read from the bus
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
readByte()
|
||||||
|
{
|
||||||
|
int x = mraa_i2c_read_byte(m_i2c);
|
||||||
|
if (x == -1) {
|
||||||
|
throw std::invalid_argument("Unknown error in I2c::readByte()");
|
||||||
|
}
|
||||||
|
return (uint8_t) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read length bytes from the bus into *data pointer
|
||||||
|
*
|
||||||
|
* @param data Data to read into
|
||||||
|
* @param length Size of read in bytes to make
|
||||||
|
* @return length of read, should match length
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
read(uint8_t* data, int length)
|
||||||
|
{
|
||||||
|
return mraa_i2c_read(m_i2c, data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read byte from an i2c register
|
||||||
|
*
|
||||||
|
* @param reg Register to read from
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @return char read from register
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
readReg(uint8_t reg)
|
||||||
|
{
|
||||||
|
int x = mraa_i2c_read_byte_data(m_i2c, reg);
|
||||||
|
if (x == -1) {
|
||||||
|
throw std::invalid_argument("Unknown error in I2c::readReg()");
|
||||||
|
}
|
||||||
|
return (uint8_t) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read word from an i2c register
|
||||||
|
*
|
||||||
|
* @param reg Register to read from
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @return char read from register
|
||||||
|
*/
|
||||||
|
uint16_t
|
||||||
|
readWordReg(uint8_t reg)
|
||||||
|
{
|
||||||
|
int x = mraa_i2c_read_word_data(m_i2c, reg);
|
||||||
|
if (x == -1) {
|
||||||
|
throw std::invalid_argument("Unknown error in I2c::readReg()");
|
||||||
|
}
|
||||||
|
return (uint16_t) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read length bytes from the bus into *data pointer starting from
|
||||||
|
* an i2c register
|
||||||
|
*
|
||||||
|
* @param reg Register to read from
|
||||||
|
* @param data pointer to the byte array to read data in to
|
||||||
|
* @param length max number of bytes to read
|
||||||
|
* @return length passed to the function or -1
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
readBytesReg(uint8_t reg, uint8_t* data, int length)
|
||||||
|
{
|
||||||
|
return mraa_i2c_read_bytes_data(m_i2c, reg, data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a byte on the bus
|
||||||
|
*
|
||||||
|
* @param data The byte to send on the bus
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
writeByte(uint8_t data)
|
||||||
|
{
|
||||||
|
return (Result) mraa_i2c_write_byte(m_i2c, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write length bytes to the bus, the first byte in the array is the
|
||||||
|
* command/register to write
|
||||||
|
*
|
||||||
|
* @param data Buffer to send on the bus, first byte is i2c command
|
||||||
|
* @param length Size of buffer to send
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
write(const uint8_t* data, int length)
|
||||||
|
{
|
||||||
|
return (Result) mraa_i2c_write(m_i2c, data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a byte to an i2c register
|
||||||
|
*
|
||||||
|
* @param reg Register to write to
|
||||||
|
* @param data Value to write to register
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
writeReg(uint8_t reg, uint8_t data)
|
||||||
|
{
|
||||||
|
return (Result) mraa_i2c_write_byte_data(m_i2c, data, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a word to an i2c register
|
||||||
|
*
|
||||||
|
* @param reg Register to write to
|
||||||
|
* @param data Value to write to register
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
writeWordReg(uint8_t reg, uint16_t data)
|
||||||
|
{
|
||||||
|
return (Result) mraa_i2c_write_word_data(m_i2c, data, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_i2c_context m_i2c;
|
||||||
|
};
|
||||||
|
}
|
||||||
139
include/mraa/iio.h
Normal file
139
include/mraa/iio.h
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2015 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "iio_kernel_headers.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int index;
|
||||||
|
int enabled;
|
||||||
|
char* type;
|
||||||
|
mraa_boolean_t lendian;
|
||||||
|
int signedd;
|
||||||
|
unsigned int offset;
|
||||||
|
uint64_t mask;
|
||||||
|
unsigned int bits_used;
|
||||||
|
unsigned int bytes;
|
||||||
|
unsigned int shift;
|
||||||
|
unsigned int location;
|
||||||
|
} mraa_iio_channel;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char* name;
|
||||||
|
int enabled;
|
||||||
|
} mraa_iio_event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief iio
|
||||||
|
*
|
||||||
|
* An iio context represents an IIO device
|
||||||
|
*
|
||||||
|
* @snippet iio_driver.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer definition to the internal struct _iio
|
||||||
|
*/
|
||||||
|
typedef struct _iio* mraa_iio_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise iio context
|
||||||
|
*
|
||||||
|
* @param bus iio device to use
|
||||||
|
* @return i2c context or NULL
|
||||||
|
*/
|
||||||
|
mraa_iio_context mraa_iio_init(int device);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_trigger_buffer(mraa_iio_context dev, void (*fptr)(char* data), void* args);
|
||||||
|
|
||||||
|
const char* mraa_iio_get_device_name(mraa_iio_context dev);
|
||||||
|
|
||||||
|
int mraa_iio_get_device_num_by_name(const char* name);
|
||||||
|
|
||||||
|
int mraa_iio_read_size(mraa_iio_context dev);
|
||||||
|
|
||||||
|
mraa_iio_channel* mraa_iio_get_channels(mraa_iio_context dev);
|
||||||
|
|
||||||
|
int mraa_iio_get_channel_count(mraa_iio_context dev);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_read_float(mraa_iio_context dev, const char* filename, float* data);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_read_int(mraa_iio_context dev, const char* filename, int* data);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_read_string(mraa_iio_context dev, const char* filename, char* data, int max_len);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_write_float(mraa_iio_context dev, const char* attr_chan, const float data);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_write_int(mraa_iio_context dev, const char* attr_chan, const int data);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_write_string(mraa_iio_context dev, const char* attr_chan, const char* data);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_get_channel_data(mraa_iio_context dev);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_get_event_data(mraa_iio_context dev);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_event_poll(mraa_iio_context dev, struct iio_event_data* data);
|
||||||
|
|
||||||
|
mraa_result_t
|
||||||
|
mraa_iio_event_setup_callback(mraa_iio_context dev, void (*fptr)(struct iio_event_data* data, void* args), void* args);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_event_extract_event(struct iio_event_data* event,
|
||||||
|
int* chan_type,
|
||||||
|
int* modifier,
|
||||||
|
int* type,
|
||||||
|
int* direction,
|
||||||
|
int* channel,
|
||||||
|
int* channel2,
|
||||||
|
int* different);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_get_mount_matrix(mraa_iio_context dev, const char *sysfs_name, float mm[9]);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_create_trigger(mraa_iio_context dev, const char* trigger);
|
||||||
|
|
||||||
|
mraa_result_t mraa_iio_update_channels(mraa_iio_context dev);
|
||||||
|
/**
|
||||||
|
* De-inits an mraa_iio_context device
|
||||||
|
*
|
||||||
|
* @param dev The iio context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_iio_close(mraa_iio_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
245
include/mraa/iio.hpp
Normal file
245
include/mraa/iio.hpp
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
/*
|
||||||
|
* Author: Henry Bruce <henry.bruce@intel.com>
|
||||||
|
* Copyright (c) 2015 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <sstream>
|
||||||
|
#include "iio.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
struct IioEventData
|
||||||
|
{
|
||||||
|
int channelType;
|
||||||
|
int modifier;
|
||||||
|
int type;
|
||||||
|
int direction;
|
||||||
|
int channel;
|
||||||
|
int channel2;
|
||||||
|
int diff;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IioHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void onIioEvent(const IioEventData& eventData) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to Industrial IO
|
||||||
|
*
|
||||||
|
* This file defines the C++ iio interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet iio_dummy_test.cpp Interesting
|
||||||
|
*/
|
||||||
|
class Iio
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Iio Constructor, takes a device number which will map directly to sysfs
|
||||||
|
* e.g. device 0 maps to /sys/bus/iio/devices/iio:device0
|
||||||
|
*
|
||||||
|
* @param device IIO device number
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument if initialization fails
|
||||||
|
*/
|
||||||
|
Iio(int device)
|
||||||
|
{
|
||||||
|
m_iio = mraa_iio_init(device);
|
||||||
|
if (m_iio == NULL) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "IIO device " << device << " is not valid";
|
||||||
|
throw std::invalid_argument(oss.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iio Constructor
|
||||||
|
*
|
||||||
|
* @param deviceName IIO device name
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument if initialization fails
|
||||||
|
*/
|
||||||
|
Iio(const std::string& deviceName)
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
int id = mraa_iio_get_device_num_by_name(deviceName.c_str());
|
||||||
|
if (id == -1) {
|
||||||
|
oss << "IIO device name " << deviceName << " not found";
|
||||||
|
throw std::invalid_argument(oss.str());
|
||||||
|
}
|
||||||
|
m_iio = mraa_iio_init(id);
|
||||||
|
if (m_iio == NULL) {
|
||||||
|
oss << "IIO device " << deviceName << " is not valid";
|
||||||
|
throw std::invalid_argument(oss.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iio destructor
|
||||||
|
*/
|
||||||
|
~Iio()
|
||||||
|
{
|
||||||
|
mraa_iio_close(m_iio);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get device name
|
||||||
|
*
|
||||||
|
* @returns The device name
|
||||||
|
*/
|
||||||
|
std::string
|
||||||
|
getDeviceName() const
|
||||||
|
{
|
||||||
|
return mraa_iio_get_device_name(m_iio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an int value from specified attribute.
|
||||||
|
*
|
||||||
|
* @param attributeName attribute mame
|
||||||
|
*
|
||||||
|
* @returns The int value
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument if read fails
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
readInt(const std::string& attributeName) const
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
mraa_result_t res = mraa_iio_read_int(m_iio, attributeName.c_str(), &value);
|
||||||
|
if (res != MRAA_SUCCESS) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "IIO readInt for attibute " << attributeName << " failed";
|
||||||
|
throw std::runtime_error(oss.str());
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a float value from specified attribute.
|
||||||
|
*
|
||||||
|
* @param attributeName attribute mame
|
||||||
|
*
|
||||||
|
* @returns The float value
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument if read fails
|
||||||
|
*/
|
||||||
|
float
|
||||||
|
readFloat(const std::string& attributeName) const
|
||||||
|
{
|
||||||
|
float value;
|
||||||
|
mraa_result_t res = mraa_iio_read_float(m_iio, attributeName.c_str(), &value);
|
||||||
|
if (res != MRAA_SUCCESS) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "IIO readFloat for attibute " << attributeName << " failed";
|
||||||
|
throw std::runtime_error(oss.str());
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write an int value to specified attribute.
|
||||||
|
*
|
||||||
|
* @param attributeName attribute mame
|
||||||
|
* @param value int value
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument if write fails
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
writeInt(const std::string& attributeName, int value) const
|
||||||
|
{
|
||||||
|
mraa_result_t res = mraa_iio_write_int(m_iio, attributeName.c_str(), value);
|
||||||
|
if (res != MRAA_SUCCESS) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "IIO writeInt for attibute " << attributeName << " failed";
|
||||||
|
throw std::runtime_error(oss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a float value to specified attribute.
|
||||||
|
*
|
||||||
|
* @param attributeName attribute mame
|
||||||
|
* @param value float value
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument if write fails
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
writeFloat(const std::string& attributeName, float value) const
|
||||||
|
{
|
||||||
|
mraa_result_t res = mraa_iio_write_float(m_iio, attributeName.c_str(), value);
|
||||||
|
if (res != MRAA_SUCCESS) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "IIO writeFloat for attibute " << attributeName << " failed";
|
||||||
|
throw std::runtime_error(oss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register event handler.
|
||||||
|
*
|
||||||
|
* @param handler handler class that implements IioHandler
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument on failure
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
registerEventHandler(IioHandler* handler) const
|
||||||
|
{
|
||||||
|
mraa_result_t res = mraa_iio_event_setup_callback(m_iio, private_event_handler, handler);
|
||||||
|
if (res != MRAA_SUCCESS) {
|
||||||
|
throw std::runtime_error("registerEventHandler failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void private_event_handler(iio_event_data* data, void *args)
|
||||||
|
{
|
||||||
|
if (args != NULL) {
|
||||||
|
IioHandler* handler = (IioHandler*)args;
|
||||||
|
IioEventData eventData;
|
||||||
|
int chan_type, modifier, type, direction, channel, channel2, different;
|
||||||
|
mraa_iio_event_extract_event(data, &chan_type, &modifier, &type, &direction, &channel, &channel2, &different);
|
||||||
|
eventData.channelType = chan_type;
|
||||||
|
eventData.modifier = modifier;
|
||||||
|
eventData.type = type;
|
||||||
|
eventData.direction = direction;
|
||||||
|
eventData.channel = channel;
|
||||||
|
eventData.channel2 = channel2;
|
||||||
|
eventData.diff = different;
|
||||||
|
handler->onIioEvent(eventData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mraa_iio_context m_iio;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
144
include/mraa/iio_kernel_headers.h
Normal file
144
include/mraa/iio_kernel_headers.h
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* Author: Lay, Kuan Loon <kuan.loon.lay@intel.com>
|
||||||
|
* Copyright (c) 2015 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//For kernel 4.1+,
|
||||||
|
//#include <linux/iio/types.h>
|
||||||
|
//#include <linux/iio/events.h>
|
||||||
|
|
||||||
|
//linux/iio/types.h
|
||||||
|
enum iio_chan_type {
|
||||||
|
IIO_VOLTAGE,
|
||||||
|
IIO_CURRENT,
|
||||||
|
IIO_POWER,
|
||||||
|
IIO_ACCEL,
|
||||||
|
IIO_ANGL_VEL,
|
||||||
|
IIO_MAGN,
|
||||||
|
IIO_LIGHT,
|
||||||
|
IIO_INTENSITY,
|
||||||
|
IIO_PROXIMITY,
|
||||||
|
IIO_TEMP,
|
||||||
|
IIO_INCLI,
|
||||||
|
IIO_ROT,
|
||||||
|
IIO_ANGL,
|
||||||
|
IIO_TIMESTAMP,
|
||||||
|
IIO_CAPACITANCE,
|
||||||
|
IIO_ALTVOLTAGE,
|
||||||
|
IIO_CCT,
|
||||||
|
IIO_PRESSURE,
|
||||||
|
IIO_HUMIDITYRELATIVE,
|
||||||
|
IIO_ACTIVITY,
|
||||||
|
IIO_STEPS,
|
||||||
|
IIO_ENERGY,
|
||||||
|
IIO_DISTANCE,
|
||||||
|
IIO_VELOCITY,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum iio_modifier {
|
||||||
|
IIO_NO_MOD,
|
||||||
|
IIO_MOD_X,
|
||||||
|
IIO_MOD_Y,
|
||||||
|
IIO_MOD_Z,
|
||||||
|
IIO_MOD_X_AND_Y,
|
||||||
|
IIO_MOD_X_AND_Z,
|
||||||
|
IIO_MOD_Y_AND_Z,
|
||||||
|
IIO_MOD_X_AND_Y_AND_Z,
|
||||||
|
IIO_MOD_X_OR_Y,
|
||||||
|
IIO_MOD_X_OR_Z,
|
||||||
|
IIO_MOD_Y_OR_Z,
|
||||||
|
IIO_MOD_X_OR_Y_OR_Z,
|
||||||
|
IIO_MOD_LIGHT_BOTH,
|
||||||
|
IIO_MOD_LIGHT_IR,
|
||||||
|
IIO_MOD_ROOT_SUM_SQUARED_X_Y,
|
||||||
|
IIO_MOD_SUM_SQUARED_X_Y_Z,
|
||||||
|
IIO_MOD_LIGHT_CLEAR,
|
||||||
|
IIO_MOD_LIGHT_RED,
|
||||||
|
IIO_MOD_LIGHT_GREEN,
|
||||||
|
IIO_MOD_LIGHT_BLUE,
|
||||||
|
IIO_MOD_QUATERNION,
|
||||||
|
IIO_MOD_TEMP_AMBIENT,
|
||||||
|
IIO_MOD_TEMP_OBJECT,
|
||||||
|
IIO_MOD_NORTH_MAGN,
|
||||||
|
IIO_MOD_NORTH_TRUE,
|
||||||
|
IIO_MOD_NORTH_MAGN_TILT_COMP,
|
||||||
|
IIO_MOD_NORTH_TRUE_TILT_COMP,
|
||||||
|
IIO_MOD_RUNNING,
|
||||||
|
IIO_MOD_JOGGING,
|
||||||
|
IIO_MOD_WALKING,
|
||||||
|
IIO_MOD_STILL,
|
||||||
|
IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum iio_event_type {
|
||||||
|
IIO_EV_TYPE_THRESH,
|
||||||
|
IIO_EV_TYPE_MAG,
|
||||||
|
IIO_EV_TYPE_ROC,
|
||||||
|
IIO_EV_TYPE_THRESH_ADAPTIVE,
|
||||||
|
IIO_EV_TYPE_MAG_ADAPTIVE,
|
||||||
|
IIO_EV_TYPE_CHANGE,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum iio_event_direction {
|
||||||
|
IIO_EV_DIR_EITHER,
|
||||||
|
IIO_EV_DIR_RISING,
|
||||||
|
IIO_EV_DIR_FALLING,
|
||||||
|
IIO_EV_DIR_NONE,
|
||||||
|
};
|
||||||
|
|
||||||
|
//linux/iio/events.h
|
||||||
|
#if defined(MSYS) || defined(__APPLE__) || defined(__MACOSX__)
|
||||||
|
#define __USE_LINUX_IOCTL_DEFS
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#else
|
||||||
|
#include <linux/ioctl.h>
|
||||||
|
#endif
|
||||||
|
#if defined(__APPLE__) || defined(__MACOSX__)
|
||||||
|
#include <osx/osx_endian.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct iio_event_data - The actual event being pushed to userspace
|
||||||
|
* @id: event identifier
|
||||||
|
* @timestamp: best estimate of time of event occurrence (often from
|
||||||
|
* the interrupt handler)
|
||||||
|
*/
|
||||||
|
struct iio_event_data {
|
||||||
|
unsigned long long int id;
|
||||||
|
long long int timestamp;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IIO_GET_EVENT_FD_IOCTL _IOR('i', 0x90, int)
|
||||||
|
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_TYPE(mask) ((mask >> 56) & 0xFF)
|
||||||
|
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0x7F)
|
||||||
|
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) ((mask >> 32) & 0xFF)
|
||||||
|
|
||||||
|
/* Event code number extraction depends on which type of event we have.
|
||||||
|
* Perhaps review this function in the future*/
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_CHAN(mask) ((short int)(mask & 0xFFFF))
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_CHAN2(mask) ((short int)(((mask) >> 16) & 0xFFFF))
|
||||||
|
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_MODIFIER(mask) ((mask >> 40) & 0xFF)
|
||||||
|
#define IIO_EVENT_CODE_EXTRACT_DIFF(mask) (((mask) >> 55) & 0x1)
|
||||||
187
include/mraa/pwm.h
Normal file
187
include/mraa/pwm.h
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief Pulse Width Modulation module
|
||||||
|
*
|
||||||
|
* PWM is the Pulse Width Modulation interface to libmraa. It allows the
|
||||||
|
* generation of a signal on a pin. Some boards may have higher or lower levels
|
||||||
|
* of resolution so make sure you check the board & pin you are using before
|
||||||
|
* hand.
|
||||||
|
*
|
||||||
|
* @snippet cycle-pwm3.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
typedef struct _pwm* mraa_pwm_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise pwm_context, uses board mapping
|
||||||
|
*
|
||||||
|
* @param pin The PWM PIN
|
||||||
|
* @return pwm context or NULL
|
||||||
|
*/
|
||||||
|
mraa_pwm_context mraa_pwm_init(int pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise pwm_context, raw mode
|
||||||
|
*
|
||||||
|
* @param chipid The chip inwhich the PWM is under in SYSFS
|
||||||
|
* @param pin The PWM PIN.
|
||||||
|
* @return pwm context or NULL
|
||||||
|
*/
|
||||||
|
mraa_pwm_context mraa_pwm_init_raw(int chipid, int pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the output duty-cycle percentage, as a float
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param percentage A floating-point value representing percentage of output.
|
||||||
|
* The value should lie between 0.0f (representing on 0%) and 1.0f
|
||||||
|
* Values above or below this range will be set at either 0.0f or 1.0f
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_write(mraa_pwm_context dev, float percentage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the output duty-cycle percentage, as a float
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @return percentage A floating-point value representing percentage of output.
|
||||||
|
* The value should lie between 0.0f (representing on 0%) and 1.0f
|
||||||
|
* Values above or below this range will be set at either 0.0f or 1.0f
|
||||||
|
*/
|
||||||
|
float mraa_pwm_read(mraa_pwm_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the PWM period as seconds represented in a float
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param seconds Period represented as a float in seconds
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_period(mraa_pwm_context dev, float seconds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set period, milliseconds.
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param ms Milliseconds for period
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_period_ms(mraa_pwm_context dev, int ms);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set period, microseconds
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param us Microseconds as period
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_period_us(mraa_pwm_context dev, int us);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set pulsewidth, As represnted by seconds in a (float)
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param seconds The duration of a pulse
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_pulsewidth(mraa_pwm_context dev, float seconds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set pulsewidth, milliseconds
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param ms Milliseconds for pulsewidth
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_pulsewidth_ms(mraa_pwm_context dev, int ms);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set pulsewidth, microseconds
|
||||||
|
*
|
||||||
|
* @param dev The Pwm context to use
|
||||||
|
* @param us Microseconds for pulsewidth
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_pulsewidth_us(mraa_pwm_context dev, int us);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the enable status of the PWM pin. None zero will assume on with output being driven.
|
||||||
|
* and 0 will disable the output.
|
||||||
|
*
|
||||||
|
* @param dev The pwm context to use
|
||||||
|
* @param enable Toggle status of pin
|
||||||
|
* @return Result of operation.
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_enable(mraa_pwm_context dev, int enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change ownership of context
|
||||||
|
*
|
||||||
|
* @param dev the context
|
||||||
|
* @param owner Ownership boolean
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_owner(mraa_pwm_context dev, mraa_boolean_t owner);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close and unexport the PWM pin
|
||||||
|
*
|
||||||
|
* @param dev The pwm context to use
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_pwm_close(mraa_pwm_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the maximum pwm period in us
|
||||||
|
*
|
||||||
|
* @param dev The pwm context to use
|
||||||
|
* @return max pwm in us
|
||||||
|
*/
|
||||||
|
int mraa_pwm_get_max_period(mraa_pwm_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the minimum pwm period in us
|
||||||
|
*
|
||||||
|
* @param dev The pwm context to use
|
||||||
|
* @return min pwm in us
|
||||||
|
*/
|
||||||
|
int mraa_pwm_get_min_period(mraa_pwm_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
219
include/mraa/pwm.hpp
Normal file
219
include/mraa/pwm.hpp
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "pwm.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to Pulse Width Modulation
|
||||||
|
*
|
||||||
|
* This file defines the PWM interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet Pwm3-cycle.cpp Interesting
|
||||||
|
*/
|
||||||
|
class Pwm
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* instanciates a PWM object on a pin
|
||||||
|
*
|
||||||
|
* @param pin the pin number used on your board
|
||||||
|
* @param owner if you are the owner of the pin the destructor will
|
||||||
|
* unexport the pin from sysfs, default behaviour is you are the owner
|
||||||
|
* if the pinmapper exported it
|
||||||
|
* @param chipid the pwmchip to use, use only in raw mode
|
||||||
|
*/
|
||||||
|
Pwm(int pin, bool owner = true, int chipid = -1)
|
||||||
|
{
|
||||||
|
if (chipid == -1) {
|
||||||
|
m_pwm = mraa_pwm_init(pin);
|
||||||
|
} else {
|
||||||
|
m_pwm = mraa_pwm_init_raw(chipid, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pwm == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising PWM on pin");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!owner) {
|
||||||
|
mraa_pwm_owner(m_pwm, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pwm constructor, takes a pointer to the PWM context and
|
||||||
|
* initialises the class
|
||||||
|
*
|
||||||
|
* @param void * to a PWM context
|
||||||
|
*/
|
||||||
|
Pwm(void* pwm_context)
|
||||||
|
{
|
||||||
|
m_pwm = (mraa_pwm_context) pwm_context;
|
||||||
|
if (m_pwm == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid PWM context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Pwm destructor
|
||||||
|
*/
|
||||||
|
~Pwm()
|
||||||
|
{
|
||||||
|
mraa_pwm_close(m_pwm);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the output duty-cycle percentage, as a float
|
||||||
|
*
|
||||||
|
* @param percentage A floating-point value representing percentage of
|
||||||
|
* output. The value should lie between 0.0f (representing 0%) and
|
||||||
|
* 1.0f Values above or below this range will be set at either 0.0f or
|
||||||
|
* 1.0f
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
write(float percentage)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_write(m_pwm, percentage);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Read the output duty-cycle percentage, as a float
|
||||||
|
*
|
||||||
|
* @return A floating-point value representing percentage of
|
||||||
|
* output. The value should lie between 0.0f (representing 0%) and
|
||||||
|
* 1.0f Values above or below this range will be set at either 0.0f or
|
||||||
|
* 1.0f
|
||||||
|
*/
|
||||||
|
float
|
||||||
|
read()
|
||||||
|
{
|
||||||
|
return mraa_pwm_read(m_pwm);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the PWM period as seconds represented in a float
|
||||||
|
*
|
||||||
|
* @param period Period represented as a float in seconds
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
period(float period)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_period(m_pwm, period);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set period, milliseconds
|
||||||
|
*
|
||||||
|
* @param ms milliseconds for period
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
period_ms(int ms)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_period_ms(m_pwm, ms);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set period, microseconds
|
||||||
|
*
|
||||||
|
* @param us microseconds as period
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
period_us(int us)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_period_us(m_pwm, us);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set pulsewidth, as represented by seconds in a float
|
||||||
|
*
|
||||||
|
* @param seconds The duration of a pulse
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
pulsewidth(float seconds)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_pulsewidth(m_pwm, seconds);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set pulsewidth, milliseconds
|
||||||
|
*
|
||||||
|
* @param ms milliseconds for pulsewidth
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
pulsewidth_ms(int ms)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_pulsewidth_ms(m_pwm, ms);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The pulsewidth, microseconds
|
||||||
|
*
|
||||||
|
* @param us microseconds for pulsewidth
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
pulsewidth_us(int us)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_pulsewidth_us(m_pwm, us);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the enable status of the PWM pin. None zero will assume on with
|
||||||
|
* output being driven and 0 will disable the output
|
||||||
|
*
|
||||||
|
* @param enable enable status of pin
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
enable(bool enable)
|
||||||
|
{
|
||||||
|
return (Result) mraa_pwm_enable(m_pwm, enable);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the maximum PWM period in us
|
||||||
|
*
|
||||||
|
* @return max PWM period in us
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
max_period()
|
||||||
|
{
|
||||||
|
return mraa_pwm_get_max_period(m_pwm);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the minimum PWM period in us
|
||||||
|
*
|
||||||
|
* @return min PWM period in us
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
min_period()
|
||||||
|
{
|
||||||
|
return mraa_pwm_get_min_period(m_pwm);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_pwm_context m_pwm;
|
||||||
|
};
|
||||||
|
}
|
||||||
196
include/mraa/spi.h
Normal file
196
include/mraa/spi.h
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief Serial Peripheral Interface
|
||||||
|
*
|
||||||
|
* This file defines the spi interface for libmraa. A Spi object in libmraa
|
||||||
|
* represents a spidev device. Linux spidev devices are created per spi bus and
|
||||||
|
* every chip select available on that bus has another spidev 'file'. A lot
|
||||||
|
* more information on spidev devices is available
|
||||||
|
* [here](https://www.kernel.org/doc/Documentation/spi/spidev).
|
||||||
|
*
|
||||||
|
* @snippet spi_mcp4261.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA SPI Modes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_SPI_MODE0 = 0, /**< CPOL = 0, CPHA = 0, Clock idle low, data is clocked in on rising edge,
|
||||||
|
output data (change) on falling edge */
|
||||||
|
MRAA_SPI_MODE1 = 1, /**< CPOL = 0, CPHA = 1, Clock idle low, data is clocked in on falling edge,
|
||||||
|
output data (change) on rising edge */
|
||||||
|
MRAA_SPI_MODE2 = 2, /**< CPOL = 1, CPHA = 0, Clock idle low, data is clocked in on falling edge,
|
||||||
|
output data (change) on rising edge */
|
||||||
|
MRAA_SPI_MODE3 = 3, /**< CPOL = 1, CPHA = 1, Clock idle low, data is clocked in on rising, edge
|
||||||
|
output data (change) on falling edge */
|
||||||
|
} mraa_spi_mode_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer definition to the internal struct _spi
|
||||||
|
*/
|
||||||
|
typedef struct _spi* mraa_spi_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise SPI_context, uses board mapping. Sets the muxes
|
||||||
|
*
|
||||||
|
* @param bus Bus to use, as listed in platform definition, normally 0
|
||||||
|
* @return Spi context or NULL
|
||||||
|
*/
|
||||||
|
mraa_spi_context mraa_spi_init(int bus);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise SPI_context without any board configuration, selects a bus and a mux.
|
||||||
|
*
|
||||||
|
* @param bus Bus to use as listed by spidev
|
||||||
|
* @param cs Chip select to use as listed in spidev
|
||||||
|
* @return Spi context or NULL
|
||||||
|
*/
|
||||||
|
mraa_spi_context mraa_spi_init_raw(unsigned int bus, unsigned int cs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the SPI device mode. see spidev 0-3.
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param mode The SPI mode, See Linux spidev
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_mode(mraa_spi_context dev, mraa_spi_mode_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the SPI device operating clock frequency.
|
||||||
|
*
|
||||||
|
* @param dev the Spi context
|
||||||
|
* @param hz the frequency in hz
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_frequency(mraa_spi_context dev, int hz);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write Single Byte to the SPI device.
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param data Data to send
|
||||||
|
* @return Data received on the miso line or -1 in case of error
|
||||||
|
*/
|
||||||
|
int mraa_spi_write(mraa_spi_context dev, uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write Two Bytes to the SPI device.
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param data Data to send
|
||||||
|
* @return Data received on the miso line
|
||||||
|
*/
|
||||||
|
int mraa_spi_write_word(mraa_spi_context dev, uint16_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write Buffer of bytes to the SPI device. The pointer return has to be
|
||||||
|
* free'd by the caller. It will return a NULL pointer in cases of error.
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param data to send
|
||||||
|
* @param length elements within buffer, Max 4096
|
||||||
|
* @return Data received on the miso line, same length as passed in
|
||||||
|
*/
|
||||||
|
uint8_t* mraa_spi_write_buf(mraa_spi_context dev, uint8_t* data, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write Buffer of uint16 to the SPI device. The pointer return has to be
|
||||||
|
* free'd by the caller. It will return a NULL pointer in cases of error.
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param data to send
|
||||||
|
* @param length elements (in bytes) within buffer, Max 4096
|
||||||
|
* @return Data received on the miso line, same length as passed in
|
||||||
|
*/
|
||||||
|
uint16_t* mraa_spi_write_buf_word(mraa_spi_context dev, uint16_t* data, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer Buffer of bytes to the SPI device. Both send and recv buffers
|
||||||
|
* are passed in
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param data to send
|
||||||
|
* @param rxbuf buffer to recv data back, may be NULL
|
||||||
|
* @param length elements within buffer, Max 4096
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_transfer_buf(mraa_spi_context dev, uint8_t* data, uint8_t* rxbuf, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer Buffer of uint16 to the SPI device. Both send and recv buffers
|
||||||
|
* are passed in
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param data to send
|
||||||
|
* @param rxbuf buffer to recv data back, may be NULL
|
||||||
|
* @param length elements (in bytes) within buffer, Max 4096
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_transfer_buf_word(mraa_spi_context dev, uint16_t* data, uint16_t* rxbuf, int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the SPI lsb mode
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param lsb Use least significant bit transmission. 0 for msbi
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_lsbmode(mraa_spi_context dev, mraa_boolean_t lsb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set bits per mode on transaction, defaults at 8
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @param bits bits per word
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_bit_per_word(mraa_spi_context dev, unsigned int bits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* De-inits an mraa_spi_context device
|
||||||
|
*
|
||||||
|
* @param dev The Spi context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_spi_stop(mraa_spi_context dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
243
include/mraa/spi.hpp
Normal file
243
include/mraa/spi.hpp
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "spi.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA SPI Modes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
SPI_MODE0 = 0, /**< CPOL = 0, CPHA = 0, Clock idle low, data is clocked in on rising edge,
|
||||||
|
output data (change) on falling edge */
|
||||||
|
SPI_MODE1 = 1, /**< CPOL = 0, CPHA = 1, Clock idle low, data is clocked in on falling edge,
|
||||||
|
output data (change) on rising edge */
|
||||||
|
SPI_MODE2 = 2, /**< CPOL = 1, CPHA = 0, Clock idle low, data is clocked in on falling edge,
|
||||||
|
output data (change) on rising edge */
|
||||||
|
SPI_MODE3 = 3, /**< CPOL = 1, CPHA = 1, Clock idle low, data is clocked in on rising, edge
|
||||||
|
output data (change) on falling edge */
|
||||||
|
} Spi_Mode;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to Serial Peripheral Interface
|
||||||
|
*
|
||||||
|
* This file defines the SPI interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet Spi-pot.cpp Interesting
|
||||||
|
*/
|
||||||
|
class Spi
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Initialise SPI object using the board mapping to set muxes
|
||||||
|
*
|
||||||
|
* @param bus to use, as listed in the platform definition, normally 0
|
||||||
|
*/
|
||||||
|
Spi(int bus)
|
||||||
|
{
|
||||||
|
m_spi = mraa_spi_init(bus);
|
||||||
|
|
||||||
|
if (m_spi == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising SPI bus");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Spi(int bus, int cs)
|
||||||
|
{
|
||||||
|
m_spi = mraa_spi_init_raw(bus, cs);
|
||||||
|
|
||||||
|
if (m_spi == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising SPI bus");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spi Constructor, takes a pointer to a SPI context and initialises
|
||||||
|
* the SPI class
|
||||||
|
*
|
||||||
|
* @param void * to SPI context
|
||||||
|
*/
|
||||||
|
Spi(void* spi_context)
|
||||||
|
{
|
||||||
|
m_spi = (mraa_spi_context) spi_context;
|
||||||
|
if (m_spi == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid SPI context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes spi bus
|
||||||
|
*/
|
||||||
|
~Spi()
|
||||||
|
{
|
||||||
|
mraa_spi_stop(m_spi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the SPI device mode. see spidev0-3
|
||||||
|
*
|
||||||
|
* @param mode the mode. See Linux spidev doc
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
mode(Spi_Mode mode)
|
||||||
|
{
|
||||||
|
return (Result) mraa_spi_mode(m_spi, (mraa_spi_mode_t) mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the SPI device operating clock frequency
|
||||||
|
*
|
||||||
|
* @param hz the frequency to set in hz
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
frequency(int hz)
|
||||||
|
{
|
||||||
|
return (Result) mraa_spi_frequency(m_spi, hz);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write single byte to the SPI device
|
||||||
|
*
|
||||||
|
* @param data the byte to send
|
||||||
|
* @return data received on the miso line or -1 in case of error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
writeByte(uint8_t data)
|
||||||
|
{
|
||||||
|
return mraa_spi_write(m_spi, (uint8_t) data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write single byte to the SPI device
|
||||||
|
*
|
||||||
|
* @param data the byte to send
|
||||||
|
* @return data received on the miso line or -1 in case of error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
writeWord(uint16_t data)
|
||||||
|
{
|
||||||
|
return mraa_spi_write_word(m_spi, (uint16_t) data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write buffer of bytes to SPI device The pointer return has to be
|
||||||
|
* free'd by the caller. It will return a NULL pointer in cases of
|
||||||
|
* error
|
||||||
|
*
|
||||||
|
* @param txBuf buffer to send
|
||||||
|
* @param length size of buffer to send
|
||||||
|
* @return uint8_t* data received on the miso line. Same length as passed in
|
||||||
|
*/
|
||||||
|
uint8_t*
|
||||||
|
write(uint8_t* txBuf, int length)
|
||||||
|
{
|
||||||
|
return mraa_spi_write_buf(m_spi, txBuf, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SWIG
|
||||||
|
/**
|
||||||
|
* Write buffer of bytes to SPI device The pointer return has to be
|
||||||
|
* free'd by the caller. It will return a NULL pointer in cases of
|
||||||
|
* error
|
||||||
|
*
|
||||||
|
* @param txBuf buffer to send
|
||||||
|
* @param length size of buffer (in bytes) to send
|
||||||
|
* @return uint8_t* data received on the miso line. Same length as passed in
|
||||||
|
*/
|
||||||
|
uint16_t*
|
||||||
|
writeWord(uint16_t* txBuf, int length)
|
||||||
|
{
|
||||||
|
return mraa_spi_write_buf_word(m_spi, txBuf, length);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SWIG
|
||||||
|
/**
|
||||||
|
* Transfer data to and from SPI device Receive pointer may be null if
|
||||||
|
* return data is not needed.
|
||||||
|
*
|
||||||
|
* @param txBuf buffer to send
|
||||||
|
* @param rxBuf buffer to optionally receive data from spi device
|
||||||
|
* @param length size of buffer to send
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
transfer(uint8_t* txBuf, uint8_t* rxBuf, int length)
|
||||||
|
{
|
||||||
|
return (Result) mraa_spi_transfer_buf(m_spi, txBuf, rxBuf, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer data to and from SPI device Receive pointer may be null if
|
||||||
|
* return data is not needed.
|
||||||
|
*
|
||||||
|
* @param txBuf buffer to send
|
||||||
|
* @param rxBuf buffer to optionally receive data from spi device
|
||||||
|
* @param length size of buffer to send
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
transfer_word(uint16_t* txBuf, uint16_t* rxBuf, int length)
|
||||||
|
{
|
||||||
|
return (Result) mraa_spi_transfer_buf_word(m_spi, txBuf, rxBuf, length);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the SPI lsb mode
|
||||||
|
*
|
||||||
|
* @param lsb Use least significant bit transmission - 0 for msbi
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
lsbmode(bool lsb)
|
||||||
|
{
|
||||||
|
return (Result) mraa_spi_lsbmode(m_spi, (mraa_boolean_t) lsb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set bits per mode on transaction, default is 8
|
||||||
|
*
|
||||||
|
* @param bits bits per word
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
bitPerWord(unsigned int bits)
|
||||||
|
{
|
||||||
|
return (Result) mraa_spi_bit_per_word(m_spi, bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_spi_context m_spi;
|
||||||
|
};
|
||||||
|
}
|
||||||
251
include/mraa/types.h
Normal file
251
include/mraa/types.h
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright © 2014 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* This file defines the basic shared types for libmraa
|
||||||
|
* this file is different to common.h in that swig takes this as an input
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA supported platform types
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_INTEL_GALILEO_GEN1 = 0, /**< The Generation 1 Galileo platform (RevD) */
|
||||||
|
MRAA_INTEL_GALILEO_GEN2 = 1, /**< The Generation 2 Galileo platform (RevG/H) */
|
||||||
|
MRAA_INTEL_EDISON_FAB_C = 2, /**< The Intel Edison (FAB C) */
|
||||||
|
MRAA_INTEL_DE3815 = 3, /**< The Intel DE3815 Baytrail NUC */
|
||||||
|
MRAA_INTEL_MINNOWBOARD_MAX = 4, /**< The Intel Minnow Board Max */
|
||||||
|
MRAA_RASPBERRY_PI = 5, /**< The different Raspberry PI Models -like A,B,A+,B+ */
|
||||||
|
MRAA_BEAGLEBONE = 6, /**< The different BeagleBone Black Modes B/C */
|
||||||
|
MRAA_BANANA = 7, /**< Allwinner A20 based Banana Pi and Banana Pro */
|
||||||
|
MRAA_INTEL_NUC5 = 8, /**< The Intel 5th generations Broadwell NUCs */
|
||||||
|
MRAA_96BOARDS = 9, /**< Linaro 96boards */
|
||||||
|
MRAA_INTEL_SOFIA_3GR = 10, /**< The Intel SoFIA 3GR */
|
||||||
|
MRAA_INTEL_CHERRYHILLS = 11, /**< The Intel Braswell Cherryhills */
|
||||||
|
MRAA_UP = 12, /**< The UP Board */
|
||||||
|
MRAA_INTEL_GT_TUCHUCK = 13, /**< The Intel GT Tuchuck Board */
|
||||||
|
|
||||||
|
// USB platform extenders start at 256
|
||||||
|
MRAA_FTDI_FT4222 = 256, /**< FTDI FT4222 USB to i2c bridge */
|
||||||
|
|
||||||
|
// contains bit 9 so is subplatform
|
||||||
|
MRAA_GENERIC_FIRMATA = 1280, /**< Firmata uart platform/bridge */
|
||||||
|
|
||||||
|
MRAA_MOCK_PLATFORM = 96, /**< Mock platform, which requires no real hardware */
|
||||||
|
MRAA_NULL_PLATFORM = 98, /**< Platform with no capabilities that hosts a sub platform */
|
||||||
|
MRAA_UNKNOWN_PLATFORM =
|
||||||
|
99 /**< An unknown platform type, typically will load INTEL_GALILEO_GEN1 */
|
||||||
|
} mraa_platform_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intel edison miniboard numbering enum
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_1 = 0,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_5 = 4,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_7 = 6,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_8 = 7,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_9 = 8,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_10 = 9,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_11 = 10,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_12 = 11,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J17_14 = 13,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_1 = 14,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_2 = 15,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_6 = 19,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_7 = 20,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_8 = 21,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_10 = 23,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_11 = 24,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_12 = 25,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J18_13 = 26,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_4 = 31,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_5 = 32,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_6 = 33,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_8 = 35,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_9 = 36,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_10 = 37,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_11 = 38,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_12 = 39,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_13 = 40,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J19_14 = 41,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_3 = 44,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_4 = 45,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_5 = 46,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_6 = 47,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_7 = 48,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_8 = 49,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_9 = 50,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_10 = 51,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_11 = 52,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_12 = 53,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_13 = 54,
|
||||||
|
MRAA_INTEL_EDISON_MINIBOARD_J20_14 = 55
|
||||||
|
} mraa_intel_edison_miniboard_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intel Edison raw GPIO numbering enum
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_INTEL_EDISON_GP182 = 0,
|
||||||
|
MRAA_INTEL_EDISON_GP135 = 4,
|
||||||
|
MRAA_INTEL_EDISON_GP27 = 6,
|
||||||
|
MRAA_INTEL_EDISON_GP20 = 7,
|
||||||
|
MRAA_INTEL_EDISON_GP28 = 8,
|
||||||
|
MRAA_INTEL_EDISON_GP111 = 0,
|
||||||
|
MRAA_INTEL_EDISON_GP109 = 10,
|
||||||
|
MRAA_INTEL_EDISON_GP115 = 11,
|
||||||
|
MRAA_INTEL_EDISON_GP128 = 13,
|
||||||
|
MRAA_INTEL_EDISON_GP13 = 14,
|
||||||
|
MRAA_INTEL_EDISON_GP165 = 15,
|
||||||
|
MRAA_INTEL_EDISON_GP19 = 19,
|
||||||
|
MRAA_INTEL_EDISON_GP12 = 20,
|
||||||
|
MRAA_INTEL_EDISON_GP183 = 21,
|
||||||
|
MRAA_INTEL_EDISON_GP110 = 23,
|
||||||
|
MRAA_INTEL_EDISON_GP114 = 24,
|
||||||
|
MRAA_INTEL_EDISON_GP129 = 25,
|
||||||
|
MRAA_INTEL_EDISON_GP130 = 26,
|
||||||
|
MRAA_INTEL_EDISON_GP44 = 31,
|
||||||
|
MRAA_INTEL_EDISON_GP46 = 32,
|
||||||
|
MRAA_INTEL_EDISON_GP48 = 33,
|
||||||
|
MRAA_INTEL_EDISON_GP131 = 35,
|
||||||
|
MRAA_INTEL_EDISON_GP14 = 36,
|
||||||
|
MRAA_INTEL_EDISON_GP40 = 37,
|
||||||
|
MRAA_INTEL_EDISON_GP43 = 38,
|
||||||
|
MRAA_INTEL_EDISON_GP77 = 39,
|
||||||
|
MRAA_INTEL_EDISON_GP82 = 40,
|
||||||
|
MRAA_INTEL_EDISON_GP83 = 41,
|
||||||
|
MRAA_INTEL_EDISON_GP134 = 44,
|
||||||
|
MRAA_INTEL_EDISON_GP45 = 45,
|
||||||
|
MRAA_INTEL_EDISON_GP47 = 46,
|
||||||
|
MRAA_INTEL_EDISON_GP49 = 47,
|
||||||
|
MRAA_INTEL_EDISON_GP15 = 48,
|
||||||
|
MRAA_INTEL_EDISON_GP84 = 49,
|
||||||
|
MRAA_INTEL_EDISON_GP42 = 50,
|
||||||
|
MRAA_INTEL_EDISON_GP41 = 51,
|
||||||
|
MRAA_INTEL_EDISON_GP78 = 52,
|
||||||
|
MRAA_INTEL_EDISON_GP79 = 53,
|
||||||
|
MRAA_INTEL_EDISON_GP80 = 54,
|
||||||
|
MRAA_INTEL_EDISON_GP81 = 55
|
||||||
|
} mraa_intel_edison_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raspberry PI Wiring compatible numbering enum
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN8 = 3,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN9 = 5,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN7 = 7,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN15 = 8,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN16 = 10,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN0 = 11,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN1 = 12,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN2 = 13,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN3 = 15,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN4 = 16,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN5 = 18,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN12 = 19,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN13 = 21,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN6 = 22,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN14 = 23,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN10 = 24,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN11 = 26,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN17 = 29, // RPi B V2
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN21 = 29,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN18 = 30, // RPi B V2
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN19 = 31, // RPI B V2
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN22 = 31,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN20 = 32, // RPi B V2
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN26 = 32,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN23 = 33,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN24 = 35,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN27 = 36,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN25 = 37,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN28 = 38,
|
||||||
|
MRAA_RASPBERRY_WIRING_PIN29 = 40
|
||||||
|
} mraa_raspberry_wiring_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA return codes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_SUCCESS = 0, /**< Expected response */
|
||||||
|
MRAA_ERROR_FEATURE_NOT_IMPLEMENTED = 1, /**< Feature TODO */
|
||||||
|
MRAA_ERROR_FEATURE_NOT_SUPPORTED = 2, /**< Feature not supported by HW */
|
||||||
|
MRAA_ERROR_INVALID_VERBOSITY_LEVEL = 3, /**< Verbosity level wrong */
|
||||||
|
MRAA_ERROR_INVALID_PARAMETER = 4, /**< Parameter invalid */
|
||||||
|
MRAA_ERROR_INVALID_HANDLE = 5, /**< Handle invalid */
|
||||||
|
MRAA_ERROR_NO_RESOURCES = 6, /**< No resource of that type avail */
|
||||||
|
MRAA_ERROR_INVALID_RESOURCE = 7, /**< Resource invalid */
|
||||||
|
MRAA_ERROR_INVALID_QUEUE_TYPE = 8, /**< Queue type incorrect */
|
||||||
|
MRAA_ERROR_NO_DATA_AVAILABLE = 9, /**< No data available */
|
||||||
|
MRAA_ERROR_INVALID_PLATFORM = 10, /**< Platform not recognised */
|
||||||
|
MRAA_ERROR_PLATFORM_NOT_INITIALISED = 11, /**< Board information not initialised */
|
||||||
|
MRAA_ERROR_UART_OW_SHORTED = 12, /**< UART OW Short Circuit Detected*/
|
||||||
|
MRAA_ERROR_UART_OW_NO_DEVICES = 13, /**< UART OW No devices detected */
|
||||||
|
MRAA_ERROR_UART_OW_DATA_ERROR = 14, /**< UART OW Data/Bus error detected */
|
||||||
|
|
||||||
|
MRAA_ERROR_UNSPECIFIED = 99 /**< Unknown Error */
|
||||||
|
} mraa_result_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum representing different possible modes for a pin.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_PIN_VALID = 0, /**< Pin Valid */
|
||||||
|
MRAA_PIN_GPIO = 1, /**< General Purpose IO */
|
||||||
|
MRAA_PIN_PWM = 2, /**< Pulse Width Modulation */
|
||||||
|
MRAA_PIN_FAST_GPIO = 3, /**< Faster GPIO */
|
||||||
|
MRAA_PIN_SPI = 4, /**< SPI */
|
||||||
|
MRAA_PIN_I2C = 5, /**< I2C */
|
||||||
|
MRAA_PIN_AIO = 6, /**< Analog in */
|
||||||
|
MRAA_PIN_UART = 7 /**< UART */
|
||||||
|
} mraa_pinmodes_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum reprensenting different i2c speeds/modes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_I2C_STD = 0, /**< up to 100Khz */
|
||||||
|
MRAA_I2C_FAST = 1, /**< up to 400Khz */
|
||||||
|
MRAA_I2C_HIGH = 2 /**< up to 3.4Mhz */
|
||||||
|
} mraa_i2c_mode_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MRAA_UART_PARITY_NONE = 0,
|
||||||
|
MRAA_UART_PARITY_EVEN = 1,
|
||||||
|
MRAA_UART_PARITY_ODD = 2,
|
||||||
|
MRAA_UART_PARITY_MARK = 3,
|
||||||
|
MRAA_UART_PARITY_SPACE = 4
|
||||||
|
} mraa_uart_parity_t;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
247
include/mraa/types.hpp
Normal file
247
include/mraa/types.hpp
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright © 2014 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* This file defines the basic shared types for libmraa
|
||||||
|
* this file is different to common.h in that swig takes this as an input
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
//These enums must match the enums in types.h
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA supported platform types
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
INTEL_GALILEO_GEN1 = 0, /**< The Generation 1 Galileo platform (RevD) */
|
||||||
|
INTEL_GALILEO_GEN2 = 1, /**< The Generation 2 Galileo platform (RevG/H) */
|
||||||
|
INTEL_EDISON_FAB_C = 2, /**< The Intel Edison (FAB C) */
|
||||||
|
INTEL_DE3815 = 3, /**< The Intel DE3815 Baytrail NUC */
|
||||||
|
INTEL_MINNOWBOARD_MAX = 4, /**< The Intel Minnow Board Max */
|
||||||
|
RASPBERRY_PI = 5, /**< The different Raspberry PI Models -like A,B,A+,B+ */
|
||||||
|
BEAGLEBONE = 6, /**< The different BeagleBone Black Modes B/C */
|
||||||
|
BANANA = 7, /**< Allwinner A20 based Banana Pi and Banana Pro */
|
||||||
|
INTEL_NUC5 = 8, /**< The Intel 5th generations Broadwell NUCs */
|
||||||
|
A96BOARDS = 9, /**< Linaro 96boards, A prefix for 'ARM' since not allowed numerical */
|
||||||
|
INTEL_SOFIA_3GR = 10, /**< The Intel SoFIA 3GR */
|
||||||
|
INTEL_CHERRYHILLS = 11, /**< The Intel Braswell Cherryhills */
|
||||||
|
INTEL_UP = 12, /**< The UP Board */
|
||||||
|
INTEL_GT_TUCHUCK = 13, /**< The Intel GT Board */
|
||||||
|
|
||||||
|
FTDI_FT4222 = 256, /**< FTDI FT4222 USB to i2c bridge */
|
||||||
|
|
||||||
|
GENERIC_FIRMATA = 1280, /**< Firmata uart platform/bridge */
|
||||||
|
|
||||||
|
NULL_PLATFORM = 98,
|
||||||
|
UNKNOWN_PLATFORM =
|
||||||
|
99 /**< An unknown platform type, typically will load INTEL_GALILEO_GEN1 */
|
||||||
|
} Platform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intel edison miniboard numbering enum
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_1 = 0,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_5 = 4,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_7 = 6,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_8 = 7,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_9 = 8,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_10 = 9,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_11 = 10,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_12 = 11,
|
||||||
|
INTEL_EDISON_MINIBOARD_J17_14 = 13,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_1 = 14,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_2 = 15,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_6 = 19,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_7 = 20,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_8 = 21,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_10 = 23,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_11 = 24,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_12 = 25,
|
||||||
|
INTEL_EDISON_MINIBOARD_J18_13 = 26,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_4 = 31,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_5 = 32,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_6 = 33,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_8 = 35,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_9 = 36,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_10 = 37,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_11 = 38,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_12 = 39,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_13 = 40,
|
||||||
|
INTEL_EDISON_MINIBOARD_J19_14 = 41,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_3 = 44,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_4 = 45,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_5 = 46,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_6 = 47,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_7 = 48,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_8 = 49,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_9 = 50,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_10 = 51,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_11 = 52,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_12 = 53,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_13 = 54,
|
||||||
|
INTEL_EDISON_MINIBOARD_J20_14 = 55
|
||||||
|
} IntelEdisonMiniboard;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intel Edison raw GPIO numbering enum
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
INTEL_EDISON_GP182 = 0,
|
||||||
|
INTEL_EDISON_GP135 = 4,
|
||||||
|
INTEL_EDISON_GP27 = 6,
|
||||||
|
INTEL_EDISON_GP20 = 7,
|
||||||
|
INTEL_EDISON_GP28 = 8,
|
||||||
|
INTEL_EDISON_GP111 = 0,
|
||||||
|
INTEL_EDISON_GP109 = 10,
|
||||||
|
INTEL_EDISON_GP115 = 11,
|
||||||
|
INTEL_EDISON_GP128 = 13,
|
||||||
|
INTEL_EDISON_GP13 = 14,
|
||||||
|
INTEL_EDISON_GP165 = 15,
|
||||||
|
INTEL_EDISON_GP19 = 19,
|
||||||
|
INTEL_EDISON_GP12 = 20,
|
||||||
|
INTEL_EDISON_GP183 = 21,
|
||||||
|
INTEL_EDISON_GP110 = 23,
|
||||||
|
INTEL_EDISON_GP114 = 24,
|
||||||
|
INTEL_EDISON_GP129 = 25,
|
||||||
|
INTEL_EDISON_GP130 = 26,
|
||||||
|
INTEL_EDISON_GP44 = 31,
|
||||||
|
INTEL_EDISON_GP46 = 32,
|
||||||
|
INTEL_EDISON_GP48 = 33,
|
||||||
|
INTEL_EDISON_GP131 = 35,
|
||||||
|
INTEL_EDISON_GP14 = 36,
|
||||||
|
INTEL_EDISON_GP40 = 37,
|
||||||
|
INTEL_EDISON_GP43 = 38,
|
||||||
|
INTEL_EDISON_GP77 = 39,
|
||||||
|
INTEL_EDISON_GP82 = 40,
|
||||||
|
INTEL_EDISON_GP83 = 41,
|
||||||
|
INTEL_EDISON_GP134 = 44,
|
||||||
|
INTEL_EDISON_GP45 = 45,
|
||||||
|
INTEL_EDISON_GP47 = 46,
|
||||||
|
INTEL_EDISON_GP49 = 47,
|
||||||
|
INTEL_EDISON_GP15 = 48,
|
||||||
|
INTEL_EDISON_GP84 = 49,
|
||||||
|
INTEL_EDISON_GP42 = 50,
|
||||||
|
INTEL_EDISON_GP41 = 51,
|
||||||
|
INTEL_EDISON_GP78 = 52,
|
||||||
|
INTEL_EDISON_GP79 = 53,
|
||||||
|
INTEL_EDISON_GP80 = 54,
|
||||||
|
INTEL_EDISON_GP81 = 55
|
||||||
|
} IntelEdison;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raspberry PI Wiring compatible numbering enum
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
RASPBERRY_WIRING_PIN8 = 3,
|
||||||
|
RASPBERRY_WIRING_PIN9 = 5,
|
||||||
|
RASPBERRY_WIRING_PIN7 = 7,
|
||||||
|
RASPBERRY_WIRING_PIN15 = 8,
|
||||||
|
RASPBERRY_WIRING_PIN16 = 10,
|
||||||
|
RASPBERRY_WIRING_PIN0 = 11,
|
||||||
|
RASPBERRY_WIRING_PIN1 = 12,
|
||||||
|
RASPBERRY_WIRING_PIN2 = 13,
|
||||||
|
RASPBERRY_WIRING_PIN3 = 15,
|
||||||
|
RASPBERRY_WIRING_PIN4 = 16,
|
||||||
|
RASPBERRY_WIRING_PIN5 = 18,
|
||||||
|
RASPBERRY_WIRING_PIN12 = 19,
|
||||||
|
RASPBERRY_WIRING_PIN13 = 21,
|
||||||
|
RASPBERRY_WIRING_PIN6 = 22,
|
||||||
|
RASPBERRY_WIRING_PIN14 = 23,
|
||||||
|
RASPBERRY_WIRING_PIN10 = 24,
|
||||||
|
RASPBERRY_WIRING_PIN11 = 26,
|
||||||
|
RASPBERRY_WIRING_PIN17 = 29, // RPi B V2
|
||||||
|
RASPBERRY_WIRING_PIN21 = 29,
|
||||||
|
RASPBERRY_WIRING_PIN18 = 30, // RPi B V2
|
||||||
|
RASPBERRY_WIRING_PIN19 = 31, // RPI B V2
|
||||||
|
RASPBERRY_WIRING_PIN22 = 31,
|
||||||
|
RASPBERRY_WIRING_PIN20 = 32, // RPi B V2
|
||||||
|
RASPBERRY_WIRING_PIN26 = 32,
|
||||||
|
RASPBERRY_WIRING_PIN23 = 33,
|
||||||
|
RASPBERRY_WIRING_PIN24 = 35,
|
||||||
|
RASPBERRY_WIRING_PIN27 = 36,
|
||||||
|
RASPBERRY_WIRING_PIN25 = 37,
|
||||||
|
RASPBERRY_WIRING_PIN28 = 38,
|
||||||
|
RASPBERRY_WIRING_PIN29 = 40
|
||||||
|
} RaspberryWiring;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MRAA return codes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
SUCCESS = 0, /**< Expected response */
|
||||||
|
ERROR_FEATURE_NOT_IMPLEMENTED = 1, /**< Feature TODO */
|
||||||
|
ERROR_FEATURE_NOT_SUPPORTED = 2, /**< Feature not supported by HW */
|
||||||
|
ERROR_INVALID_VERBOSITY_LEVEL = 3, /**< Verbosity level wrong */
|
||||||
|
ERROR_INVALID_PARAMETER = 4, /**< Parameter invalid */
|
||||||
|
ERROR_INVALID_HANDLE = 5, /**< Handle invalid */
|
||||||
|
ERROR_NO_RESOURCES = 6, /**< No resource of that type avail */
|
||||||
|
ERROR_INVALID_RESOURCE = 7, /**< Resource invalid */
|
||||||
|
ERROR_INVALID_QUEUE_TYPE = 8, /**< Queue type incorrect */
|
||||||
|
ERROR_NO_DATA_AVAILABLE = 9, /**< No data available */
|
||||||
|
ERROR_INVALID_PLATFORM = 10, /**< Platform not recognised */
|
||||||
|
ERROR_PLATFORM_NOT_INITIALISED = 11, /**< Board information not initialised */
|
||||||
|
ERROR_UART_OW_SHORTED = 12, /**< UART OW Short Circuit Detected*/
|
||||||
|
ERROR_UART_OW_NO_DEVICES = 13, /**< UART OW No devices detected */
|
||||||
|
ERROR_UART_OW_DATA_ERROR = 14, /**< UART OW Data/Bus error detected */
|
||||||
|
|
||||||
|
ERROR_UNSPECIFIED = 99 /**< Unknown Error */
|
||||||
|
} Result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum representing different possible modes for a pin.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
PIN_VALID = 0, /**< Pin Valid */
|
||||||
|
PIN_GPIO = 1, /**< General Purpose IO */
|
||||||
|
PIN_PWM = 2, /**< Pulse Width Modulation */
|
||||||
|
PIN_FAST_GPIO = 3, /**< Faster GPIO */
|
||||||
|
PIN_SPI = 4, /**< SPI */
|
||||||
|
PIN_I2C = 5, /**< I2C */
|
||||||
|
PIN_AIO = 6, /**< Analog in */
|
||||||
|
PIN_UART = 7 /**< UART */
|
||||||
|
} Pinmodes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum reprensenting different i2c speeds/modes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
I2C_STD = 0, /**< up to 100Khz */
|
||||||
|
I2C_FAST = 1, /**< up to 400Khz */
|
||||||
|
I2C_HIGH = 2 /**< up to 3.4Mhz */
|
||||||
|
} I2cMode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
UART_PARITY_NONE = 0,
|
||||||
|
UART_PARITY_EVEN = 1,
|
||||||
|
UART_PARITY_ODD = 2,
|
||||||
|
UART_PARITY_MARK = 3,
|
||||||
|
UART_PARITY_SPACE = 4
|
||||||
|
} UartParity;
|
||||||
|
|
||||||
|
}
|
||||||
178
include/mraa/uart.h
Normal file
178
include/mraa/uart.h
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Contributions: Jon Trulson <jtrulson@ics.com>
|
||||||
|
* Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Copyright (c) 2014 - 2015 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief UART module
|
||||||
|
*
|
||||||
|
* UART is the Universal asynchronous receiver/transmitter interface to
|
||||||
|
* libmraa. It allows the exposure of UART pins on supported boards.
|
||||||
|
* With functionality to expand at a later date.
|
||||||
|
*
|
||||||
|
* @snippet uart.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
typedef struct _uart* mraa_uart_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise uart_context, uses board mapping
|
||||||
|
*
|
||||||
|
* @param uart the index of the uart set to use
|
||||||
|
* @return uart context or NULL
|
||||||
|
*/
|
||||||
|
mraa_uart_context mraa_uart_init(int uart);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise a raw uart_context. No board setup.
|
||||||
|
*
|
||||||
|
* @param path for example "/dev/ttyS0"
|
||||||
|
* @return uart context or NULL
|
||||||
|
*/
|
||||||
|
mraa_uart_context mraa_uart_init_raw(const char* path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush the outbound data.
|
||||||
|
* Blocks until complete.
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_flush(mraa_uart_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the baudrate.
|
||||||
|
* Takes an int and will attempt to decide what baudrate is
|
||||||
|
* to be used on the UART hardware.
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @param baud unsigned int of baudrate i.e. 9600
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_set_baudrate(mraa_uart_context dev, unsigned int baud);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the transfer mode
|
||||||
|
* For example setting the mode to 8N1 would be
|
||||||
|
* "mraa_uart_set_mode(dev, 8,MRAA_UART_PARITY_NONE , 1)"
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @param bytesize data bits
|
||||||
|
* @param parity Parity bit setting
|
||||||
|
* @param stopbits stop bits
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_set_mode(mraa_uart_context dev, int bytesize, mraa_uart_parity_t parity, int stopbits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the flowcontrol
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @param xonxoff XON/XOFF Software flow control.
|
||||||
|
* @param rtscts RTS/CTS out of band hardware flow control
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_set_flowcontrol(mraa_uart_context dev, mraa_boolean_t xonxoff, mraa_boolean_t rtscts);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the timeout for read and write operations
|
||||||
|
* <= 0 will disable that timeout
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @param read read timeout
|
||||||
|
* @param write write timeout
|
||||||
|
* @param interchar inbetween char timeout
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_set_timeout(mraa_uart_context dev, int read, int write, int interchar);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the blocking state for write operations
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @param nonblock new nonblocking state
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_set_non_blocking(mraa_uart_context dev, mraa_boolean_t nonblock);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Char pointer with tty device path within Linux
|
||||||
|
* For example. Could point to "/dev/ttyS0"
|
||||||
|
*
|
||||||
|
* @param dev uart context
|
||||||
|
* @return char pointer of device path
|
||||||
|
*/
|
||||||
|
const char* mraa_uart_get_dev_path(mraa_uart_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a mraa_uart_context
|
||||||
|
*
|
||||||
|
* @param dev uart context
|
||||||
|
* @return mraa_result_t
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_stop(mraa_uart_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read bytes from the device into a buffer
|
||||||
|
*
|
||||||
|
* @param dev uart context
|
||||||
|
* @param buf buffer pointer
|
||||||
|
* @param length maximum size of buffer
|
||||||
|
* @return the number of bytes read, or -1 if an error occurred
|
||||||
|
*/
|
||||||
|
int mraa_uart_read(mraa_uart_context dev, char* buf, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write bytes in buffer to a device
|
||||||
|
*
|
||||||
|
* @param dev uart context
|
||||||
|
* @param buf buffer pointer
|
||||||
|
* @param length maximum size of buffer
|
||||||
|
* @return the number of bytes written, or -1 if an error occurred
|
||||||
|
*/
|
||||||
|
int mraa_uart_write(mraa_uart_context dev, const char* buf, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to see if data is available on the device for reading
|
||||||
|
*
|
||||||
|
* @param dev uart context
|
||||||
|
* @param millis number of milliseconds to wait, or 0 to return immediately
|
||||||
|
* @return 1 if there is data available to read, 0 otherwise
|
||||||
|
*/
|
||||||
|
mraa_boolean_t mraa_uart_data_available(mraa_uart_context dev, unsigned int millis);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
274
include/mraa/uart.hpp
Normal file
274
include/mraa/uart.hpp
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
/*
|
||||||
|
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
|
||||||
|
* Contributions: Jon Trulson <jtrulson@ics.com>
|
||||||
|
* Contributions: Thomas Ingleby <thomas.c.ingleby@intel.com>
|
||||||
|
* Copyright (c) 2014 - 2015 Intel Corporation.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API to UART (enabling only)
|
||||||
|
*
|
||||||
|
* This file defines the UART interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet Uart-example.cpp Interesting
|
||||||
|
*/
|
||||||
|
class Uart
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Uart Constructor, takes a pin number which will map directly to the
|
||||||
|
* linux uart number, this 'enables' the uart, nothing more
|
||||||
|
*
|
||||||
|
* @param uart the index of the uart set to use
|
||||||
|
*/
|
||||||
|
Uart(int uart)
|
||||||
|
{
|
||||||
|
m_uart = mraa_uart_init(uart);
|
||||||
|
|
||||||
|
if (m_uart == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising UART");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uart Constructor, takes a string to the path of the serial
|
||||||
|
* interface that is needed.
|
||||||
|
*
|
||||||
|
* @param uart the index of the uart set to use
|
||||||
|
*/
|
||||||
|
Uart(std::string path)
|
||||||
|
{
|
||||||
|
m_uart = mraa_uart_init_raw(path.c_str());
|
||||||
|
|
||||||
|
if (m_uart == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising UART");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uart Constructor, takes a pointer to the UART context and initialises
|
||||||
|
* the UART class
|
||||||
|
*
|
||||||
|
* @param void * to a UART context
|
||||||
|
*/
|
||||||
|
Uart(void* uart_context)
|
||||||
|
{
|
||||||
|
m_uart = (mraa_uart_context) uart_context;
|
||||||
|
|
||||||
|
if (m_uart == NULL) {
|
||||||
|
throw std::invalid_argument("Invalid UART context");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Uart destructor
|
||||||
|
*/
|
||||||
|
~Uart()
|
||||||
|
{
|
||||||
|
mraa_uart_stop(m_uart);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string with tty device path within Linux
|
||||||
|
* For example. Could point to "/dev/ttyS0"
|
||||||
|
*
|
||||||
|
* @return char pointer of device path
|
||||||
|
*/
|
||||||
|
std::string
|
||||||
|
getDevicePath()
|
||||||
|
{
|
||||||
|
std::string ret_val(mraa_uart_get_dev_path(m_uart));
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read bytes from the device into char* buffer
|
||||||
|
*
|
||||||
|
* @param data buffer pointer
|
||||||
|
* @param length maximum size of buffer
|
||||||
|
* @return numbers of bytes read
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
read(char* data, int length)
|
||||||
|
{
|
||||||
|
return mraa_uart_read(m_uart, data, (size_t) length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write bytes in String object to a device
|
||||||
|
*
|
||||||
|
* @param data buffer pointer
|
||||||
|
* @param length maximum size of buffer
|
||||||
|
* @return the number of bytes written, or -1 if an error occurred
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
write(const char* data, int length)
|
||||||
|
{
|
||||||
|
return mraa_uart_write(m_uart, data, (size_t) length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read bytes from the device into a String object
|
||||||
|
*
|
||||||
|
* @param length to read
|
||||||
|
* @throws std::bad_alloc If there is no space left for read.
|
||||||
|
* @return string of data
|
||||||
|
*/
|
||||||
|
std::string
|
||||||
|
readStr(int length)
|
||||||
|
{
|
||||||
|
char* data = (char*) malloc(sizeof(char) * length);
|
||||||
|
if (data == NULL) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
int v = mraa_uart_read(m_uart, data, (size_t) length);
|
||||||
|
std::string ret(data, v);
|
||||||
|
free(data);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write bytes in String object to a device
|
||||||
|
*
|
||||||
|
* @param string to write
|
||||||
|
* @return the number of bytes written, or -1 if an error occurred
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
writeStr(std::string data)
|
||||||
|
{
|
||||||
|
// this is data.length() not +1 because we want to avoid the '\0' char
|
||||||
|
return mraa_uart_write(m_uart, data.c_str(), (data.length()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to see if data is available on the device for reading
|
||||||
|
*
|
||||||
|
* @param millis number of milliseconds to wait, or 0 to return immediately
|
||||||
|
* @return true if there is data available to read, false otherwise
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
dataAvailable(unsigned int millis = 0)
|
||||||
|
{
|
||||||
|
if (mraa_uart_data_available(m_uart, millis))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush the outbound data.
|
||||||
|
* Blocks until complete.
|
||||||
|
*
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
flush()
|
||||||
|
{
|
||||||
|
return (Result) mraa_uart_flush(m_uart);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the baudrate.
|
||||||
|
* Takes an int and will attempt to decide what baudrate is
|
||||||
|
* to be used on the UART hardware.
|
||||||
|
*
|
||||||
|
* @param baud unsigned int of baudrate i.e. 9600
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
setBaudRate(unsigned int baud)
|
||||||
|
{
|
||||||
|
return (Result) mraa_uart_set_baudrate(m_uart, baud);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the transfer mode
|
||||||
|
* For example setting the mode to 8N1 would be
|
||||||
|
* "dev.setMode(8,UART_PARITY_NONE , 1)"
|
||||||
|
*
|
||||||
|
* @param bytesize data bits
|
||||||
|
* @param parity Parity bit setting
|
||||||
|
* @param stopbits stop bits
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
setMode(int bytesize, UartParity parity, int stopbits)
|
||||||
|
{
|
||||||
|
return (Result) mraa_uart_set_mode(m_uart, bytesize, (mraa_uart_parity_t) parity, stopbits);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the flowcontrol
|
||||||
|
*
|
||||||
|
* @param xonxoff XON/XOFF Software flow control.
|
||||||
|
* @param rtscts RTS/CTS out of band hardware flow control
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
setFlowcontrol(bool xonxoff, bool rtscts)
|
||||||
|
{
|
||||||
|
return (Result) mraa_uart_set_flowcontrol(m_uart, xonxoff, rtscts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the timeout for read and write operations
|
||||||
|
* <= 0 will disable that timeout
|
||||||
|
*
|
||||||
|
* @param read read timeout
|
||||||
|
* @param write write timeout
|
||||||
|
* @param interchar inbetween char timeout
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
setTimeout(int read, int write, int interchar)
|
||||||
|
{
|
||||||
|
return (Result) mraa_uart_set_timeout(m_uart, read, write, interchar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the blocking state for write operations
|
||||||
|
*
|
||||||
|
* @param dev The UART context
|
||||||
|
* @param nonblock new nonblocking state
|
||||||
|
* @return Result of operation
|
||||||
|
*/
|
||||||
|
Result
|
||||||
|
SetNonBlocking(bool nonblock)
|
||||||
|
{
|
||||||
|
return (Result) mraa_uart_set_non_blocking(m_uart, nonblock);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_uart_context m_uart;
|
||||||
|
};
|
||||||
|
}
|
||||||
197
include/mraa/uart_ow.h
Normal file
197
include/mraa/uart_ow.h
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* Author: Jon Trulson <jtrulson@ics.com>
|
||||||
|
* Copyright (c) 2016 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief UART OW module
|
||||||
|
*
|
||||||
|
* This module allows one to use MRAA's UART support in order to
|
||||||
|
* interact with Dallas 1-wire compliant devices on a 1-wire bus. It
|
||||||
|
* makes use of the UART for timing purposes. The principle of
|
||||||
|
* operation is described here:
|
||||||
|
* https://www.maximintegrated.com/en/app-notes/index.mvp/id/214
|
||||||
|
*
|
||||||
|
* It is important the you use a UART with CMOS/TTL level voltages
|
||||||
|
* (3.3v/5v) RX and TX lines. DO NOT use standard RS232 level
|
||||||
|
* voltages, or you are going to have a bad day.
|
||||||
|
*
|
||||||
|
* In addition, a diode should be placed across the RX and
|
||||||
|
* TX lines like so:
|
||||||
|
*
|
||||||
|
* -|
|
||||||
|
* U|
|
||||||
|
* A| TX---|<--+
|
||||||
|
* R| |
|
||||||
|
* T| RX-------o--------o 1-wire data bus
|
||||||
|
* -|
|
||||||
|
*
|
||||||
|
* The diode on TX is a 1N4148 (cheap and common), with the cathode
|
||||||
|
* connected to TX, and the anode connected to RX and the rest of the
|
||||||
|
* 1-wire data line.
|
||||||
|
*
|
||||||
|
* @snippet uart_ow.c Interesting
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
/* for now, we simply use the normal MRAA UART context */
|
||||||
|
typedef struct _mraa_uart_ow {
|
||||||
|
mraa_uart_context uart;
|
||||||
|
/* search state */
|
||||||
|
unsigned char ROM_NO[8]; /* 8 byte (64b) rom code */
|
||||||
|
int LastDiscrepancy;
|
||||||
|
int LastFamilyDiscrepancy;
|
||||||
|
mraa_boolean_t LastDeviceFlag;
|
||||||
|
} *mraa_uart_ow_context;
|
||||||
|
|
||||||
|
/* 8 bytes (64 bits) for a device rom code */
|
||||||
|
static const int MRAA_UART_OW_ROMCODE_SIZE = 8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UART One Wire ROM related Command bytes
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MRAA_UART_OW_CMD_READ_ROM = 0x33, /**< read rom, when only one device on bus */
|
||||||
|
MRAA_UART_OW_CMD_MATCH_ROM = 0x55, /**< match a specific rom code */
|
||||||
|
MRAA_UART_OW_CMD_SKIP_ROM = 0xcc, /**< skip match/search rom */
|
||||||
|
MRAA_UART_OW_CMD_SEARCH_ROM_ALARM = 0xec, /**< search all roms in alarm state */
|
||||||
|
MRAA_UART_OW_CMD_SEARCH_ROM = 0xf0 /**< search all rom codes */
|
||||||
|
} mraa_uart_ow_rom_cmd_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise uart_ow_context, uses UART board mapping
|
||||||
|
*
|
||||||
|
* @param uart the index of the uart set to use
|
||||||
|
* @return uart_ow context or NULL
|
||||||
|
*/
|
||||||
|
mraa_uart_ow_context mraa_uart_ow_init(int uart);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise a raw uart_ow_context. No board setup.
|
||||||
|
*
|
||||||
|
* @param path for example "/dev/ttyS0"
|
||||||
|
* @return uart_ow context or NULL
|
||||||
|
*/
|
||||||
|
mraa_uart_ow_context mraa_uart_ow_init_raw(const char* path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get char pointer with tty device path within Linux
|
||||||
|
* For example. Could point to "/dev/ttyS0"
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @return char pointer of device path
|
||||||
|
*/
|
||||||
|
const char* mraa_uart_ow_get_dev_path(mraa_uart_ow_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a mraa_uart_ow_context
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @return mraa_result_t
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_ow_stop(mraa_uart_ow_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a byte from the 1-wire bus
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @return the byte read or -1 for error
|
||||||
|
*/
|
||||||
|
int mraa_uart_ow_read_byte(mraa_uart_ow_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a byte to a 1-wire bus
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @param byte the byte to write to the bus
|
||||||
|
* @return the byte read back during the time slot or -1 for error
|
||||||
|
*/
|
||||||
|
int mraa_uart_ow_write_byte(mraa_uart_ow_context dev, uint8_t byte);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a bit to a 1-wire bus and read a bit corresponding to the
|
||||||
|
* time slot back. This is possible due to the way we wired the TX
|
||||||
|
* and RX together with a diode, forming a loopback.
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @param bit the bit to write to the bus
|
||||||
|
* @return the bit read back during the time slot or -1 for error
|
||||||
|
*/
|
||||||
|
int mraa_uart_ow_bit(mraa_uart_ow_context dev, uint8_t bit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reset pulse to the 1-wire bus and test for device presence
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @return one of the mraa_result_t values
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_ow_reset(mraa_uart_ow_context dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin a rom code search of the 1-wire bus. This function
|
||||||
|
* implements the 1-wire search algorithm. See the uart_ow.c example
|
||||||
|
* for an idea on how to use this function to identify all devices
|
||||||
|
* present on the bus.
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @param start true to start a new search from scratch, false to
|
||||||
|
* continue an existing search
|
||||||
|
* @param id the 8-byte rom code id of the current matched device when
|
||||||
|
* a device is found
|
||||||
|
* @return one of the mraa_result_t values
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_ow_rom_search(mraa_uart_ow_context dev, mraa_boolean_t start, uint8_t* id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a command byte to a device on the 1-wire bus
|
||||||
|
*
|
||||||
|
* @param dev uart_ow context
|
||||||
|
* @param command the command byte to send
|
||||||
|
* @param id the rom code id of the device to receive the command,
|
||||||
|
* NULL for all devices on the bus
|
||||||
|
* @return one of the mraa_result_t values
|
||||||
|
*/
|
||||||
|
mraa_result_t mraa_uart_ow_command(mraa_uart_ow_context dev, uint8_t command, uint8_t* id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a Dallas 1-wire compliant CRC8 computation on a buffer
|
||||||
|
*
|
||||||
|
* @param buffer the buffer containing the data
|
||||||
|
* @param length the length of the buffer
|
||||||
|
* @return the computed CRC
|
||||||
|
*/
|
||||||
|
uint8_t mraa_uart_ow_crc8(uint8_t* buffer, uint16_t length);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
277
include/mraa/uart_ow.hpp
Normal file
277
include/mraa/uart_ow.hpp
Normal file
@@ -0,0 +1,277 @@
|
|||||||
|
/*
|
||||||
|
* Author: Jon Trulson <jtrulson@ics.com>
|
||||||
|
* Copyright (c) 2016 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "uart_ow.h"
|
||||||
|
#include "types.hpp"
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
namespace mraa
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief API for UART One Wire
|
||||||
|
*
|
||||||
|
* This file defines the UartOW (UART to Dallas 1-wire) interface for libmraa
|
||||||
|
*
|
||||||
|
* @snippet UartOW.cpp Interesting
|
||||||
|
*/
|
||||||
|
class UartOW
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* UartOW Constructor, takes a pin number which will map directly to the
|
||||||
|
* linux uart number, this 'enables' the uart, nothing more
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @param uart the index of the uart to use
|
||||||
|
*/
|
||||||
|
UartOW(int uart)
|
||||||
|
{
|
||||||
|
m_uart = mraa_uart_ow_init(uart);
|
||||||
|
|
||||||
|
if (m_uart == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising UART_OW");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UartOW Constructor, takes a string to the path of the serial
|
||||||
|
* interface that is needed.
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @param path the file path for the UART to use
|
||||||
|
*/
|
||||||
|
UartOW(std::string path)
|
||||||
|
{
|
||||||
|
m_uart = mraa_uart_ow_init_raw(path.c_str());
|
||||||
|
|
||||||
|
if (m_uart == NULL) {
|
||||||
|
throw std::invalid_argument("Error initialising UART");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uart destructor
|
||||||
|
*/
|
||||||
|
~UartOW()
|
||||||
|
{
|
||||||
|
mraa_uart_ow_stop(m_uart);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string with tty device path within Linux
|
||||||
|
* For example. Could point to "/dev/ttyS0"
|
||||||
|
*
|
||||||
|
* @return char pointer of device path
|
||||||
|
*/
|
||||||
|
std::string
|
||||||
|
getDevicePath()
|
||||||
|
{
|
||||||
|
std::string ret_val(mraa_uart_ow_get_dev_path(m_uart));
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a byte from the 1-wire bus
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @return the byte read
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
readByte()
|
||||||
|
{
|
||||||
|
int res = mraa_uart_ow_read_byte(m_uart);
|
||||||
|
if (res == -1) {
|
||||||
|
throw std::invalid_argument("Unknown UART_OW error");
|
||||||
|
}
|
||||||
|
return (uint8_t) res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a byte to a 1-wire bus
|
||||||
|
*
|
||||||
|
* @param byte the byte to write to the bus
|
||||||
|
*
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @return the byte read back during the time slot
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
writeByte(uint8_t byte)
|
||||||
|
{
|
||||||
|
int res = mraa_uart_ow_write_byte(m_uart, byte);
|
||||||
|
if (res == -1) {
|
||||||
|
throw std::invalid_argument("Unknown UART_OW error");
|
||||||
|
}
|
||||||
|
return (uint8_t) res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a bit to a 1-wire bus and read a bit corresponding to the
|
||||||
|
* time slot back. This is possible due to the way we wired the TX
|
||||||
|
* and RX together with a diode, forming a loopback.
|
||||||
|
*
|
||||||
|
* @param bit the bit to write to the bus
|
||||||
|
* @throws std::invalid_argument in case of error
|
||||||
|
* @return the bit read back during the time slot
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
writeBit(bool bit)
|
||||||
|
{
|
||||||
|
int res = mraa_uart_ow_bit(m_uart, (bit) ? 1 : 0);
|
||||||
|
if (res == -1) {
|
||||||
|
throw std::invalid_argument("Unknown UART_OW error");
|
||||||
|
}
|
||||||
|
return ((res) ? true : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a reset pulse to the 1-wire bus and test for device presence
|
||||||
|
*
|
||||||
|
* @return one of the mraa::Result values
|
||||||
|
*/
|
||||||
|
mraa::Result
|
||||||
|
reset()
|
||||||
|
{
|
||||||
|
return (mraa::Result) mraa_uart_ow_reset(m_uart);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin a rom code search of the 1-wire bus. This function
|
||||||
|
* implements the 1-wire search algorithm. See the uart_ow.c example
|
||||||
|
* for an idea on how to use this function to identify all devices
|
||||||
|
* present on the bus.
|
||||||
|
*
|
||||||
|
* @param start true to start a search from scratch, false to
|
||||||
|
* continue a previously started search
|
||||||
|
* @param id the 8-byte rom code id of the current matched device when a
|
||||||
|
* device is found
|
||||||
|
* @return one of the mraa::Result values
|
||||||
|
*/
|
||||||
|
mraa::Result
|
||||||
|
search(bool start, uint8_t* id)
|
||||||
|
{
|
||||||
|
return (mraa::Result) mraa_uart_ow_rom_search(m_uart, (start) ? 1 : 0, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin a rom code search of the 1-wire bus. This function
|
||||||
|
* implements the 1-wire search algorithm. See the UartOW.cpp
|
||||||
|
* example for an idea on how to use this function to identify all
|
||||||
|
* devices present on the bus.
|
||||||
|
*
|
||||||
|
* @param start true to start a search from scratch, false to
|
||||||
|
* continue a previously started search
|
||||||
|
* @return an empty string if no [more] devices are found, or a
|
||||||
|
* string containing the 8-byte romcode of a detected device.
|
||||||
|
*/
|
||||||
|
std::string
|
||||||
|
search(bool start)
|
||||||
|
{
|
||||||
|
uint8_t id[MRAA_UART_OW_ROMCODE_SIZE];
|
||||||
|
mraa_result_t rv;
|
||||||
|
|
||||||
|
rv = mraa_uart_ow_rom_search(m_uart, (start) ? 1 : 0, id);
|
||||||
|
|
||||||
|
if (rv == MRAA_SUCCESS) {
|
||||||
|
// we found one
|
||||||
|
std::string idStr((char*) id, MRAA_UART_OW_ROMCODE_SIZE);
|
||||||
|
return idStr;
|
||||||
|
} else {
|
||||||
|
// failure, or end of search
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a command byte to a device on the 1-wire bus
|
||||||
|
*
|
||||||
|
* @param command the command byte to send
|
||||||
|
* @param id the rom code id of the device to receive the command,
|
||||||
|
* NULL for all devices on the bus
|
||||||
|
* @return one of the mraa::Result values
|
||||||
|
*/
|
||||||
|
mraa::Result
|
||||||
|
command(uint8_t command, uint8_t* id)
|
||||||
|
{
|
||||||
|
return (mraa::Result) mraa_uart_ow_command(m_uart, command, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a command byte to a device on the 1-wire bus, supplying
|
||||||
|
* the id as a std::string
|
||||||
|
*
|
||||||
|
* @param command the command byte to send
|
||||||
|
* @param id std::string representing the code id of the device to
|
||||||
|
* receive the command, or an empty string for all devices on the
|
||||||
|
* bus. This string should be 8 bytes in size.
|
||||||
|
* @return one of the mraa::Result values
|
||||||
|
*/
|
||||||
|
mraa::Result
|
||||||
|
command(uint8_t command, std::string id)
|
||||||
|
{
|
||||||
|
if (id.empty() == 0)
|
||||||
|
return (mraa::Result) mraa_uart_ow_command(m_uart, command, NULL);
|
||||||
|
else {
|
||||||
|
if (id.size() != 8) {
|
||||||
|
// Only 8 byte romcodes are legal.
|
||||||
|
throw std::invalid_argument(std::string(__FUNCTION__) +
|
||||||
|
": id must be 8 bytes only");
|
||||||
|
}
|
||||||
|
return (mraa::Result) mraa_uart_ow_command(m_uart, command, (uint8_t*) id.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a Dallas 1-wire compliant CRC8 computation on a buffer
|
||||||
|
*
|
||||||
|
* @param buffer the buffer containing the data
|
||||||
|
* @param length the length of the buffer
|
||||||
|
* @return the computed CRC
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
crc8(uint8_t* buffer, uint16_t length)
|
||||||
|
{
|
||||||
|
return mraa_uart_ow_crc8(buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a Dallas 1-wire compliant CRC8 computation on a
|
||||||
|
* std::string based buffer
|
||||||
|
*
|
||||||
|
* @param buffer std::string buffer containing the data
|
||||||
|
* @return the computed CRC
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
crc8(std::string buffer)
|
||||||
|
{
|
||||||
|
return mraa_uart_ow_crc8((uint8_t*) buffer.c_str(), buffer.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mraa_uart_ow_context m_uart;
|
||||||
|
};
|
||||||
|
}
|
||||||
254
include/wiringPi/wiringPi.h
Normal file
254
include/wiringPi/wiringPi.h
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
/*
|
||||||
|
* wiringPi.h:
|
||||||
|
* Arduino like Wiring library for the Raspberry Pi.
|
||||||
|
* Copyright (c) 2012-2017 Gordon Henderson
|
||||||
|
***********************************************************************
|
||||||
|
* This file is part of wiringPi:
|
||||||
|
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||||
|
*
|
||||||
|
* wiringPi is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* wiringPi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __WIRING_PI_H__
|
||||||
|
#define __WIRING_PI_H__
|
||||||
|
|
||||||
|
// C doesn't have true/false by default and I can never remember which
|
||||||
|
// way round they are, so ...
|
||||||
|
// (and yes, I know about stdbool.h but I like capitals for these and I'm old)
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
# define TRUE (1==1)
|
||||||
|
# define FALSE (!TRUE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// GCC warning suppressor
|
||||||
|
|
||||||
|
#define UNU __attribute__((unused))
|
||||||
|
|
||||||
|
// Mask for the bottom 64 pins which belong to the Raspberry Pi
|
||||||
|
// The others are available for the other devices
|
||||||
|
|
||||||
|
#define PI_GPIO_MASK (0xFFFFFFC0)
|
||||||
|
|
||||||
|
// Handy defines
|
||||||
|
|
||||||
|
// wiringPi modes
|
||||||
|
|
||||||
|
#define WPI_MODE_PINS 0
|
||||||
|
#define WPI_MODE_GPIO 1
|
||||||
|
#define WPI_MODE_GPIO_SYS 2
|
||||||
|
#define WPI_MODE_PHYS 3
|
||||||
|
#define WPI_MODE_PIFACE 4
|
||||||
|
#define WPI_MODE_UNINITIALISED -1
|
||||||
|
|
||||||
|
// Pin modes
|
||||||
|
|
||||||
|
#define INPUT 0
|
||||||
|
#define OUTPUT 1
|
||||||
|
#define PWM_OUTPUT 2
|
||||||
|
#define GPIO_CLOCK 3
|
||||||
|
#define SOFT_PWM_OUTPUT 4
|
||||||
|
#define SOFT_TONE_OUTPUT 5
|
||||||
|
#define PWM_TONE_OUTPUT 6
|
||||||
|
|
||||||
|
#define LOW 0
|
||||||
|
#define HIGH 1
|
||||||
|
|
||||||
|
// Pull up/down/none
|
||||||
|
|
||||||
|
#define PUD_OFF 0
|
||||||
|
#define PUD_DOWN 1
|
||||||
|
#define PUD_UP 2
|
||||||
|
|
||||||
|
// PWM
|
||||||
|
|
||||||
|
#define PWM_MODE_MS 0
|
||||||
|
#define PWM_MODE_BAL 1
|
||||||
|
|
||||||
|
// Interrupt levels
|
||||||
|
|
||||||
|
#define INT_EDGE_SETUP 0
|
||||||
|
#define INT_EDGE_FALLING 1
|
||||||
|
#define INT_EDGE_RISING 2
|
||||||
|
#define INT_EDGE_BOTH 3
|
||||||
|
|
||||||
|
// Pi model types and version numbers
|
||||||
|
// Intended for the GPIO program Use at your own risk.
|
||||||
|
|
||||||
|
#define PI_MODEL_A 0
|
||||||
|
#define PI_MODEL_B 1
|
||||||
|
#define PI_MODEL_AP 2
|
||||||
|
#define PI_MODEL_BP 3
|
||||||
|
#define PI_MODEL_2 4
|
||||||
|
#define PI_ALPHA 5
|
||||||
|
#define PI_MODEL_CM 6
|
||||||
|
#define PI_MODEL_07 7
|
||||||
|
#define PI_MODEL_3 8
|
||||||
|
#define PI_MODEL_ZERO 9
|
||||||
|
#define PI_MODEL_CM3 10
|
||||||
|
#define PI_MODEL_ZERO_W 12
|
||||||
|
|
||||||
|
#define PI_VERSION_1 0
|
||||||
|
#define PI_VERSION_1_1 1
|
||||||
|
#define PI_VERSION_1_2 2
|
||||||
|
#define PI_VERSION_2 3
|
||||||
|
|
||||||
|
#define PI_MAKER_SONY 0
|
||||||
|
#define PI_MAKER_EGOMAN 1
|
||||||
|
#define PI_MAKER_EMBEST 2
|
||||||
|
#define PI_MAKER_UNKNOWN 3
|
||||||
|
|
||||||
|
extern const char *piModelNames [16] ;
|
||||||
|
extern const char *piRevisionNames [16] ;
|
||||||
|
extern const char *piMakerNames [16] ;
|
||||||
|
extern const int piMemorySize [ 8] ;
|
||||||
|
|
||||||
|
|
||||||
|
// Intended for the GPIO program Use at your own risk.
|
||||||
|
|
||||||
|
// Threads
|
||||||
|
|
||||||
|
#define PI_THREAD(X) void *X (UNU void *dummy)
|
||||||
|
|
||||||
|
// Failure modes
|
||||||
|
|
||||||
|
#define WPI_FATAL (1==1)
|
||||||
|
#define WPI_ALMOST (1==2)
|
||||||
|
|
||||||
|
|
||||||
|
// wiringPiNodeStruct:
|
||||||
|
// This describes additional device nodes in the extended wiringPi
|
||||||
|
// 2.0 scheme of things.
|
||||||
|
// It's a simple linked list for now, but will hopefully migrate to
|
||||||
|
// a binary tree for efficiency reasons - but then again, the chances
|
||||||
|
// of more than 1 or 2 devices being added are fairly slim, so who
|
||||||
|
// knows....
|
||||||
|
|
||||||
|
struct wiringPiNodeStruct
|
||||||
|
{
|
||||||
|
int pinBase ;
|
||||||
|
int pinMax ;
|
||||||
|
|
||||||
|
int fd ; // Node specific
|
||||||
|
unsigned int data0 ; // ditto
|
||||||
|
unsigned int data1 ; // ditto
|
||||||
|
unsigned int data2 ; // ditto
|
||||||
|
unsigned int data3 ; // ditto
|
||||||
|
|
||||||
|
void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode) ;
|
||||||
|
void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ;
|
||||||
|
int (*digitalRead) (struct wiringPiNodeStruct *node, int pin) ;
|
||||||
|
//unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin) ;
|
||||||
|
void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value) ;
|
||||||
|
// void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value) ;
|
||||||
|
void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value) ;
|
||||||
|
int (*analogRead) (struct wiringPiNodeStruct *node, int pin) ;
|
||||||
|
void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value) ;
|
||||||
|
|
||||||
|
struct wiringPiNodeStruct *next ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
extern struct wiringPiNodeStruct *wiringPiNodes ;
|
||||||
|
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
// c++ wrappers thanks to a comment by Nick Lott
|
||||||
|
// (and others on the Raspberry Pi forums)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Data
|
||||||
|
|
||||||
|
// Internal
|
||||||
|
|
||||||
|
extern int wiringPiFailure (int fatal, const char *message, ...) ;
|
||||||
|
|
||||||
|
// Core wiringPi functions
|
||||||
|
|
||||||
|
extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ;
|
||||||
|
extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ;
|
||||||
|
|
||||||
|
extern void wiringPiVersion (int *major, int *minor) ;
|
||||||
|
extern int wiringPiSetup (void) ;
|
||||||
|
extern int wiringPiSetupSys (void) ;
|
||||||
|
extern int wiringPiSetupGpio (void) ;
|
||||||
|
extern int wiringPiSetupPhys (void) ;
|
||||||
|
|
||||||
|
extern void pinModeAlt (int pin, int mode) ;
|
||||||
|
extern void pinMode (int pin, int mode) ;
|
||||||
|
extern void pullUpDnControl (int pin, int pud) ;
|
||||||
|
extern int digitalRead (int pin) ;
|
||||||
|
extern void digitalWrite (int pin, int value) ;
|
||||||
|
extern unsigned int digitalRead8 (int pin) ;
|
||||||
|
extern void digitalWrite8 (int pin, int value) ;
|
||||||
|
extern void pwmWrite (int pin, int value) ;
|
||||||
|
extern int analogRead (int pin) ;
|
||||||
|
extern void analogWrite (int pin, int value) ;
|
||||||
|
|
||||||
|
// PiFace specifics
|
||||||
|
// (Deprecated)
|
||||||
|
|
||||||
|
extern int wiringPiSetupPiFace (void) ;
|
||||||
|
extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only
|
||||||
|
|
||||||
|
// On-Board Raspberry Pi hardware specific stuff
|
||||||
|
|
||||||
|
extern int piGpioLayout (void) ;
|
||||||
|
extern int piBoardRev (void) ; // Deprecated
|
||||||
|
extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) ;
|
||||||
|
extern int wpiPinToGpio (int wpiPin) ;
|
||||||
|
extern int physPinToGpio (int physPin) ;
|
||||||
|
extern void setPadDrive (int group, int value) ;
|
||||||
|
extern int getAlt (int pin) ;
|
||||||
|
extern void pwmToneWrite (int pin, int freq) ;
|
||||||
|
extern void pwmSetMode (int mode) ;
|
||||||
|
extern void pwmSetRange (unsigned int range) ;
|
||||||
|
extern void pwmSetClock (int divisor) ;
|
||||||
|
extern void gpioClockSet (int pin, int freq) ;
|
||||||
|
extern unsigned int digitalReadByte (void) ;
|
||||||
|
extern unsigned int digitalReadByte2 (void) ;
|
||||||
|
extern void digitalWriteByte (int value) ;
|
||||||
|
extern void digitalWriteByte2 (int value) ;
|
||||||
|
|
||||||
|
// Interrupts
|
||||||
|
// (Also Pi hardware specific)
|
||||||
|
|
||||||
|
extern int waitForInterrupt (int pin, int mS) ;
|
||||||
|
extern int wiringPiISR (int pin, int mode, void (*function)(void)) ;
|
||||||
|
|
||||||
|
// Threads
|
||||||
|
|
||||||
|
extern int piThreadCreate (void *(*fn)(void *)) ;
|
||||||
|
extern void piLock (int key) ;
|
||||||
|
extern void piUnlock (int key) ;
|
||||||
|
|
||||||
|
// Schedulling priority
|
||||||
|
|
||||||
|
extern int piHiPri (const int pri) ;
|
||||||
|
|
||||||
|
// Extras from arduino land
|
||||||
|
|
||||||
|
extern void delay (unsigned int howLong) ;
|
||||||
|
extern void delayMicroseconds (unsigned int howLong) ;
|
||||||
|
extern unsigned int millis (void) ;
|
||||||
|
extern unsigned int micros (void) ;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
42
include/wiringPi/wiringPiI2C.h
Normal file
42
include/wiringPi/wiringPiI2C.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* wiringPiI2C.h:
|
||||||
|
* Simplified I2C access routines
|
||||||
|
* Copyright (c) 2013 Gordon Henderson
|
||||||
|
***********************************************************************
|
||||||
|
* This file is part of wiringPi:
|
||||||
|
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||||
|
*
|
||||||
|
* wiringPi is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* wiringPi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with wiringPi.
|
||||||
|
* If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int wiringPiI2CRead (int fd) ;
|
||||||
|
extern int wiringPiI2CReadReg8 (int fd, int reg) ;
|
||||||
|
extern int wiringPiI2CReadReg16 (int fd, int reg) ;
|
||||||
|
|
||||||
|
extern int wiringPiI2CWrite (int fd, int data) ;
|
||||||
|
extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ;
|
||||||
|
extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ;
|
||||||
|
|
||||||
|
extern int wiringPiI2CSetupInterface (const char *device, int devId) ;
|
||||||
|
extern int wiringPiI2CSetup (const int devId) ;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
36
include/wiringPi/wiringPiSPI.h
Normal file
36
include/wiringPi/wiringPiSPI.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* wiringPiSPI.h:
|
||||||
|
* Simplified SPI access routines
|
||||||
|
* Copyright (c) 2012-2015 Gordon Henderson
|
||||||
|
***********************************************************************
|
||||||
|
* This file is part of wiringPi:
|
||||||
|
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||||
|
*
|
||||||
|
* wiringPi is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* wiringPi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with wiringPi.
|
||||||
|
* If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int wiringPiSPIGetFd (int channel) ;
|
||||||
|
int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;
|
||||||
|
int wiringPiSPISetupMode (int channel, int speed, int mode) ;
|
||||||
|
int wiringPiSPISetup (int channel, int speed) ;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
38
include/wiringPi/wiringSerial.h
Normal file
38
include/wiringPi/wiringSerial.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* wiringSerial.h:
|
||||||
|
* Handle a serial port
|
||||||
|
***********************************************************************
|
||||||
|
* This file is part of wiringPi:
|
||||||
|
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||||
|
*
|
||||||
|
* wiringPi is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* wiringPi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int serialOpen (const char *device, const int baud) ;
|
||||||
|
extern void serialClose (const int fd) ;
|
||||||
|
extern void serialFlush (const int fd) ;
|
||||||
|
extern void serialPutchar (const int fd, const unsigned char c) ;
|
||||||
|
extern void serialPuts (const int fd, const char *s) ;
|
||||||
|
extern void serialPrintf (const int fd, const char *message, ...) ;
|
||||||
|
extern int serialDataAvail (const int fd) ;
|
||||||
|
extern int serialGetchar (const int fd) ;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
41
include/wiringPi/wiringShift.h
Normal file
41
include/wiringPi/wiringShift.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* wiringShift.h:
|
||||||
|
* Emulate some of the Arduino wiring functionality.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2012 Gordon Henderson.
|
||||||
|
***********************************************************************
|
||||||
|
* This file is part of wiringPi:
|
||||||
|
* https://projects.drogon.net/raspberry-pi/wiringpi/
|
||||||
|
*
|
||||||
|
* wiringPi is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* wiringPi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LSBFIRST 0
|
||||||
|
#define MSBFIRST 1
|
||||||
|
|
||||||
|
#ifndef _STDINT_H
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) ;
|
||||||
|
extern void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) ;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
110
src/AnalogIn.cpp
Normal file
110
src/AnalogIn.cpp
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* AnalogIn.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 27, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "AnalogIn.h"
|
||||||
|
|
||||||
|
AnalogIn::AnalogIn(int channel, double rawMin, double rawMax, double euMin, double euMax) {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
this->channel = channel;
|
||||||
|
if (channel != 99){
|
||||||
|
channelMux[0] = MUX_VALUES[channel][0];
|
||||||
|
channelMux[1] = MUX_VALUES[channel][1];
|
||||||
|
channelMux[2] = MUX_VALUES[channel][2];
|
||||||
|
}
|
||||||
|
badReads = 0;
|
||||||
|
this->rawMax = rawMax;
|
||||||
|
this->rawMin = rawMin;
|
||||||
|
this->euMax = euMax;
|
||||||
|
this->euMin = euMin;
|
||||||
|
|
||||||
|
lastValue = 0;
|
||||||
|
rawValue = 0;
|
||||||
|
|
||||||
|
|
||||||
|
m = (euMax - euMin) / (rawMax - rawMin);
|
||||||
|
b = euMax - m * (rawMax);
|
||||||
|
}
|
||||||
|
void shiftright (double myarray[], int size)
|
||||||
|
{
|
||||||
|
double temp;
|
||||||
|
|
||||||
|
for (int i=0; i<(size -1); i++)
|
||||||
|
{
|
||||||
|
temp = myarray[size-1];
|
||||||
|
myarray[size-1] = myarray[i];
|
||||||
|
myarray[i] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double AnalogIn::getHistory(int index){
|
||||||
|
return history[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
double AnalogIn::getLastValue(){
|
||||||
|
return lastValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int AnalogIn::getRawValue(){
|
||||||
|
return rawValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
long AnalogIn::getBadReads(){
|
||||||
|
return badReads;
|
||||||
|
}
|
||||||
|
|
||||||
|
double AnalogIn::setValue(int value){
|
||||||
|
rawValue = value;
|
||||||
|
double pv = m * rawValue + b;
|
||||||
|
lastValue = pv;
|
||||||
|
//TODO: lastStored = Instant.now();
|
||||||
|
shiftright(history, 100);
|
||||||
|
history[0] = lastValue;
|
||||||
|
return pv;
|
||||||
|
}
|
||||||
|
|
||||||
|
double AnalogIn::read(MuxSetup *mux){
|
||||||
|
mux->set(channelMux[0], channelMux[1], channelMux[2]);
|
||||||
|
int rawIn = mux->readAnalog();
|
||||||
|
if (rawIn != -1){
|
||||||
|
badReads = 0;
|
||||||
|
return setValue(rawIn);
|
||||||
|
} else {
|
||||||
|
badReads++;
|
||||||
|
}
|
||||||
|
if (badReads > 10){
|
||||||
|
std::cout <<"Too many bad reads" << std::endl;
|
||||||
|
|
||||||
|
// mux->preAnalogWrite();
|
||||||
|
// mux->postAnalogWrite();
|
||||||
|
}
|
||||||
|
return lastValue;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
AnalogIn::~AnalogIn() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
MuxSetup mux;
|
||||||
|
double a1val, a2val;
|
||||||
|
|
||||||
|
AnalogIn aI1(1, 32560, 65535, 0, 100);
|
||||||
|
AnalogIn aI2(2, 0, 65535, 0, 50000);
|
||||||
|
|
||||||
|
for(int i = 0; i< 50; i++){
|
||||||
|
a1val = aI1.read(&mux);
|
||||||
|
a2val = aI2.read(&mux);
|
||||||
|
|
||||||
|
std::cout << "Input 1: " << a1val << ", badReads: " << aI1.getBadReads() << std::endl;
|
||||||
|
std::cout << "Input 2: " << a2val << ", badReads: " << aI2.getBadReads() << std::endl;
|
||||||
|
std::cout << "--" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
38
src/AnalogIn.h
Normal file
38
src/AnalogIn.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* AnalogIn.h
|
||||||
|
*
|
||||||
|
* Created on: Jun 27, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANALOGIN_H_
|
||||||
|
#define ANALOGIN_H_
|
||||||
|
|
||||||
|
#include "MuxSetup.h"
|
||||||
|
#include <array>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class AnalogIn {
|
||||||
|
public:
|
||||||
|
AnalogIn(int ch, double rawMinI, double rawMaxI, double euMinI, double euMaxI);
|
||||||
|
int getRawValue();
|
||||||
|
double getLastValue();
|
||||||
|
long getBadReads();
|
||||||
|
double getHistory(int index);
|
||||||
|
double setValue(int value);
|
||||||
|
double read(MuxSetup *mux);
|
||||||
|
double readSim(double simRaw);
|
||||||
|
virtual ~AnalogIn();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int channel;
|
||||||
|
int rawValue;
|
||||||
|
double lastValue;
|
||||||
|
double rawMin, rawMax, euMin, euMax;
|
||||||
|
double m, b;
|
||||||
|
int channelMux[3];
|
||||||
|
double history[100];
|
||||||
|
long badReads;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* ANALOGIN_H_ */
|
||||||
529
src/Card.cpp
Normal file
529
src/Card.cpp
Normal file
@@ -0,0 +1,529 @@
|
|||||||
|
/*
|
||||||
|
* Card.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jul 3, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Card.h"
|
||||||
|
|
||||||
|
template<typename T> void printElement(T t, const int& width)
|
||||||
|
{
|
||||||
|
const char separator = ' ';
|
||||||
|
std::cout << std::left << std::setw(width) << std::setfill(separator) << t;
|
||||||
|
};
|
||||||
|
|
||||||
|
Card::Card(): surfacePositionMax(0, 0), surfacePositionMin(0, 0),surfaceLoadMax(0,0), surfaceLoadMin(0,0), downholePositionMax(0,0), downholePositionMin(0, 0), downholeLoadMax(0,0), downholeLoadMin(0,0), topCorner(0,0), bottomCorner(0,0) {
|
||||||
|
strokeNumber = 0;
|
||||||
|
|
||||||
|
// Initializations
|
||||||
|
surfaceStrokeLength = -1;
|
||||||
|
downholeNetStrokeLength = -1;
|
||||||
|
downholeGrossStrokeLength = -1;
|
||||||
|
downholeAdjustedGrossStrokeLength = -1;
|
||||||
|
downholeLoadSpan = -1;
|
||||||
|
fluidLoad = -1;
|
||||||
|
pumpIntakePressure = -1;
|
||||||
|
fluidLevel = -1;
|
||||||
|
fillageEstimated = -1;
|
||||||
|
fillageCalculated = -1;
|
||||||
|
tubingMovement = -1;
|
||||||
|
strokeSpeed = -1;
|
||||||
|
|
||||||
|
structuralLoading = -1;
|
||||||
|
|
||||||
|
polishedRodHorsepower = -1;
|
||||||
|
pumpHorsepower = -1;
|
||||||
|
fluidBblMoved = -1;
|
||||||
|
fluidBblMovedAdjusted = -1;
|
||||||
|
waterBblMoved = -1;
|
||||||
|
oilBblMoved = -1;
|
||||||
|
gasMcfMoved = -1;
|
||||||
|
numPointsUsed = 0;
|
||||||
|
|
||||||
|
|
||||||
|
strokeStartTime = std::chrono::duration_cast< std::chrono::milliseconds >(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch()
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Card::Card(long strokeNumber): surfacePositionMax(0, 0), surfacePositionMin(0, 0),surfaceLoadMax(0,0), surfaceLoadMin(0,0), downholePositionMax(0,0), downholePositionMin(0, 0), downholeLoadMax(0,0), downholeLoadMin(0,0), topCorner(0,0), bottomCorner(0,0) {
|
||||||
|
this->strokeNumber = strokeNumber;
|
||||||
|
|
||||||
|
// Initializations
|
||||||
|
surfaceStrokeLength = -1;
|
||||||
|
downholeNetStrokeLength = -1;
|
||||||
|
downholeGrossStrokeLength = -1;
|
||||||
|
downholeAdjustedGrossStrokeLength = -1;
|
||||||
|
downholeLoadSpan = -1;
|
||||||
|
fluidLoad = -1;
|
||||||
|
pumpIntakePressure = -1;
|
||||||
|
fluidLevel = -1;
|
||||||
|
fillageEstimated = -1;
|
||||||
|
fillageCalculated = -1;
|
||||||
|
tubingMovement = -1;
|
||||||
|
strokeSpeed = -1;
|
||||||
|
|
||||||
|
structuralLoading = -1;
|
||||||
|
|
||||||
|
polishedRodHorsepower = -1;
|
||||||
|
pumpHorsepower = -1;
|
||||||
|
fluidBblMoved = -1;
|
||||||
|
fluidBblMovedAdjusted = -1;
|
||||||
|
waterBblMoved = -1;
|
||||||
|
oilBblMoved = -1;
|
||||||
|
gasMcfMoved = -1;
|
||||||
|
numPointsUsed = 0;
|
||||||
|
|
||||||
|
|
||||||
|
strokeStartTime = std::chrono::duration_cast< std::chrono::milliseconds >(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch()
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public Functions
|
||||||
|
|
||||||
|
void Card::setSurfacePosition(int i, double position){
|
||||||
|
surfacePosition[i] = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Card::setDownholePosition(int i, double position){
|
||||||
|
downholePosition[i] = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Card::setSurfaceLoad(int i, double load){
|
||||||
|
surfaceLoad[i] = load;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Card::setDownholeLoad(int i, double load){
|
||||||
|
downholeLoad[i] = load;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getSurfacePositionMax(){
|
||||||
|
return surfacePositionMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getSurfaceLoadMax(){
|
||||||
|
return surfaceLoadMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getSurfacePositionMin(){
|
||||||
|
return surfacePositionMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getSurfaceLoadMin(){
|
||||||
|
return surfaceLoadMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getDownholePositionMax(){
|
||||||
|
return downholePositionMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getDownholeLoadMax(){
|
||||||
|
return downholeLoadMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getDownholePositionMin(){
|
||||||
|
return downholePositionMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::getDownholeLoadMin(){
|
||||||
|
return downholeLoadMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Card::getStrokeNumber(){
|
||||||
|
return strokeNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getSurfaceStrokeLength(){
|
||||||
|
return surfaceStrokeLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getDownholeNetStrokeLength(){
|
||||||
|
return downholeNetStrokeLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getDownholeGrossStrokeLength(){
|
||||||
|
return downholeGrossStrokeLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card:: getDownholeAdjustedGrossStrokeLength(){
|
||||||
|
return downholeAdjustedGrossStrokeLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getDownholeLoadSpan(){
|
||||||
|
return downholeLoadSpan;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getFluidLoad(){
|
||||||
|
return fluidLoad;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getFillageEstimated(){
|
||||||
|
return fillageEstimated;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getFillageCalculated(){
|
||||||
|
return fillageCalculated;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getTubingMovement(){
|
||||||
|
return tubingMovement;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getStructuralLoading(){
|
||||||
|
return structuralLoading;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getPumpIntakePressure(){
|
||||||
|
return pumpIntakePressure;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getFluidLevel(){
|
||||||
|
return fluidLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getStrokeSpeed(){
|
||||||
|
return strokeSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getPolishedRodHorsepower(){
|
||||||
|
return polishedRodHorsepower;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getPumpHorsepower(){
|
||||||
|
return pumpHorsepower;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getFluidBblMoved(){
|
||||||
|
return fluidBblMoved;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getFluidBblMovedAdjusted(){
|
||||||
|
return fluidBblMovedAdjusted;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getWaterBblMoved(){
|
||||||
|
return waterBblMoved;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getOilBblMoved(){
|
||||||
|
return oilBblMoved;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::getGasMcfMoved(){
|
||||||
|
return gasMcfMoved;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Card::getNumPointsUsed(){
|
||||||
|
return numPointsUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Card::setNumPointsUsed(int i){
|
||||||
|
numPointsUsed = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Card::printCard(std::string cardPrintType, bool printDataToo)
|
||||||
|
{
|
||||||
|
const int posLength = 10;
|
||||||
|
const int lodLength = 12;
|
||||||
|
if(cardPrintType.compare("csv") == 0){
|
||||||
|
std::cout << "=== CARD " << strokeNumber << " ===" << std::endl;
|
||||||
|
std::cout << "Surf Pos,Surf Load,DH Pos,DH Load" << std::endl;
|
||||||
|
} else if (cardPrintType.compare("table") == 0) {
|
||||||
|
std::cout << "=== CARD " << strokeNumber << " ===" << std::endl;
|
||||||
|
printElement("Surf Pos", posLength);
|
||||||
|
printElement("Surf Load", lodLength);
|
||||||
|
printElement("DH Pos", posLength);
|
||||||
|
printElement("DH Load", lodLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < numPointsUsed; i++)
|
||||||
|
{
|
||||||
|
if(cardPrintType.compare("csv") == 0){
|
||||||
|
std::cout << surfacePosition[i] << ",";
|
||||||
|
std::cout << surfaceLoad[i] << ",";
|
||||||
|
std::cout << downholePosition[i] << ",";
|
||||||
|
std::cout << downholeLoad[i];
|
||||||
|
std::cout << std::endl;
|
||||||
|
} else if (cardPrintType.compare("table") == 0) {
|
||||||
|
printElement(surfacePosition[i], posLength);
|
||||||
|
printElement(surfaceLoad[i], lodLength);
|
||||||
|
printElement(downholePosition[i], posLength);
|
||||||
|
printElement(downholeLoad[i], lodLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const int labelLength = 22;
|
||||||
|
const int measLength = 15;
|
||||||
|
if(printDataToo){
|
||||||
|
std::cout << std::endl;
|
||||||
|
std::cout << "=== CARD DATA " << strokeNumber << " ===" << std::endl;
|
||||||
|
printElement("Fillage (Est.)", labelLength);
|
||||||
|
printElement(fillageEstimated, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Fillage (Calc.)", labelLength);
|
||||||
|
printElement(fillageCalculated, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
// printElement("Top Corner", labelLength);
|
||||||
|
// printElement(topCorner.position, measLength);
|
||||||
|
// printElement(topCorner.load, measLength);
|
||||||
|
// std::cout << std::endl;
|
||||||
|
//
|
||||||
|
// printElement("Bottom Corner", labelLength);
|
||||||
|
// printElement(bottomCorner.position, measLength);
|
||||||
|
// printElement(bottomCorner.load, measLength);
|
||||||
|
// std::cout << std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
printElement("Fluid Load", labelLength);
|
||||||
|
printElement(fluidLoad, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Pump Intake Pressure", labelLength);
|
||||||
|
printElement(pumpIntakePressure, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Fluid Level", labelLength);
|
||||||
|
printElement(fluidLevel, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Surf. Stroke Length", labelLength);
|
||||||
|
printElement(surfaceStrokeLength, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Down. Gross Stroke", labelLength);
|
||||||
|
printElement(downholeGrossStrokeLength, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Down. Net Stroke", labelLength);
|
||||||
|
printElement(downholeNetStrokeLength, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Polished Rod HP", labelLength);
|
||||||
|
printElement(polishedRodHorsepower, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
printElement("Pump HP", labelLength);
|
||||||
|
printElement(pumpHorsepower, measLength);
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// PRIVATE FUNCTIONS
|
||||||
|
double Card::lineResolve(double x1, double x2, double y1, double y2, double xTest){
|
||||||
|
double line_m = (y2 - y1) / (x2 - x1);
|
||||||
|
double line_b = y1 - line_m * x1;
|
||||||
|
double yTest = line_m * xTest + line_b;
|
||||||
|
return yTest;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::positionMax(double* positionArr, double* loadArr, int arrSize){
|
||||||
|
double maxPos = positionArr[0];
|
||||||
|
double loadAtMaxP = -__DBL_MAX__;
|
||||||
|
|
||||||
|
for(int i = 0; i < arrSize; i++) {
|
||||||
|
maxPos = std::max(maxPos, positionArr[i]);
|
||||||
|
if (maxPos == positionArr[i]) loadAtMaxP = loadArr[i];
|
||||||
|
}
|
||||||
|
LPPair foundPoint(maxPos, loadAtMaxP);
|
||||||
|
return foundPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LPPair Card::positionMin(double* positionArr, double* loadArr, int arrSize){
|
||||||
|
double minPosition = positionArr[0];
|
||||||
|
double loadAtMinP = __DBL_MAX__;
|
||||||
|
|
||||||
|
for(int i = 0; i < arrSize; i++) {
|
||||||
|
minPosition = std::min(minPosition, positionArr[i]);
|
||||||
|
if (minPosition == positionArr[i]) loadAtMinP = loadArr[i];
|
||||||
|
}
|
||||||
|
LPPair foundPoint(minPosition, loadAtMinP);
|
||||||
|
return foundPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::loadMax(double* positionArr, double* loadArr, int arrSize){
|
||||||
|
double maxLoad = loadArr[0];
|
||||||
|
double posAtMaxL = -__DBL_MAX__;
|
||||||
|
|
||||||
|
for(int i = 0; i < arrSize; i++) {
|
||||||
|
maxLoad = std::max(maxLoad, loadArr[i]);
|
||||||
|
if (maxLoad == positionArr[i]) posAtMaxL = positionArr[i];
|
||||||
|
}
|
||||||
|
LPPair foundPoint(posAtMaxL, maxLoad);
|
||||||
|
return foundPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair Card::loadMin(double* positionArr, double* loadArr, int arrSize){
|
||||||
|
double minLoad = loadArr[0];
|
||||||
|
double posAtMinL = __DBL_MAX__;
|
||||||
|
|
||||||
|
for(int i = 0; i < arrSize; i++) {
|
||||||
|
minLoad = std::min(minLoad, loadArr[i]);
|
||||||
|
if (minLoad == positionArr[i]) posAtMinL = positionArr[i];
|
||||||
|
}
|
||||||
|
LPPair foundPoint(posAtMinL, minLoad);
|
||||||
|
return foundPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Card::distanceToLine(double pos, double load){
|
||||||
|
double x1 = downholePositionMin.getPosition();
|
||||||
|
double x2 = downholePositionMax.getPosition();
|
||||||
|
double y1 = downholeLoadMin.getLoad();
|
||||||
|
double y2 = downholeLoadMax.getLoad();
|
||||||
|
|
||||||
|
return std::abs((y2-y1)*pos - (x2-x1)*load + x2*y1 - y2*x1) / sqrt(pow(y2-y1, 2) + pow(x2-x1,2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Card::calculateSpm(){
|
||||||
|
std::chrono::milliseconds now = std::chrono::duration_cast< std::chrono::milliseconds >(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch()
|
||||||
|
);
|
||||||
|
// std::chrono::milliseconds strokeMillis = now - strokeStartTime;
|
||||||
|
strokeSpeed = 60000.0 / (double)(now.count() - strokeStartTime.count());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Card::calcStrokeData(int numSlices, double fluidGradient, double rodDepth, double anchorDepth, double tubingCSA, double pumpArea, double frictionEstimate, double structuralRating, double kFactor, double waterBBLRatio, double oilBBLRatio, double gasMCFRatio){
|
||||||
|
|
||||||
|
calculateSpm();
|
||||||
|
surfacePositionMax = positionMax(surfacePosition, surfaceLoad, numPointsUsed);
|
||||||
|
surfaceLoadMax = loadMax(surfacePosition, surfaceLoad, numPointsUsed);
|
||||||
|
surfacePositionMin = positionMin(surfacePosition, surfaceLoad, numPointsUsed);
|
||||||
|
surfaceLoadMin = loadMin(surfacePosition, surfaceLoad, numPointsUsed);
|
||||||
|
|
||||||
|
downholePositionMax = positionMax(downholePosition, downholeLoad, numPointsUsed);
|
||||||
|
downholeLoadMax = loadMax(downholePosition, downholeLoad, numPointsUsed);
|
||||||
|
downholePositionMin = positionMin(downholePosition, downholeLoad, numPointsUsed);
|
||||||
|
downholeLoadMin = loadMin(downholePosition, downholeLoad, numPointsUsed);
|
||||||
|
|
||||||
|
surfaceStrokeLength = surfacePositionMax.getPosition() - surfacePositionMin.getPosition();
|
||||||
|
downholeGrossStrokeLength = downholePositionMax.getPosition() - downholePositionMin.getPosition();
|
||||||
|
downholeLoadSpan = downholeLoadMax.getLoad() - downholeLoadMin.getLoad();
|
||||||
|
|
||||||
|
double dxSurf = (surfacePositionMax.getPosition() - surfacePositionMin.getPosition()) / (float) numSlices;
|
||||||
|
double dxDown = (downholePositionMax.getPosition() - downholePositionMin.getPosition()) / (float) numSlices;
|
||||||
|
|
||||||
|
pumpHorsepower = 0.0;
|
||||||
|
polishedRodHorsepower = 0.0;
|
||||||
|
double dhDistanceTop = 0.0;
|
||||||
|
double dhDistanceBottom = 0.0;
|
||||||
|
|
||||||
|
for (int i = 1; i < numSlices+1; i++)
|
||||||
|
{
|
||||||
|
double suPosTarget = surfacePositionMin.getPosition() + ((double) i * dxSurf);
|
||||||
|
double dhPosTarget = downholePositionMin.getPosition() + ((double) i * dxDown);
|
||||||
|
double suLoadAtTargetTop = 0.0;
|
||||||
|
double suLoadAtTargetBottom = 0.0;
|
||||||
|
double dhLoadAtTargetTop = 0.0;
|
||||||
|
double dhLoadAtTargetBottom = 0.0;
|
||||||
|
|
||||||
|
for(int j = 0; j < numPointsUsed - 1; j++)
|
||||||
|
{
|
||||||
|
if (downholePosition[j] <= dhPosTarget && downholePosition[j+1] > dhPosTarget){
|
||||||
|
dhLoadAtTargetTop = lineResolve(downholePosition[j], downholePosition[j+1], downholeLoad[j], downholeLoad[j+1], dhPosTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (downholePosition[j] > dhPosTarget && downholePosition[j+1] >= dhPosTarget){
|
||||||
|
dhLoadAtTargetBottom = lineResolve(downholePosition[j], downholePosition[j+1], downholeLoad[j], downholeLoad[j+1], dhPosTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (surfacePosition[j] <= suPosTarget && surfacePosition[j+1] > suPosTarget){
|
||||||
|
suLoadAtTargetTop = lineResolve(surfacePosition[j], surfacePosition[j+1], surfaceLoad[j], surfaceLoad[j+1], suPosTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (surfacePosition[j] > suPosTarget && surfacePosition[j+1] >= suPosTarget){
|
||||||
|
suLoadAtTargetBottom = lineResolve(surfacePosition[j], surfacePosition[j+1], surfaceLoad[j], surfaceLoad[j+1], suPosTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
polishedRodHorsepower += (dxSurf / 12.0) * (suLoadAtTargetTop - suLoadAtTargetBottom) * (strokeSpeed / 33000.0);
|
||||||
|
pumpHorsepower += (dxDown / 12.0) * (dhLoadAtTargetTop - dhLoadAtTargetBottom) * (strokeSpeed / 33000.0);
|
||||||
|
|
||||||
|
double tDistance = distanceToLine(dhPosTarget, dhLoadAtTargetTop);
|
||||||
|
double bDistance = distanceToLine(dhPosTarget, dhLoadAtTargetBottom);
|
||||||
|
|
||||||
|
if (tDistance > dhDistanceTop)
|
||||||
|
{
|
||||||
|
dhDistanceTop = tDistance;
|
||||||
|
topCorner.set(dhPosTarget, dhLoadAtTargetTop);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bDistance > dhDistanceBottom)
|
||||||
|
{
|
||||||
|
dhDistanceBottom = bDistance;
|
||||||
|
bottomCorner.set(dhPosTarget, dhLoadAtTargetBottom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
downholeAdjustedGrossStrokeLength = downholePositionMax.getPosition() - topCorner.getPosition();
|
||||||
|
downholeNetStrokeLength = bottomCorner.getPosition() - downholePositionMin.getPosition();
|
||||||
|
fillageCalculated = (downholeNetStrokeLength / downholeAdjustedGrossStrokeLength) * 100.0;
|
||||||
|
fillageEstimated =(downholeNetStrokeLength / downholeGrossStrokeLength) * 100.0;
|
||||||
|
fluidBblMoved = downholeNetStrokeLength * pumpArea * 0.00010307;
|
||||||
|
fluidBblMovedAdjusted = fluidBblMoved * kFactor;
|
||||||
|
oilBblMoved = fluidBblMoved * oilBBLRatio;
|
||||||
|
waterBblMoved = fluidBblMoved * waterBBLRatio;
|
||||||
|
gasMcfMoved = fluidBblMoved * gasMCFRatio;
|
||||||
|
|
||||||
|
|
||||||
|
if (fillageEstimated > 100)
|
||||||
|
fillageEstimated = 100.0;
|
||||||
|
|
||||||
|
if (fillageEstimated < 0.0)
|
||||||
|
fillageEstimated = 0.0;
|
||||||
|
|
||||||
|
if (fillageCalculated > 100)
|
||||||
|
fillageCalculated = 100.0;
|
||||||
|
|
||||||
|
if (fillageCalculated < 0.0)
|
||||||
|
fillageCalculated = 0.0;
|
||||||
|
|
||||||
|
fluidLoad = downholeLoadSpan - frictionEstimate;
|
||||||
|
pumpIntakePressure = fluidGradient * rodDepth - (fluidLoad / pumpArea);
|
||||||
|
//printf("PIP = %f * %f - (%f / %f) = %f\n", fluidGradient, rodDepth, fluidLoad, pumpArea, pumpIntakePressure);
|
||||||
|
fluidLevel = pumpIntakePressure / fluidGradient;
|
||||||
|
tubingMovement = 12 * (rodDepth - anchorDepth) * fluidLoad / (30500000 * tubingCSA);
|
||||||
|
structuralLoading = (surfaceLoadMax.getLoad() / (structuralRating * 100)) * 100;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Card::~Card() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
119
src/Card.h
Normal file
119
src/Card.h
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Card.h
|
||||||
|
*
|
||||||
|
* Created on: Jul 3, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CARD_H_
|
||||||
|
#define CARD_H_
|
||||||
|
|
||||||
|
#include "LPPair.h"
|
||||||
|
#include <string>
|
||||||
|
#include <chrono>
|
||||||
|
#include <math.h>
|
||||||
|
#include <cmath>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
static const int maxPoints = 1500;
|
||||||
|
|
||||||
|
class Card {
|
||||||
|
public:
|
||||||
|
Card(long strokeNumber);
|
||||||
|
Card();
|
||||||
|
double surfacePosition[maxPoints], surfaceLoad[maxPoints], downholePosition[maxPoints], downholeLoad[maxPoints];
|
||||||
|
void setSurfacePosition(int i, double position);
|
||||||
|
void setSurfaceLoad(int i, double load);
|
||||||
|
void setDownholePosition(int i, double position);
|
||||||
|
void setDownholeLoad(int i, double load);
|
||||||
|
void setNumPointsUsed(int i);
|
||||||
|
|
||||||
|
LPPair getSurfacePositionMax();
|
||||||
|
LPPair getSurfaceLoadMax();
|
||||||
|
LPPair getSurfacePositionMin();
|
||||||
|
LPPair getSurfaceLoadMin();
|
||||||
|
|
||||||
|
LPPair getDownholePositionMax();
|
||||||
|
LPPair getDownholeLoadMax();
|
||||||
|
LPPair getDownholePositionMin();
|
||||||
|
LPPair getDownholeLoadMin();
|
||||||
|
|
||||||
|
long getStrokeNumber();
|
||||||
|
double getSurfaceStrokeLength();
|
||||||
|
double getDownholeNetStrokeLength();
|
||||||
|
double getDownholeGrossStrokeLength();
|
||||||
|
double getDownholeAdjustedGrossStrokeLength();
|
||||||
|
double getDownholeLoadSpan();
|
||||||
|
double getFluidLoad();
|
||||||
|
double getFillageEstimated();
|
||||||
|
double getFillageCalculated();
|
||||||
|
double getTubingMovement();
|
||||||
|
double getStructuralLoading();
|
||||||
|
double getPumpIntakePressure();
|
||||||
|
double getFluidLevel();
|
||||||
|
double getStrokeSpeed();
|
||||||
|
double getPolishedRodHorsepower();
|
||||||
|
double getPumpHorsepower();
|
||||||
|
double getFluidBblMoved();
|
||||||
|
double getFluidBblMovedAdjusted();
|
||||||
|
double getWaterBblMoved();
|
||||||
|
double getOilBblMoved();
|
||||||
|
double getGasMcfMoved();
|
||||||
|
int getNumPointsUsed();
|
||||||
|
void calcStrokeData(int numSlices, double fluidGradient, double rodDepth, double anchorDepth, double tubingCSA,
|
||||||
|
double pumpArea, double frictionEstimate, double structuralRating,
|
||||||
|
double kFactor, double waterBBLRatio, double oilBBLRatio, double gasMCFRatio);
|
||||||
|
void printCard(std::string printType, bool printDataTableToo);
|
||||||
|
virtual ~Card();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Card Points
|
||||||
|
int numPointsUsed;
|
||||||
|
|
||||||
|
// Card Data
|
||||||
|
long strokeNumber;
|
||||||
|
LPPair surfacePositionMax, surfacePositionMin, surfaceLoadMax, surfaceLoadMin;
|
||||||
|
LPPair downholePositionMax, downholePositionMin, downholeLoadMax, downholeLoadMin;
|
||||||
|
LPPair topCorner, bottomCorner;
|
||||||
|
|
||||||
|
double surfaceStrokeLength;
|
||||||
|
double downholeNetStrokeLength;
|
||||||
|
double downholeGrossStrokeLength;
|
||||||
|
double downholeAdjustedGrossStrokeLength;
|
||||||
|
double downholeLoadSpan;
|
||||||
|
double fluidLoad;
|
||||||
|
double pumpIntakePressure;
|
||||||
|
double fluidLevel;
|
||||||
|
double fillageEstimated;
|
||||||
|
double fillageCalculated;
|
||||||
|
double tubingMovement;
|
||||||
|
double strokeSpeed;
|
||||||
|
|
||||||
|
double structuralLoading;
|
||||||
|
|
||||||
|
double polishedRodHorsepower;
|
||||||
|
double pumpHorsepower;
|
||||||
|
double fluidBblMoved;
|
||||||
|
double fluidBblMovedAdjusted;
|
||||||
|
double waterBblMoved;
|
||||||
|
double oilBblMoved;
|
||||||
|
double gasMcfMoved;
|
||||||
|
|
||||||
|
std::chrono::milliseconds strokeStartTime;
|
||||||
|
|
||||||
|
double lineResolve(double x1, double x2, double y1, double y2, double xTest);
|
||||||
|
LPPair positionMax(double* positionArr, double* loadArr, int arrSize);
|
||||||
|
LPPair positionMin(double* positionArr, double* loadArr, int arrSize);
|
||||||
|
LPPair loadMax(double* positionArr, double* loadArr, int arrSize);
|
||||||
|
LPPair loadMin(double* positionArr, double* loadArr, int arrSize);
|
||||||
|
|
||||||
|
double distanceToLine(double pos, double load);
|
||||||
|
void calculateSpm();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* CARD_H_ */
|
||||||
450
src/Database.cpp
Normal file
450
src/Database.cpp
Normal file
@@ -0,0 +1,450 @@
|
|||||||
|
//
|
||||||
|
// Database.cpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/5/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Database.h"
|
||||||
|
|
||||||
|
Database::Database() {
|
||||||
|
pocDb = mongoClient["poc"];
|
||||||
|
|
||||||
|
cardCollection = pocDb["cards"];
|
||||||
|
bsoncxx::builder::stream::document cardCollectionIndexBuilder;
|
||||||
|
cardCollectionIndexBuilder << "timestamp" << 1 << "strokeNumber" << 1;
|
||||||
|
cardCollection.create_index(cardCollectionIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
wellDataCollection = pocDb["measurements"];
|
||||||
|
bsoncxx::builder::stream::document wellDataCollectionIndexBuilder;
|
||||||
|
wellDataCollectionIndexBuilder << "dateStored" << 1 << "tagName" << 1;
|
||||||
|
wellDataCollection.create_index(wellDataCollectionIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
gaugeOffCollection = pocDb["gaugeOff"];
|
||||||
|
bsoncxx::builder::stream::document gaugeOffCollectionIndexBuilder;
|
||||||
|
gaugeOffCollectionIndexBuilder << "timestamp" << 1 << "tagName" << 1;
|
||||||
|
gaugeOffCollection.create_index(gaugeOffCollectionIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
wellTestCollection = pocDb["wellTests"];
|
||||||
|
bsoncxx::builder::stream::document wellTestCollectionIndexBuilder;
|
||||||
|
wellTestCollectionIndexBuilder << "testStartTime" << 1;
|
||||||
|
wellTestCollection.create_index(wellTestCollectionIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
fluidShotsCollection = pocDb["fluidShots"];
|
||||||
|
bsoncxx::builder::stream::document justTimestampIndexBuilder;
|
||||||
|
justTimestampIndexBuilder << "timestamp" << 1;
|
||||||
|
fluidShotsCollection.create_index(justTimestampIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
runStatusCollection = pocDb["runStatus"];
|
||||||
|
runStatusCollection.create_index(justTimestampIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
wellConfigCollection = pocDb["wellConfiguration"];
|
||||||
|
wellConfigCollection.create_index(justTimestampIndexBuilder.view() , {});
|
||||||
|
|
||||||
|
setpointCollection = pocDb["setpoints"];
|
||||||
|
bsoncxx::builder::stream::document setpointCollectionIndexBuilder;
|
||||||
|
setpointCollectionIndexBuilder << "name" << 1;
|
||||||
|
setpointCollection.create_index(setpointCollectionIndexBuilder.view() , {});
|
||||||
|
}
|
||||||
|
|
||||||
|
long Database::getLastStrokeNumber(){
|
||||||
|
// db.getCollection('cards').aggregate(
|
||||||
|
// [{ $group: {_id: "strokeNumber",
|
||||||
|
// lastStroke: {$last : "$strokeNumber"}
|
||||||
|
// }}]
|
||||||
|
// )
|
||||||
|
long lastStroke = 0;
|
||||||
|
|
||||||
|
mongocxx::pipeline stages;
|
||||||
|
bsoncxx::builder::stream::document group_stage;
|
||||||
|
|
||||||
|
|
||||||
|
group_stage << "_id"
|
||||||
|
<< "strokeNumber"
|
||||||
|
<< "lastStroke" << open_document << "$last" << "$strokeNumber" << close_document;
|
||||||
|
|
||||||
|
stages.group(group_stage.view());
|
||||||
|
|
||||||
|
mongocxx::cursor cursor = cardCollection.aggregate(stages);
|
||||||
|
for (auto&& doc : cursor) {
|
||||||
|
bsoncxx::document::element lastStrokeElement = doc["lastStroke"];
|
||||||
|
lastStroke = lastStrokeElement.get_int64();
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastStroke;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Database::newCard(Card &inpCard){
|
||||||
|
int numPoints = inpCard.getNumPointsUsed();
|
||||||
|
double s_p[numPoints];
|
||||||
|
double s_l[numPoints];
|
||||||
|
double d_p[numPoints];
|
||||||
|
double d_l[numPoints];
|
||||||
|
|
||||||
|
bsoncxx::types::b_date timestamp = bsoncxx::types::b_date {std::chrono::duration_cast< std::chrono::milliseconds >(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch()
|
||||||
|
)};
|
||||||
|
|
||||||
|
bsoncxx::types::b_int64 strokeNumber = bsoncxx::types::b_int64{inpCard.getStrokeNumber()};
|
||||||
|
|
||||||
|
|
||||||
|
for(int i = 0; i < numPoints; i++ ) {
|
||||||
|
s_p[i] = inpCard.surfacePosition[i];
|
||||||
|
s_l[i] = inpCard.surfaceLoad[i];
|
||||||
|
d_p[i] = inpCard.downholePosition[i];
|
||||||
|
d_l[i] = inpCard.downholeLoad[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document doc_value;
|
||||||
|
doc_value << "strokeNumber" << strokeNumber;
|
||||||
|
|
||||||
|
auto in_sp_array = doc_value << "surfacePosition" << bsoncxx::builder::stream::open_array;
|
||||||
|
for (auto&& e : s_p) {
|
||||||
|
in_sp_array = in_sp_array << e;
|
||||||
|
}
|
||||||
|
auto after_sp_array = in_sp_array << bsoncxx::builder::stream::close_array;
|
||||||
|
|
||||||
|
auto in_sl_array = after_sp_array << "surfaceLoad" << bsoncxx::builder::stream::open_array;
|
||||||
|
for (auto&& e : s_l) {
|
||||||
|
in_sl_array = in_sl_array << e;
|
||||||
|
}
|
||||||
|
auto after_sl_array = in_sl_array << bsoncxx::builder::stream::close_array;
|
||||||
|
|
||||||
|
auto in_dp_array = after_sl_array << "downholePosition" << bsoncxx::builder::stream::open_array;
|
||||||
|
for (auto&& e : d_p) {
|
||||||
|
in_dp_array = in_dp_array << e;
|
||||||
|
}
|
||||||
|
auto after_dp_array = in_dp_array << bsoncxx::builder::stream::close_array;
|
||||||
|
|
||||||
|
auto in_dl_array = after_dp_array << "downholeLoad" << bsoncxx::builder::stream::open_array;
|
||||||
|
for (auto&& e : d_l) {
|
||||||
|
in_dl_array = in_dl_array << e;
|
||||||
|
}
|
||||||
|
auto after_dl_array = in_dl_array << bsoncxx::builder::stream::close_array;
|
||||||
|
after_dl_array << "timestamp" << timestamp;
|
||||||
|
bsoncxx::document::value doc = after_dl_array << bsoncxx::builder::stream::finalize;
|
||||||
|
auto result = cardCollection.insert_one(doc.view());
|
||||||
|
|
||||||
|
if (result->inserted_id().type() == bsoncxx::type::k_oid) {
|
||||||
|
bsoncxx::oid id = result->inserted_id().get_oid().value;
|
||||||
|
std::string id_str = id.to_string();
|
||||||
|
std::cout << "Inserted id: " << id_str << " for stroke " << strokeNumber << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << "Inserted id was not an OID type" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cardCollection.count({});
|
||||||
|
}
|
||||||
|
|
||||||
|
long Database::newMeasurement(Measurement &inpMeasurement){
|
||||||
|
|
||||||
|
time_t rawtime;
|
||||||
|
struct tm *tmTimestamp, *tmDate;
|
||||||
|
time (&rawtime);
|
||||||
|
tmTimestamp = gmtime(&rawtime);
|
||||||
|
tmDate = gmtime(&rawtime);
|
||||||
|
|
||||||
|
std::string valString = "values." + std::to_string(tmTimestamp->tm_hour) + "." +std::to_string(tmTimestamp->tm_min);
|
||||||
|
|
||||||
|
tmDate->tm_hour = 0;
|
||||||
|
tmDate->tm_min = 0;
|
||||||
|
tmDate->tm_sec = 0;
|
||||||
|
|
||||||
|
time_t rawDate = mktime(tmDate);
|
||||||
|
std::chrono::system_clock::time_point date_point = std::chrono::system_clock::from_time_t(rawDate);
|
||||||
|
bsoncxx::types::b_date datestamp = bsoncxx::types::b_date{date_point};
|
||||||
|
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document doc_value;
|
||||||
|
doc_value << "$set" << bsoncxx::builder::stream::open_document;
|
||||||
|
doc_value << valString << inpMeasurement.getCurrentValue();
|
||||||
|
doc_value << "currentValue" << inpMeasurement.getCurrentValue();
|
||||||
|
doc_value << "maxValue" << inpMeasurement.getDailyMax();
|
||||||
|
doc_value << "minValue" << inpMeasurement.getDailyMin();
|
||||||
|
doc_value << "averageValue" << inpMeasurement.getAverage();
|
||||||
|
doc_value << "totalValue" << inpMeasurement.getTotal();
|
||||||
|
doc_value << "numMeasurements" << bsoncxx::types::b_int64{inpMeasurement.getNumMeasurements()};
|
||||||
|
doc_value << "units" << inpMeasurement.getUnits();
|
||||||
|
doc_value << "storeDelta" << inpMeasurement.getSendDelta();
|
||||||
|
doc_value << "storeTime" << bsoncxx::types::b_int64{inpMeasurement.getSendTimeDelta()};
|
||||||
|
doc_value << "useTotal" << inpMeasurement.getUseTotal();
|
||||||
|
doc_value << "useAverage" << inpMeasurement.getUseAverage();
|
||||||
|
doc_value << "dateStored"<< datestamp;
|
||||||
|
doc_value << bsoncxx::builder::stream::close_document;
|
||||||
|
|
||||||
|
bsoncxx::document::value doc = doc_value << bsoncxx::builder::stream::finalize;
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document filterBuilder;
|
||||||
|
filterBuilder << "tagName" << inpMeasurement.getTagName();
|
||||||
|
filterBuilder << "dateStored" << datestamp;
|
||||||
|
bsoncxx::document::value filterDoc = filterBuilder << bsoncxx::builder::stream::finalize;
|
||||||
|
|
||||||
|
mongocxx::options::update updOptions;
|
||||||
|
updOptions.upsert(true);
|
||||||
|
|
||||||
|
|
||||||
|
wellDataCollection.update_one(filterDoc.view(), doc.view(), updOptions);
|
||||||
|
|
||||||
|
std::cout << "Stored " << inpMeasurement.getCurrentValue() << " for " <<inpMeasurement.getTagName() << std::endl;
|
||||||
|
return wellDataCollection.count({});
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isToday(bsoncxx::types::b_date testDate){
|
||||||
|
time_t rawtime;
|
||||||
|
struct tm *tmDate;
|
||||||
|
time (&rawtime);
|
||||||
|
tmDate = gmtime(&rawtime);
|
||||||
|
|
||||||
|
tmDate->tm_hour = 0;
|
||||||
|
tmDate->tm_min = 0;
|
||||||
|
tmDate->tm_sec = 0;
|
||||||
|
|
||||||
|
time_t rawDate = mktime(tmDate);
|
||||||
|
std::chrono::system_clock::time_point date_point = std::chrono::system_clock::from_time_t(rawDate);
|
||||||
|
bsoncxx::types::b_date datestamp = bsoncxx::types::b_date{date_point};
|
||||||
|
|
||||||
|
if (testDate == datestamp){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Database::getLastStoredMeasurementAndUpdate(Measurement &inpMeasurement){
|
||||||
|
int measurementFound = 0;
|
||||||
|
mongocxx::options::find opts;
|
||||||
|
bsoncxx::builder::stream::document filterBuilder, sortBuilder;
|
||||||
|
filterBuilder << "tagName" << inpMeasurement.getTagName();
|
||||||
|
sortBuilder << "dateStored" << -1;
|
||||||
|
|
||||||
|
opts.sort(sortBuilder.view());
|
||||||
|
opts.limit(1);
|
||||||
|
|
||||||
|
mongocxx::cursor mCursor = wellDataCollection.find(filterBuilder.view(), opts);
|
||||||
|
for (auto&& doc : mCursor) {
|
||||||
|
double average = doc["averageValue"].get_double();
|
||||||
|
double total = doc["totalValue"].get_double();
|
||||||
|
double dailyMax = doc["maxValue"].get_double();
|
||||||
|
double dailyMin = doc["minValue"].get_double();
|
||||||
|
double sendDelta = doc["storeDelta"].get_double();
|
||||||
|
long sendTimeDelta = (long) doc["storeTime"].get_int64();
|
||||||
|
double lastSentValue = doc["currentValue"].get_double();
|
||||||
|
long numMeasurements = doc["numMeasurements"].get_int64();
|
||||||
|
|
||||||
|
bsoncxx::types::b_date dateStored = doc["dateStored"].get_date();
|
||||||
|
|
||||||
|
if (isToday(dateStored)){
|
||||||
|
inpMeasurement.setFromDatabase(average, total, dailyMin, dailyMax, sendDelta, sendTimeDelta, lastSentValue, numMeasurements);
|
||||||
|
std::cout << inpMeasurement.getTagName() << " retrieved from database!" << std::endl;
|
||||||
|
measurementFound = 1;
|
||||||
|
} else {
|
||||||
|
std::cout << inpMeasurement.getTagName() << " value is too old in database." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return measurementFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Database::newDailyTotal(Measurement &inpMeasurement){
|
||||||
|
bsoncxx::builder::stream::document totalBuilder;
|
||||||
|
|
||||||
|
bsoncxx::types::b_date timestamp = bsoncxx::types::b_date {std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch())};
|
||||||
|
|
||||||
|
totalBuilder << "tagName" << inpMeasurement.getTagName();
|
||||||
|
totalBuilder << "currentValue" << inpMeasurement.getCurrentValue();
|
||||||
|
totalBuilder << "maxDailyValue" << inpMeasurement.getDailyMax();
|
||||||
|
totalBuilder << "minDailyValue" << inpMeasurement.getDailyMin();
|
||||||
|
totalBuilder << "dailyAverage" << inpMeasurement.getAverage();
|
||||||
|
totalBuilder << "dailyTotal" << inpMeasurement.getTotal();
|
||||||
|
totalBuilder << "timestamp"<< timestamp;
|
||||||
|
|
||||||
|
gaugeOffCollection.insert_one(totalBuilder.view());
|
||||||
|
return gaugeOffCollection.count({});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
double Database::getPreviousDailyProductionTotal(std::chrono::milliseconds timestamp){
|
||||||
|
double productionTotal = -1;
|
||||||
|
bsoncxx::types::b_date bsonTimestamp = bsoncxx::types::b_date{timestamp};
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document findBuilder, sortBuilder;
|
||||||
|
findBuilder << "tagName" << "Fluid Produced";
|
||||||
|
findBuilder << "$lte" << bsoncxx::builder::stream::open_document;
|
||||||
|
findBuilder << "timestamp" << bsonTimestamp;
|
||||||
|
findBuilder << bsoncxx::builder::stream::close_document;
|
||||||
|
|
||||||
|
sortBuilder << "timestamp" << -1;
|
||||||
|
|
||||||
|
mongocxx::options::find opts;
|
||||||
|
opts.sort(sortBuilder.view());
|
||||||
|
opts.limit(1);
|
||||||
|
|
||||||
|
mongocxx::cursor wellTestCursor = wellDataCollection.find(findBuilder.view(), opts);
|
||||||
|
for (auto&& doc : wellTestCursor) {
|
||||||
|
productionTotal = doc["dailyTotal"].get_double();
|
||||||
|
}
|
||||||
|
return productionTotal;
|
||||||
|
};
|
||||||
|
|
||||||
|
long Database::newWellTest(WellTest inp){
|
||||||
|
|
||||||
|
bsoncxx::types::b_date bsonTimestamp = bsoncxx::types::b_date{inp.getTestCompletedTimestamp()};
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document wellTestBuilder;
|
||||||
|
wellTestBuilder << "testCompletedTimestamp" << bsonTimestamp;
|
||||||
|
wellTestBuilder << "testHours" << inp.getTestHours();
|
||||||
|
wellTestBuilder << "testTotalBbl" << inp.getTotalFluidBbl();
|
||||||
|
wellTestBuilder << "testOilBbl" << inp.getTestOilBbl();
|
||||||
|
wellTestBuilder << "testWaterBbl" << inp.getTestWaterBbl();
|
||||||
|
wellTestBuilder << "testGasMcf" << inp.getTestGasMcf();
|
||||||
|
wellTestBuilder << "kFactor" << inp.getKFactor();
|
||||||
|
wellTestBuilder << "oilRatio" << inp.getOilRatio();
|
||||||
|
wellTestBuilder << "waterRatio" << inp.getWaterRatio();
|
||||||
|
wellTestBuilder << "gasMcfRatio" << inp.getGasMcfRatio();
|
||||||
|
wellTestCollection.insert_one(wellTestBuilder.view());
|
||||||
|
return wellTestCollection.count({});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WellTest Database::getPreviousWellTest(std::chrono::milliseconds timeParameter){
|
||||||
|
WellTest foundTest;
|
||||||
|
bsoncxx::builder::stream::document filterBuilder, sortBuilder;
|
||||||
|
filterBuilder << "testCompletedTimestamp" << bsoncxx::builder::stream::open_document;
|
||||||
|
filterBuilder << "$lte" << bsoncxx::types::b_date{timeParameter};
|
||||||
|
filterBuilder << bsoncxx::builder::stream::close_document;
|
||||||
|
|
||||||
|
sortBuilder << "testCompletedTimeStamp" << -1;
|
||||||
|
mongocxx::options::find opts;
|
||||||
|
opts.sort(sortBuilder.view());
|
||||||
|
opts.limit(1);
|
||||||
|
|
||||||
|
mongocxx::cursor wellTestCursor = wellTestCollection.find(filterBuilder.view(), opts);
|
||||||
|
for (auto&& doc : wellTestCursor) {
|
||||||
|
bsoncxx::types::b_date testCompletedTimestampDate =doc["testCompletedTimestamp"].get_date();
|
||||||
|
std::chrono::milliseconds testCompletedTimestamp = std::chrono::milliseconds{};
|
||||||
|
double testHours = doc["testHours"].get_double();
|
||||||
|
double testTotalBbl = doc["testTotalBbl"].get_double();
|
||||||
|
double testOilBbl = doc["testOilBbl"].get_double();
|
||||||
|
double testWaterBbl = doc["testWaterBbl"].get_double();
|
||||||
|
double testGasMcf = doc["testGasMcf"].get_double();
|
||||||
|
double kFactor = doc["kFactor"].get_double();
|
||||||
|
double oilRatio = doc["oilRatio"].get_double();
|
||||||
|
double waterRatio = doc["waterRatio"].get_double();
|
||||||
|
double gasMcfRatio = doc["gasMcfRatio"].get_double();
|
||||||
|
|
||||||
|
foundTest.initFromDatabase(testCompletedTimestamp, testHours, testTotalBbl, testOilBbl, testWaterBbl, testGasMcf, kFactor, oilRatio, waterRatio, gasMcfRatio);
|
||||||
|
}
|
||||||
|
return foundTest;
|
||||||
|
};
|
||||||
|
|
||||||
|
double Database::getLatestKFactor(){
|
||||||
|
double kFactor = 1;
|
||||||
|
bsoncxx::builder::stream::document sortBuilder;
|
||||||
|
sortBuilder << "testCompletedTimestamp" << -1;
|
||||||
|
mongocxx::options::find opts;
|
||||||
|
opts.sort(sortBuilder.view());
|
||||||
|
opts.limit(1);
|
||||||
|
|
||||||
|
mongocxx::cursor wellTestCursor = wellTestCollection.find({}, opts);
|
||||||
|
for (auto&& doc : wellTestCursor) {
|
||||||
|
kFactor = doc["kFactor"].get_double();
|
||||||
|
}
|
||||||
|
return kFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Database::newFluidShot(FluidShot inp){
|
||||||
|
bsoncxx::types::b_date timestamp = bsoncxx::types::b_date {std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch())};
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document fluidShotBuilder;
|
||||||
|
|
||||||
|
fluidShotBuilder << "timestamp" << timestamp;
|
||||||
|
fluidShotBuilder << "fluidLevel" << inp.getFluidLevel();
|
||||||
|
fluidShotBuilder << "pumpIntakePressure" << inp.getPumpIntakePressure();
|
||||||
|
fluidShotBuilder << "frictionEstimate" << inp.getFrictionEstimate();
|
||||||
|
fluidShotBuilder << "fluidGradient" << inp.getFluidGradient();
|
||||||
|
|
||||||
|
fluidShotsCollection.insert_one(fluidShotBuilder.view());
|
||||||
|
return fluidShotsCollection.count({});
|
||||||
|
}
|
||||||
|
|
||||||
|
double Database::getLatestFrictionEstimate(){
|
||||||
|
double frictionEstimate = 1;
|
||||||
|
bsoncxx::builder::stream::document sortBuilder;
|
||||||
|
sortBuilder << "timestamp" << -1;
|
||||||
|
mongocxx::options::find opts;
|
||||||
|
opts.sort(sortBuilder.view());
|
||||||
|
opts.limit(1);
|
||||||
|
|
||||||
|
mongocxx::cursor fluidShotCursor = fluidShotsCollection.find({}, opts);
|
||||||
|
for (auto&& doc : fluidShotCursor) {
|
||||||
|
frictionEstimate = doc["frictionEstimate"].get_double();
|
||||||
|
}
|
||||||
|
return frictionEstimate;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Database::newRunStatus(std::string runStatus, std::string initiator){
|
||||||
|
bsoncxx::types::b_date timestamp = bsoncxx::types::b_date {std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch())};
|
||||||
|
|
||||||
|
bsoncxx::builder::stream::document runStatusBuilder;
|
||||||
|
|
||||||
|
runStatusBuilder << "timestamp" << timestamp;
|
||||||
|
runStatusBuilder << "status" << runStatus;
|
||||||
|
runStatusBuilder << "initiator" << initiator;
|
||||||
|
|
||||||
|
runStatusCollection.insert_one(runStatusBuilder.view());
|
||||||
|
return runStatusCollection.count({});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// FUNCTION TESTS
|
||||||
|
|
||||||
|
void testNewCard(Database &db){
|
||||||
|
long nextStroke = db.getLastStrokeNumber() + 1;
|
||||||
|
|
||||||
|
Card newCard(nextStroke);
|
||||||
|
for (int i = 0; i < 100; i++){
|
||||||
|
newCard.setSurfacePosition(i, (double)i);
|
||||||
|
newCard.setSurfaceLoad(i, (double)i * 200);
|
||||||
|
newCard.setDownholePosition(i, 100 - (double)i);
|
||||||
|
newCard.setDownholeLoad(i, (double)i * -100);
|
||||||
|
}
|
||||||
|
newCard.setNumPointsUsed(100);
|
||||||
|
std::cout << db.newCard(newCard) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void testNewMeasurement(Database &db){
|
||||||
|
Measurement newMeasurement("Test Measurement");
|
||||||
|
newMeasurement.setUseTotal(true);
|
||||||
|
newMeasurement.setUseAverage(true);
|
||||||
|
newMeasurement.setFromDatabase(1.0, 100.0, 50, 0, 0.5, 600, 25, 10);
|
||||||
|
std::cout << db.newMeasurement(newMeasurement) <<std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void testRecoverMeasurement(Database &db){
|
||||||
|
Measurement newMeasurement("Pump Fill Percent");
|
||||||
|
newMeasurement.setUseTotal(true);
|
||||||
|
newMeasurement.setUseAverage(true);
|
||||||
|
std::cout<< db.getLastStoredMeasurementAndUpdate(newMeasurement) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void testNewDailyTotal(Database &db){
|
||||||
|
Measurement newMeasurement("Test Measurement");
|
||||||
|
newMeasurement.setUseTotal(true);
|
||||||
|
newMeasurement.setUseAverage(true);
|
||||||
|
std::cout<< db.getLastStoredMeasurementAndUpdate(newMeasurement) << std::endl;
|
||||||
|
std::cout << db.newDailyTotal(newMeasurement) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
Database db;
|
||||||
|
// testNewCard(db);
|
||||||
|
// testNewMeasurement(db);
|
||||||
|
// testRecoverMeasurement(db);
|
||||||
|
testNewDailyTotal(db);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
69
src/Database.h
Normal file
69
src/Database.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
//
|
||||||
|
// Database.hpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/5/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Database_hpp
|
||||||
|
#define Database_hpp
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <mongocxx/client.hpp>
|
||||||
|
#include <mongocxx/uri.hpp>
|
||||||
|
#include <mongocxx/instance.hpp>
|
||||||
|
|
||||||
|
#include <bsoncxx/builder/stream/document.hpp>
|
||||||
|
#include <bsoncxx/json.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "Card.h"
|
||||||
|
#include "Measurement.h"
|
||||||
|
#include "WellTest.h"
|
||||||
|
#include "FluidShot.h"
|
||||||
|
|
||||||
|
using bsoncxx::builder::stream::close_array;
|
||||||
|
using bsoncxx::builder::stream::close_document;
|
||||||
|
using bsoncxx::builder::stream::document;
|
||||||
|
using bsoncxx::builder::stream::finalize;
|
||||||
|
using bsoncxx::builder::stream::open_array;
|
||||||
|
using bsoncxx::builder::stream::open_document;
|
||||||
|
|
||||||
|
class Database{
|
||||||
|
private:
|
||||||
|
std::string pocDatabase = "poc";
|
||||||
|
// mongocxx::instance mongoInstance{};
|
||||||
|
// mongocxx::uri mongoUri;
|
||||||
|
// mongocxx::client mongoClient;
|
||||||
|
mongocxx::instance instance{};
|
||||||
|
mongocxx::client mongoClient{mongocxx::uri{"mongodb://poc_www:HenryPump1903@localhost/?authSource=poc"}};
|
||||||
|
mongocxx::database pocDb;
|
||||||
|
|
||||||
|
|
||||||
|
mongocxx::collection cardCollection, wellDataCollection, gaugeOffCollection, wellTestCollection,
|
||||||
|
fluidShotsCollection, runStatusCollection, wellConfigCollection, setpointCollection;
|
||||||
|
void initCollections();
|
||||||
|
|
||||||
|
public:
|
||||||
|
Database();
|
||||||
|
long getLastStrokeNumber();
|
||||||
|
long newCard(Card &inpCard);
|
||||||
|
long newMeasurement(Measurement &inpMeasurement);
|
||||||
|
int getLastStoredMeasurementAndUpdate(Measurement &inpMeasurement);
|
||||||
|
long newDailyTotal(Measurement &inpMeasurement);
|
||||||
|
double getPreviousDailyProductionTotal(std::chrono::milliseconds timestamp);
|
||||||
|
long newWellTest(WellTest inp);
|
||||||
|
WellTest getPreviousWellTest(std::chrono::milliseconds timeParameter);
|
||||||
|
double getLatestKFactor();
|
||||||
|
long newFluidShot(FluidShot inp);
|
||||||
|
double getLatestFrictionEstimate();
|
||||||
|
long newRunStatus(std::string runStatus, std::string initiator);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* Database_hpp */
|
||||||
60
src/DigitalIn.cpp
Normal file
60
src/DigitalIn.cpp
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* DigitalIn.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 27, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DigitalIn.h"
|
||||||
|
|
||||||
|
DigitalIn::DigitalIn(int channel) {
|
||||||
|
this->channel = channel;
|
||||||
|
value = -1;
|
||||||
|
channelMux[0] = MUX_VALUES[channel][0];
|
||||||
|
channelMux[1] = MUX_VALUES[channel][1];
|
||||||
|
channelMux[2] = MUX_VALUES[channel][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
int DigitalIn::read(MuxSetup *mux){
|
||||||
|
mux->set(channelMux[0], channelMux[1], channelMux[2]);
|
||||||
|
value = mux->readDigital();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
DigitalIn::~DigitalIn() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
MuxSetup mux;
|
||||||
|
|
||||||
|
DigitalIn dI1(1);
|
||||||
|
DigitalIn dI2(2);
|
||||||
|
DigitalIn dI3(3);
|
||||||
|
DigitalIn dI4(4);
|
||||||
|
DigitalIn dI5(5);
|
||||||
|
DigitalIn dI6(6);
|
||||||
|
DigitalIn dI7(7);
|
||||||
|
DigitalIn dI8(8);
|
||||||
|
|
||||||
|
int d1v = dI1.read(&mux);
|
||||||
|
int d2v = dI2.read(&mux);
|
||||||
|
int d3v = dI3.read(&mux);
|
||||||
|
int d4v = dI4.read(&mux);
|
||||||
|
int d5v = dI5.read(&mux);
|
||||||
|
int d6v = dI6.read(&mux);
|
||||||
|
int d7v = dI7.read(&mux);
|
||||||
|
int d8v = dI8.read(&mux);
|
||||||
|
|
||||||
|
std::cout << "DigIn 1: " << d1v << std::endl;
|
||||||
|
std::cout << "DigIn 2: " << d2v << std::endl;
|
||||||
|
std::cout << "DigIn 3: " << d3v << std::endl;
|
||||||
|
std::cout << "DigIn 4: " << d4v << std::endl;
|
||||||
|
std::cout << "DigIn 5: " << d5v << std::endl;
|
||||||
|
std::cout << "DigIn 6: " << d6v << std::endl;
|
||||||
|
std::cout << "DigIn 7: " << d7v << std::endl;
|
||||||
|
std::cout << "DigIn 8: " << d8v << std::endl;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
25
src/DigitalIn.h
Normal file
25
src/DigitalIn.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* DigitalIn.h
|
||||||
|
*
|
||||||
|
* Created on: Jun 27, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DIGITALIN_H_
|
||||||
|
#define DIGITALIN_H_
|
||||||
|
|
||||||
|
#include "MuxSetup.h"
|
||||||
|
|
||||||
|
class DigitalIn {
|
||||||
|
private:
|
||||||
|
int channel;
|
||||||
|
int value;
|
||||||
|
int channelMux[3];
|
||||||
|
|
||||||
|
public:
|
||||||
|
DigitalIn(int channel);
|
||||||
|
int read(MuxSetup *mux);
|
||||||
|
virtual ~DigitalIn();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DIGITALIN_H_ */
|
||||||
91
src/DigitalOut.cpp
Normal file
91
src/DigitalOut.cpp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* DigitalOut.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 26, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "DigitalOut.h"
|
||||||
|
|
||||||
|
DigitalOut::DigitalOut(int chan) {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
switch (chan){
|
||||||
|
case 1:
|
||||||
|
channel = 29;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
channel = 28;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
channel = 27;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
channel = 26;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
channel = 6;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
channel = 5;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
channel = 4;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
channel = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
channel = 0;
|
||||||
|
// std::cout << "Cannot setup channel " << chan;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pin = new mraa::Gpio(channel);
|
||||||
|
pin->dir(mraa::DIR_OUT);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DigitalOut::write(int value){
|
||||||
|
pin->write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
DigitalOut::~DigitalOut() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
pin->write(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
DigitalOut dO1(1);
|
||||||
|
DigitalOut dO2(2);
|
||||||
|
DigitalOut dO3(3);
|
||||||
|
DigitalOut dO4(4);
|
||||||
|
DigitalOut dO5(5);
|
||||||
|
DigitalOut dO6(6);
|
||||||
|
|
||||||
|
dO1.write(1);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO2.write(1);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO3.write(1);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO4.write(1);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO5.write(1);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO6.write(1);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO6.write(0);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO5.write(0);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO4.write(0);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO3.write(0);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO2.write(0);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
dO1.write(0);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
28
src/DigitalOut.h
Normal file
28
src/DigitalOut.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* DigitalOut.h
|
||||||
|
*
|
||||||
|
* Created on: Jun 26, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DIGITALOUT_H_
|
||||||
|
#define DIGITALOUT_H_
|
||||||
|
|
||||||
|
#include "mraa.hpp"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <thread>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
class DigitalOut {
|
||||||
|
private:
|
||||||
|
int channel;
|
||||||
|
mraa::Gpio* pin;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DigitalOut(int chan);
|
||||||
|
void write(int val);
|
||||||
|
virtual ~DigitalOut();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DIGITALOUT_H_ */
|
||||||
40
src/FluidShot.cpp
Normal file
40
src/FluidShot.cpp
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// FluidShot.cpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/7/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "FluidShot.h"
|
||||||
|
|
||||||
|
|
||||||
|
FluidShot::FluidShot(double fluidLevel, double fluidGradient, double downholeLoadSpan, double totalDepth, double pumpArea){
|
||||||
|
this->fluidLevel = fluidLevel;
|
||||||
|
pumpIntakePressure = fluidLevel * fluidGradient;
|
||||||
|
|
||||||
|
frictionEstimate = downholeLoadSpan - (fluidGradient * totalDepth - pumpIntakePressure) * pumpArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
double FluidShot::getFluidLevel(){
|
||||||
|
return fluidLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
double FluidShot::getPumpIntakePressure(){
|
||||||
|
return pumpIntakePressure;
|
||||||
|
}
|
||||||
|
|
||||||
|
double FluidShot::getFluidGradient(){
|
||||||
|
return fluidGradient;
|
||||||
|
}
|
||||||
|
|
||||||
|
double FluidShot::getFrictionEstimate(){
|
||||||
|
return frictionEstimate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FluidShot::initFromDatabase(double fluidLevel, double pumpIntakePressure, double fluidGradient, double frictionEstimate){
|
||||||
|
this->fluidLevel = fluidLevel;
|
||||||
|
this->pumpIntakePressure = pumpIntakePressure;
|
||||||
|
this->fluidGradient = fluidGradient;
|
||||||
|
this->frictionEstimate = frictionEstimate;
|
||||||
|
}
|
||||||
32
src/FluidShot.h
Normal file
32
src/FluidShot.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
//
|
||||||
|
// FluidShot.hpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/7/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef FluidShot_h
|
||||||
|
#define FluidShot_h
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
class FluidShot{
|
||||||
|
public:
|
||||||
|
FluidShot(double fluidLevel, double fluidGradient, double downholeLoadSpan, double totalDepth, double pumpArea);
|
||||||
|
double getFluidLevel();
|
||||||
|
double getPumpIntakePressure();
|
||||||
|
double getFluidGradient();
|
||||||
|
double getFrictionEstimate();
|
||||||
|
void initFromDatabase(double fluidLevel, double pumpIntakePressure, double fluidGradient, double frictionEstimate);
|
||||||
|
|
||||||
|
private:
|
||||||
|
double fluidLevel;
|
||||||
|
double pumpIntakePressure;
|
||||||
|
double fluidGradient;
|
||||||
|
double frictionEstimate;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* FluidShot_h */
|
||||||
30
src/LPPair.cpp
Normal file
30
src/LPPair.cpp
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* LPPair.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jul 3, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "LPPair.h"
|
||||||
|
|
||||||
|
LPPair::LPPair(double position, double load) {
|
||||||
|
this->position = position;
|
||||||
|
this->load = load;
|
||||||
|
}
|
||||||
|
|
||||||
|
double LPPair::getLoad(){
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
double LPPair::getPosition(){
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LPPair::set(double position, double load){
|
||||||
|
this->position = position;
|
||||||
|
this->load = load;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPPair::~LPPair() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
26
src/LPPair.h
Normal file
26
src/LPPair.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* LPPair.h
|
||||||
|
*
|
||||||
|
* Created on: Jul 3, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LPPAIR_H_
|
||||||
|
#define LPPAIR_H_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class LPPair {
|
||||||
|
public:
|
||||||
|
LPPair(double position, double load);
|
||||||
|
double getPosition();
|
||||||
|
double getLoad();
|
||||||
|
void set(double position, double load);
|
||||||
|
virtual ~LPPair();
|
||||||
|
|
||||||
|
private:
|
||||||
|
double position;
|
||||||
|
double load;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* LPPAIR_H_ */
|
||||||
31
src/LPStatus.cpp
Normal file
31
src/LPStatus.cpp
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* LPStatus.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jul 3, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "LPStatus.h"
|
||||||
|
|
||||||
|
LPStatus::LPStatus(double position, double load, int status) {
|
||||||
|
this->position = position;
|
||||||
|
this->load = load;
|
||||||
|
this->status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
double LPStatus::getPosition(){
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
double LPStatus::getLoad(){
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LPStatus::getStatus(){
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPStatus::~LPStatus() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
24
src/LPStatus.h
Normal file
24
src/LPStatus.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* LPStatus.h
|
||||||
|
*
|
||||||
|
* Created on: Jul 3, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LPSTATUS_H_
|
||||||
|
#define LPSTATUS_H_
|
||||||
|
|
||||||
|
class LPStatus {
|
||||||
|
public:
|
||||||
|
LPStatus(double position, double load, int status);
|
||||||
|
double getPosition();
|
||||||
|
double getLoad();
|
||||||
|
int getStatus();
|
||||||
|
virtual ~LPStatus();
|
||||||
|
|
||||||
|
private:
|
||||||
|
double position, load;
|
||||||
|
int status;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* LPSTATUS_H_ */
|
||||||
169
src/Measurement.cpp
Normal file
169
src/Measurement.cpp
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
//
|
||||||
|
// Measurement.cpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/6/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Measurement.h"
|
||||||
|
|
||||||
|
Measurement::Measurement(std::string tagName){
|
||||||
|
this-> tagName = tagName;
|
||||||
|
|
||||||
|
average = 0;
|
||||||
|
total = 0;
|
||||||
|
numMeasurements = 0;
|
||||||
|
dailyMax = -__DBL_MAX__;
|
||||||
|
dailyMin = __DBL_MAX__;
|
||||||
|
|
||||||
|
lastSentValue = 0.0;
|
||||||
|
lastSentTimestamp = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void shiftright (double myarray[], int size)
|
||||||
|
{
|
||||||
|
double temp;
|
||||||
|
|
||||||
|
for (int i=0; i<(size -1); i++)
|
||||||
|
{
|
||||||
|
temp = myarray[size-1];
|
||||||
|
myarray[size-1] = myarray[i];
|
||||||
|
myarray[i] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getCurrentValue(){
|
||||||
|
return currentValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getLastValue(){
|
||||||
|
return lastValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getAverage(){
|
||||||
|
return average;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getTotal(){
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Measurement::getNumMeasurements(){
|
||||||
|
return numMeasurements;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Measurement::getTagName(){
|
||||||
|
return tagName;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getDailyMin(){
|
||||||
|
return dailyMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getDailyMax(){
|
||||||
|
return dailyMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Measurement::getSendDelta(){
|
||||||
|
return sendDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measurement::setSendDelta(double sendDelta){
|
||||||
|
this->sendDelta = sendDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
long Measurement::getSendTimeDelta(){
|
||||||
|
return sendTimeDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measurement::setSendTimeDelta(long sendTimeDelta){
|
||||||
|
this->sendTimeDelta = sendTimeDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Measurement::getUnits(){
|
||||||
|
return units;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measurement::setUnits(std::string units){
|
||||||
|
this->units = units;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Measurement::getUseTotal(){
|
||||||
|
return useTotal;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measurement::setUseTotal(bool useTotal){
|
||||||
|
this->useTotal = useTotal;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Measurement::getUseAverage(){
|
||||||
|
return useAverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measurement::setUseAverage(bool useAverage){
|
||||||
|
this->useAverage = useAverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Measurement::setFromDatabase(double average, double total, double dailyMin, double dailyMax, double sendDelta, long sendTimeDelta, double lastSentValue, long numMeasurements){
|
||||||
|
this->average = average;
|
||||||
|
this->total = total;
|
||||||
|
this->dailyMin = dailyMin;
|
||||||
|
this->dailyMax = dailyMax;
|
||||||
|
this->sendDelta = sendDelta;
|
||||||
|
this->sendTimeDelta = sendTimeDelta;
|
||||||
|
this->lastSentValue = lastSentValue;
|
||||||
|
this->numMeasurements = numMeasurements;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Measurement::update(double value){
|
||||||
|
int reportValue = 0;
|
||||||
|
long currentTimestamp = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();
|
||||||
|
|
||||||
|
lastValue = currentValue;
|
||||||
|
currentValue = value;
|
||||||
|
|
||||||
|
numMeasurements = numMeasurements + 1;
|
||||||
|
average = average * (((double)numMeasurements - 1)/(double)numMeasurements) + (currentValue / (double)numMeasurements);
|
||||||
|
total = total + value;
|
||||||
|
|
||||||
|
dailyMax = std::max(dailyMax, currentValue);
|
||||||
|
dailyMin = std::min(dailyMin, currentValue);
|
||||||
|
|
||||||
|
if(std::abs(currentValue - lastSentValue) > sendDelta){
|
||||||
|
reportValue = 1;
|
||||||
|
} else if ((currentTimestamp - lastSentTimestamp) > (sendTimeDelta)){
|
||||||
|
reportValue = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reportValue > 0){
|
||||||
|
lastSentValue = currentValue;
|
||||||
|
lastSentTimestamp = currentTimestamp;
|
||||||
|
}
|
||||||
|
return reportValue;
|
||||||
|
}
|
||||||
|
void Measurement::endOfDay(){
|
||||||
|
shiftright(totalHistory, 100);
|
||||||
|
shiftright(averageHistory, 100);
|
||||||
|
|
||||||
|
totalHistory[0] = total;
|
||||||
|
averageHistory[0] = average;
|
||||||
|
|
||||||
|
total = 0;
|
||||||
|
average = 0;
|
||||||
|
dailyMax = -__DBL_MAX__;
|
||||||
|
dailyMin = __DBL_MAX__;
|
||||||
|
numMeasurements = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
67
src/Measurement.h
Normal file
67
src/Measurement.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
//
|
||||||
|
// Measurement.hpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/6/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Measurement_hpp
|
||||||
|
#define Measurement_hpp
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string>
|
||||||
|
#include <cmath>
|
||||||
|
#include <math.h>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
class Measurement{
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string tagName;
|
||||||
|
double currentValue;
|
||||||
|
double lastValue;
|
||||||
|
double average;
|
||||||
|
double total;
|
||||||
|
double dailyMax;
|
||||||
|
double dailyMin;
|
||||||
|
double totalHistory[30];
|
||||||
|
double averageHistory[30];
|
||||||
|
long numMeasurements;
|
||||||
|
double lastSentValue;
|
||||||
|
double sendDelta;
|
||||||
|
long lastSentTimestamp;
|
||||||
|
long sendTimeDelta;
|
||||||
|
std::string units;
|
||||||
|
bool useTotal;
|
||||||
|
bool useAverage;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Measurement(std::string tagName);
|
||||||
|
double getCurrentValue();
|
||||||
|
double getLastValue();
|
||||||
|
double getAverage();
|
||||||
|
double getTotal();
|
||||||
|
long getNumMeasurements();
|
||||||
|
std::string getTagName();
|
||||||
|
double getDailyMin();
|
||||||
|
double getDailyMax();
|
||||||
|
double getSendDelta();
|
||||||
|
void setSendDelta(double sendDelta);
|
||||||
|
long getSendTimeDelta();
|
||||||
|
void setSendTimeDelta(long sendTimeDelta);
|
||||||
|
std::string getUnits();
|
||||||
|
void setUnits(std::string units);
|
||||||
|
bool getUseTotal();
|
||||||
|
void setUseTotal(bool useTotal);
|
||||||
|
bool getUseAverage();
|
||||||
|
void setUseAverage(bool useAverage);
|
||||||
|
void setFromDatabase(double average, double total, double dailyMin, double dailyMax, double sendDelta, long sendTimeDelta, double lastSentValue, long numMeasurements);
|
||||||
|
int update(double value);
|
||||||
|
void endOfDay();
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* Measurement_hpp */
|
||||||
99
src/MuxSetup.cpp
Normal file
99
src/MuxSetup.cpp
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* MuxSetup.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 27, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MuxSetup.h"
|
||||||
|
|
||||||
|
int PIN_MUX_1 = 21;
|
||||||
|
int PIN_MUX_2 = 22;
|
||||||
|
int PIN_MUX_3 = 23;
|
||||||
|
int PIN_DIGITAL_READ = 24;
|
||||||
|
int PIN_ANOUT_TRIGGER = 4;
|
||||||
|
|
||||||
|
int SPI_CHANNEL = 0;
|
||||||
|
|
||||||
|
MuxSetup::MuxSetup() {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
|
||||||
|
mux1value = 0;
|
||||||
|
mux2value = 0;
|
||||||
|
mux3value = 0;
|
||||||
|
|
||||||
|
pinMux1 = new mraa::Gpio(PIN_MUX_1);
|
||||||
|
mraa::Result response = pinMux1->dir(mraa::DIR_OUT);
|
||||||
|
|
||||||
|
pinMux2 = new mraa::Gpio(PIN_MUX_2);
|
||||||
|
response = pinMux2->dir(mraa::DIR_OUT);
|
||||||
|
|
||||||
|
pinMux3 = new mraa::Gpio(PIN_MUX_3);
|
||||||
|
response = pinMux3->dir(mraa::DIR_OUT);
|
||||||
|
|
||||||
|
pinDigitalRead = new mraa::Gpio(PIN_DIGITAL_READ);
|
||||||
|
response = pinDigitalRead->dir(mraa::DIR_OUT);
|
||||||
|
|
||||||
|
pinAnOutTrigger = new mraa::Gpio(PIN_ANOUT_TRIGGER);
|
||||||
|
response = pinAnOutTrigger->dir(mraa::DIR_OUT);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spi = new mraa::Spi(SPI_CHANNEL);
|
||||||
|
|
||||||
|
pinAnOutTrigger->write(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int MuxSetup::apply(){
|
||||||
|
pinMux1->write(mux1value);
|
||||||
|
pinMux2->write(mux2value);
|
||||||
|
pinMux3->write(mux3value);
|
||||||
|
|
||||||
|
return mux1value + mux2value * 2 + mux3value * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MuxSetup::set(int v1, int v2, int v3){
|
||||||
|
|
||||||
|
mux1value = v1;
|
||||||
|
mux2value = v2;
|
||||||
|
mux3value = v3;
|
||||||
|
return apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
int MuxSetup::readDigital(){
|
||||||
|
return pinDigitalRead->read();
|
||||||
|
}
|
||||||
|
|
||||||
|
int MuxSetup::readAnalog(){
|
||||||
|
|
||||||
|
uint8_t zero[] = {0x00, 0x00, 0x000};
|
||||||
|
uint8_t* recv = spi->write(zero, 3);
|
||||||
|
int a = recv[0];
|
||||||
|
int b = recv[1];
|
||||||
|
int c = recv[2];
|
||||||
|
std::cout << a << " - " << b << " - " << c << std::endl;
|
||||||
|
|
||||||
|
if (c == 13){
|
||||||
|
int x = a * 256;
|
||||||
|
x = x + b;
|
||||||
|
return x;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MuxSetup::preAnalogWrite(){
|
||||||
|
pinAnOutTrigger->write(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MuxSetup::postAnalogWrite(){
|
||||||
|
pinAnOutTrigger->write(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MuxSetup::~MuxSetup() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
54
src/MuxSetup.h
Normal file
54
src/MuxSetup.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* MuxSetup.h
|
||||||
|
*
|
||||||
|
* Created on: Jun 27, 2017
|
||||||
|
* Author: patrickjmcd
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MUXSETUP_H_
|
||||||
|
#define MUXSETUP_H_
|
||||||
|
|
||||||
|
#include "mraa.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
const int MUX_VALUES[9][3] = {
|
||||||
|
{0,0,0},
|
||||||
|
{0,0,0},
|
||||||
|
{1,0,0},
|
||||||
|
{0,1,0},
|
||||||
|
{1,1,0},
|
||||||
|
{0,0,1},
|
||||||
|
{1,0,1},
|
||||||
|
{0,1,1},
|
||||||
|
{1,1,1},
|
||||||
|
};
|
||||||
|
|
||||||
|
class MuxSetup {
|
||||||
|
public:
|
||||||
|
|
||||||
|
MuxSetup();
|
||||||
|
int set(int v1, int v2, int v3);
|
||||||
|
void preAnalogWrite();
|
||||||
|
void postAnalogWrite();
|
||||||
|
int readAnalog();
|
||||||
|
int readDigital();
|
||||||
|
int writeDigital(int val);
|
||||||
|
virtual ~MuxSetup();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
int apply();
|
||||||
|
int mux1value, mux2value, mux3value;
|
||||||
|
mraa::Gpio* pinMux1;
|
||||||
|
mraa::Gpio* pinMux2;
|
||||||
|
mraa::Gpio* pinMux3;
|
||||||
|
mraa::Gpio* pinDigitalRead;
|
||||||
|
mraa::Gpio* pinAnOutTrigger;
|
||||||
|
mraa::Spi* spi;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MUXSETUP_H_ */
|
||||||
45
src/Well.cpp
Normal file
45
src/Well.cpp
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// Well.cpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/7/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Well.h"
|
||||||
|
|
||||||
|
Well::Well():
|
||||||
|
inclinometer(1, 0, 65535, 0, 145),
|
||||||
|
loadCell(2, 0, 65535, 0, 50000),
|
||||||
|
strokeSpeed("Stroke Speed"),
|
||||||
|
downholeGrossStroke("Downhole Gross Stroke"),
|
||||||
|
downholeNetStroke("Downhole Net Stroke"),
|
||||||
|
fluidLevel("Fluid Level"),
|
||||||
|
fluidLoad("Fluid Load"),
|
||||||
|
inflowRate("Inflow Rate"),
|
||||||
|
peakPolishedRodLoad("Peak Polished Rod Load"),
|
||||||
|
minPolishedRodLoad("Min Polished Rod Load"),
|
||||||
|
percentRun("Percent Run"),
|
||||||
|
polishedRodHP("Polished Rod Horsepower"),
|
||||||
|
pumpHP("Pump Horsepower"),
|
||||||
|
fluidProduced("Fluid Produced"),
|
||||||
|
fluidProducedAdjusted("Fluid Produced (Adjusted)"),
|
||||||
|
oilProduced("Oil Produced"),
|
||||||
|
waterProduced("Water Produced"),
|
||||||
|
gasProduced("Gas Produced"),
|
||||||
|
pumpIntakePressure("Pump Intake Pressure"),
|
||||||
|
surfaceStrokeLength("Surface Stroke Length"),
|
||||||
|
tubingMovement("Tubing Movement"),
|
||||||
|
pumpFillPercent("Pump Fill Percent"){
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int Well::calibrateInclinometer(){
|
||||||
|
std::cout << "Calibrating inclinometer..." << std::endl;
|
||||||
|
|
||||||
|
long now = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch()).count();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
192
src/Well.h
Normal file
192
src/Well.h
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
//
|
||||||
|
// Well.hpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/7/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Well_h
|
||||||
|
#define Well_h
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "AnalogIn.h"
|
||||||
|
#include "Card.h"
|
||||||
|
#include "Measurement.h"
|
||||||
|
#include "Database.h"
|
||||||
|
|
||||||
|
const static double YM_STEEL = 30.5;
|
||||||
|
const static double YM_FIBERGLASS = 7.2;
|
||||||
|
|
||||||
|
const static int BAD_STATUS = 0;
|
||||||
|
const static int GOOD_STATUS = 1;
|
||||||
|
|
||||||
|
const static int RUNSTATUS_STOPPED = 0;
|
||||||
|
const static int RUNSTATUS_STARTING = 1;
|
||||||
|
const static int RUNSTATUS_RUNNING = 2;
|
||||||
|
const static int RUNSTATUS_PUMPEDOFF = 3;
|
||||||
|
const static int RUNSTATUS_FAULTED = 4;
|
||||||
|
const static int RUNSTATUS_LOCKEDOUT = 5;
|
||||||
|
|
||||||
|
const static int RUNMODE_POC = 0;
|
||||||
|
const static int RUNMODE_MANUAL = 1;
|
||||||
|
const static int RUNMODE_TIMER = 2;
|
||||||
|
|
||||||
|
const static int DIRECTION_UNKNOWN = 0;
|
||||||
|
const static int DIRECTION_UP = 1;
|
||||||
|
const static int DIRECTION_DOWN = 2;
|
||||||
|
|
||||||
|
|
||||||
|
class Well{
|
||||||
|
private:
|
||||||
|
std::string wellName;
|
||||||
|
Database db;
|
||||||
|
// IO
|
||||||
|
AnalogIn inclinometer;
|
||||||
|
AnalogIn loadCell;
|
||||||
|
MuxSetup ioMux;
|
||||||
|
double currentSurfacePosition;
|
||||||
|
double currentSurfaceLoad;
|
||||||
|
double currentDownholePosition;
|
||||||
|
double currentDownholeLoad;
|
||||||
|
|
||||||
|
// CARDS
|
||||||
|
Card currentCard;
|
||||||
|
Card cardStorage[100];
|
||||||
|
|
||||||
|
// USER INPUTS
|
||||||
|
double dt;
|
||||||
|
double tubingHeadPressure;
|
||||||
|
double fluidGradient;
|
||||||
|
double stuffingBoxFriction;
|
||||||
|
int numTapers;
|
||||||
|
double tubingAnchorDepth;
|
||||||
|
double pumpDiameter;
|
||||||
|
double tubingInnerDiameter, tubingOuterDiameter;
|
||||||
|
double structuralRating;
|
||||||
|
double c[11];
|
||||||
|
double rodLength[11];
|
||||||
|
double rodDiameter[11];
|
||||||
|
double rodYM[11];
|
||||||
|
double rodWeightPerFoot[11];
|
||||||
|
|
||||||
|
// CALCULATED TAPER PARAMETERS
|
||||||
|
double frictionEstimate;
|
||||||
|
double theoreticalMaxFluidLoad;
|
||||||
|
double a[11];
|
||||||
|
double area[11];
|
||||||
|
double pressure[11];
|
||||||
|
double buoyantForce[11];
|
||||||
|
double buoyantForceTotal;
|
||||||
|
double stretch[11];
|
||||||
|
double weightData[11];
|
||||||
|
double weightDataTotal;
|
||||||
|
double annularForceData[11];
|
||||||
|
double annularForceDataTotal;
|
||||||
|
double force[11];
|
||||||
|
double alpha[11];
|
||||||
|
double xOverA[11];
|
||||||
|
double factor[11];
|
||||||
|
int lagIndex[11];
|
||||||
|
int lengthRequired[11];
|
||||||
|
int centerPoint[11];
|
||||||
|
double rodDepth[11];
|
||||||
|
double rodDepthTotal;
|
||||||
|
double rodWeightAir[11];
|
||||||
|
double rodWeightAirTotal;
|
||||||
|
double rodWeightFluid[11];
|
||||||
|
double rodWeightFluidTotal;
|
||||||
|
double pumpArea;
|
||||||
|
double tubingCrossSectionalArea;
|
||||||
|
|
||||||
|
|
||||||
|
int runStatus;
|
||||||
|
bool permissiveOK;
|
||||||
|
long strokesSinceStart = 0;
|
||||||
|
long startupStrokes = 10;
|
||||||
|
long strokesToday = 0;
|
||||||
|
long strokesLifetime;
|
||||||
|
int pointCounter = 0;
|
||||||
|
|
||||||
|
// DIRECTION
|
||||||
|
int direction = DIRECTION_UNKNOWN;
|
||||||
|
int lastDirection = DIRECTION_UNKNOWN;
|
||||||
|
|
||||||
|
// RUN MODE
|
||||||
|
int runMode = RUNMODE_POC;
|
||||||
|
|
||||||
|
|
||||||
|
// Intermediate Variables
|
||||||
|
double topPosArray[10][500];
|
||||||
|
double topLoadArray[10][500];
|
||||||
|
double loadBefore = 0.0;
|
||||||
|
double loadAfter = 0.0;
|
||||||
|
double loadBefore3 = 0.0;
|
||||||
|
double loadAfter3 = 0.0;
|
||||||
|
int count[11];
|
||||||
|
double sPositionPrevious;
|
||||||
|
|
||||||
|
// Fluid Makeup
|
||||||
|
double fluidOilRatio; // BBL of oil per 1 BBL fluid
|
||||||
|
double fluidWaterRatio; // BBL of water per 1 BBL fluid
|
||||||
|
double fluidGasRatio; // MCF of gas per 1 BBL fluid
|
||||||
|
double kFactor = 1.0;
|
||||||
|
|
||||||
|
std::chrono::milliseconds now;
|
||||||
|
|
||||||
|
Measurement strokeSpeed;
|
||||||
|
Measurement downholeGrossStroke;
|
||||||
|
Measurement downholeNetStroke;
|
||||||
|
Measurement fluidLevel;
|
||||||
|
Measurement fluidLoad;
|
||||||
|
Measurement inflowRate;
|
||||||
|
Measurement peakPolishedRodLoad;
|
||||||
|
Measurement minPolishedRodLoad;
|
||||||
|
Measurement percentRun;
|
||||||
|
Measurement polishedRodHP;
|
||||||
|
Measurement pumpHP;
|
||||||
|
Measurement fluidProduced;
|
||||||
|
Measurement fluidProducedAdjusted;
|
||||||
|
Measurement oilProduced;
|
||||||
|
Measurement waterProduced;
|
||||||
|
Measurement gasProduced;
|
||||||
|
Measurement pumpIntakePressure;
|
||||||
|
Measurement surfaceStrokeLength;
|
||||||
|
Measurement tubingMovement;
|
||||||
|
Measurement pumpFillPercent;
|
||||||
|
|
||||||
|
std::chrono::milliseconds pumpStartTime;
|
||||||
|
|
||||||
|
// POC Mode Setpoints
|
||||||
|
double pumpOffFillPercentSetpoint;
|
||||||
|
int pumpOffStrokesSetpoint;
|
||||||
|
long pumpOffDowntimeMinutesSetpoint;
|
||||||
|
|
||||||
|
// POC Mode Status
|
||||||
|
int lowFillageStrokes = 0;
|
||||||
|
std::chrono::milliseconds pumpedOffTime;
|
||||||
|
long minutesSincePumpOff = 0;
|
||||||
|
long minutesSincePumpOff_last = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// Timer Mode Setpoints
|
||||||
|
long timerRunMinutesSetpoint;
|
||||||
|
long timerOffMinutesSetpoint;
|
||||||
|
|
||||||
|
// Timer Mode status
|
||||||
|
std::chrono::milliseconds timerStopTime;
|
||||||
|
long minutesSinceTimerStop = 0;
|
||||||
|
long minutesSinceTimerStop_last = 0;
|
||||||
|
long minutesSinceTimerStart = 0;
|
||||||
|
long minutesSinceTimerStart_last = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
Well();
|
||||||
|
int calibrateInclinometer();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* Well_h */
|
||||||
100
src/WellTest.cpp
Normal file
100
src/WellTest.cpp
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
//
|
||||||
|
// WellTest.cpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/6/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "WellTest.h"
|
||||||
|
|
||||||
|
WellTest::WellTest(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WellTest::WellTest(std::chrono::milliseconds testCompletedTimestamp, double testHours, double totalFluidBbl, double testOilBbl, double testWaterBbl, double testGasMcf, double prevDailyTotal){
|
||||||
|
|
||||||
|
this->testCompletedTimestamp = testCompletedTimestamp;
|
||||||
|
this->testHours = testHours;
|
||||||
|
this->totalFluidBbl = totalFluidBbl;
|
||||||
|
this->testOilBbl = testOilBbl;
|
||||||
|
this->testWaterBbl = testWaterBbl;
|
||||||
|
this->testGasMcf = testGasMcf;
|
||||||
|
|
||||||
|
this->oilRatio = testOilBbl / totalFluidBbl;
|
||||||
|
this->waterRatio = testWaterBbl / totalFluidBbl;
|
||||||
|
this->gasMcfRatio = testGasMcf / totalFluidBbl;
|
||||||
|
|
||||||
|
this->kFactor = 1.0;
|
||||||
|
|
||||||
|
if(prevDailyTotal != -1.0){;
|
||||||
|
this->kFactor = totalFluidBbl / prevDailyTotal;
|
||||||
|
} else {
|
||||||
|
std::cout << "No production data in db" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getTestHours(){
|
||||||
|
return testHours;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::chrono::milliseconds WellTest::getTestCompletedTimestamp(){
|
||||||
|
return testCompletedTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getTotalFluidBbl(){
|
||||||
|
return totalFluidBbl;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getTestOilBbl(){
|
||||||
|
return testOilBbl;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getTestWaterBbl(){
|
||||||
|
return testWaterBbl;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getTestGasMcf(){
|
||||||
|
return testGasMcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getKFactor(){
|
||||||
|
return kFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getOilRatio(){
|
||||||
|
return oilRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getWaterRatio(){
|
||||||
|
return waterRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
double WellTest::getGasMcfRatio(){
|
||||||
|
return gasMcfRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WellTest::initFromDatabase(std::chrono::milliseconds testCompletedTimestamp, double testHours, double totalFluidBbl, double testOilBbl, double testWaterBbl, double testGasMcf, double kFactor, double oilRatio, double waterRatio, double gasMcfRatio){
|
||||||
|
this->testCompletedTimestamp = testCompletedTimestamp;
|
||||||
|
this->testHours = testHours;
|
||||||
|
this-> totalFluidBbl = totalFluidBbl;
|
||||||
|
this->testOilBbl = testOilBbl;
|
||||||
|
this->testWaterBbl = testWaterBbl;
|
||||||
|
this->testGasMcf = testGasMcf;
|
||||||
|
this->kFactor = kFactor;
|
||||||
|
this->oilRatio = oilRatio;
|
||||||
|
this->waterRatio = waterRatio;
|
||||||
|
this->gasMcfRatio = gasMcfRatio;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void WellTest::print(){
|
||||||
|
std::cout << "Well Test started at " << &testCompletedTimestamp << " lasting " << testHours << " hours";
|
||||||
|
std::cout << "Fluid BBL: " << totalFluidBbl;
|
||||||
|
std::cout << "Oil BBL: " << testOilBbl;
|
||||||
|
std::cout << "Water BBL: " << testWaterBbl;
|
||||||
|
std::cout << "Gas MCF: " << testGasMcf;
|
||||||
|
std::cout << "New Ratio Oil/Water/Gas: " << oilRatio << "/" << waterRatio << "/" << gasMcfRatio;
|
||||||
|
std::cout << "New Correction Factor: " << kFactor;
|
||||||
|
}
|
||||||
44
src/WellTest.h
Normal file
44
src/WellTest.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
//
|
||||||
|
// WellTest.hpp
|
||||||
|
// POCpp
|
||||||
|
//
|
||||||
|
// Created by Patrick McDonagh on 7/6/17.
|
||||||
|
// Copyright © 2017 Henry Pump. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef WellTest_hpp
|
||||||
|
#define WellTest_hpp
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class WellTest {
|
||||||
|
public:
|
||||||
|
WellTest();
|
||||||
|
WellTest(std::chrono::milliseconds testCompleted, double testHours, double totalFluidBbl, double testOilBbl, double testWaterBbl, double testGasMcf, double prevDailyTotal);
|
||||||
|
double getTestHours();
|
||||||
|
std::chrono::milliseconds getTestCompletedTimestamp();
|
||||||
|
double getTotalFluidBbl();
|
||||||
|
double getTestOilBbl();
|
||||||
|
double getTestWaterBbl();
|
||||||
|
double getTestGasMcf();
|
||||||
|
double getKFactor();
|
||||||
|
double getOilRatio();
|
||||||
|
double getWaterRatio();
|
||||||
|
double getGasMcfRatio();
|
||||||
|
void initFromDatabase(std::chrono::milliseconds testCompletedTimestamp, double testHours, double totalFluidBbl, double testOilBbl, double testWaterBbl, double testGasMcf, double kFactor, double oilRatio, double waterRatio, double gasMcfRatio);
|
||||||
|
void print();
|
||||||
|
|
||||||
|
private:
|
||||||
|
double testHours;
|
||||||
|
std::chrono::milliseconds testCompletedTimestamp;
|
||||||
|
|
||||||
|
|
||||||
|
double totalFluidBbl, testOilBbl, testWaterBbl, testGasMcf;
|
||||||
|
double kFactor, oilRatio, waterRatio, gasMcfRatio;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* WellTest_hpp */
|
||||||
Reference in New Issue
Block a user