Move files to gradle structure
This commit is contained in:
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.gradle
|
||||||
|
.settings
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
.maven
|
||||||
|
build
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,82 +0,0 @@
|
|||||||
% Configfile_begin
|
|
||||||
% config file for wiiscan
|
|
||||||
|
|
||||||
% all usb device ids, not used yet in the scanning
|
|
||||||
all_usb_hubs=""
|
|
||||||
|
|
||||||
% single power controlling usb hub, only nessesary when powerering over usb, for automatic resetting. If not used, put ""
|
|
||||||
% active_usb_hub="@PCI\VEN_8086&DEV_2934&SUBSYS_20F017AA&REV_03\3&B1BFB68&0&E8"
|
|
||||||
active_usb_hub=""
|
|
||||||
|
|
||||||
% a list of allowed wiimotes in the form xx:xx:xx:xx:xx:xx, wildcard match is 00:00:00:00:00:00
|
|
||||||
allowed_wiimote_adr=00:00:00:00:00:00
|
|
||||||
% my set of wiimotes
|
|
||||||
%allowed_wiimote_adr=00:19:?D:??:6?:?? 00:1F:C5:??:??:??
|
|
||||||
|
|
||||||
% launching exe file have a problem with spaces, hence renamed exe, replaced space with underscores
|
|
||||||
% The original Johnny Chung Lee wb software version 0.3, downloaded from [http://johnnylee.net/projects/wii/]
|
|
||||||
%whiteboard_software="d:/WiimoteWhiteboard/WiimoteWhiteboard_v0.3.exe"
|
|
||||||
|
|
||||||
% same stuff, but binary build from sources and redistributed in this package
|
|
||||||
%whiteboard_software="WiimoteWhiteboard.exe"
|
|
||||||
|
|
||||||
% and finally, a custom build v0.3 version, with fixed calibration.dat write
|
|
||||||
whiteboard_software=WiimoteWhiteboard_v0.3.exe
|
|
||||||
|
|
||||||
% Boon Jin's wb software version 0.6
|
|
||||||
%whiteboard_software="d:/wsb/WiimoteSmoothboard.exe"
|
|
||||||
|
|
||||||
% wiiscan parameters
|
|
||||||
%option_device="Nintendo RVL-CNT-01"
|
|
||||||
|
|
||||||
% number of bt scanning attempts in a autoscan, timout is increased for every scan as retryattempt*option_timeout
|
|
||||||
%option_scanretries=3
|
|
||||||
|
|
||||||
% long time (4000 and above, or increase option_scanretries) when matching name, short (1000-2000) when matching address
|
|
||||||
option_timeout=4000
|
|
||||||
|
|
||||||
% wiimote scanning time, only applicable used for wiilib
|
|
||||||
option_wiitimeout=1000
|
|
||||||
|
|
||||||
% delay bewteen powerdown/up, see man for details
|
|
||||||
option_usbsleep=1000
|
|
||||||
option_usbmsleep=1000
|
|
||||||
%option_btsleep=2000
|
|
||||||
|
|
||||||
% output verbose flag, 0 or 1
|
|
||||||
option_debug=1
|
|
||||||
|
|
||||||
% start wb at successfull connect, 0 or 1
|
|
||||||
option_startwhiteboard=1
|
|
||||||
|
|
||||||
% logging output file, typical wiiscan_log.txt , put nothing if no logging is wanted
|
|
||||||
option_logfile=wiiscan_log.txt
|
|
||||||
|
|
||||||
% wiimote connection library, use none, wiiuse, or wiimotelib
|
|
||||||
option_wiilib=wiimotelib
|
|
||||||
|
|
||||||
% 0=no power cycle, 1=USB hub control, 2=USBm IO, 3=USB Devcon
|
|
||||||
option_usbpowermode=3
|
|
||||||
|
|
||||||
% 0=remove if not connectable, 1=always remove, 2=never remove
|
|
||||||
%option_forceremove=0
|
|
||||||
|
|
||||||
% bt radio to use, not working yet
|
|
||||||
%option_btradio=00:50:B6:A0:48:8C
|
|
||||||
|
|
||||||
% wiiscantray options
|
|
||||||
% number of connection attempts before autoscan i restarted
|
|
||||||
option_tray_pool_retries=2
|
|
||||||
|
|
||||||
% retry sleep, keep it low (<1000) to catch an open connection
|
|
||||||
option_tray_sleep_between_pool_retries=250
|
|
||||||
|
|
||||||
% sleep bewteen polls, when wiimote is succeful connected, keep it hight (>2000) to avoid to much CPU usage
|
|
||||||
option_tray_sleep_between_pool_loops=1000
|
|
||||||
|
|
||||||
% final connection step reqires some sleep before windows PnP is ready
|
|
||||||
option_sleep_before_final_connect=1500
|
|
||||||
|
|
||||||
% delay after launch of wb software, keep it at a medium value (2000-10000)
|
|
||||||
option_sleep_after_startwhiteboard=4000
|
|
||||||
% Configfile_end
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
140
build.gradle
Normal file
140
build.gradle
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
apply plugin: 'java'
|
||||||
|
apply plugin: 'cpp'
|
||||||
|
apply plugin: 'maven'
|
||||||
|
apply plugin: 'eclipse'
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
url 'https://github.com/Boukefalos/jlibloader/raw/mvn-repo/'
|
||||||
|
}
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile 'com.github.boukefalos:jlibloader:0.2'
|
||||||
|
testCompile 'junit:junit:4.11'
|
||||||
|
}
|
||||||
|
|
||||||
|
group = 'com.github.boukefalos'
|
||||||
|
project.archivesBaseName = 'wiiscan'
|
||||||
|
version = '0.9'
|
||||||
|
|
||||||
|
task wrapper(type: Wrapper) {
|
||||||
|
gradleVersion = '1.12'
|
||||||
|
}
|
||||||
|
|
||||||
|
model {
|
||||||
|
platforms {
|
||||||
|
windows_i386 {
|
||||||
|
architecture 'i386'
|
||||||
|
operatingSystem 'windows'
|
||||||
|
}
|
||||||
|
windows_amd64 {
|
||||||
|
architecture 'amd64'
|
||||||
|
operatingSystem 'windows'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toolChains {
|
||||||
|
gcc(Gcc) {
|
||||||
|
addPlatformConfiguration(new TargetPlatformConfiguration() {
|
||||||
|
boolean supportsPlatform(Platform platform) {
|
||||||
|
platform.operatingSystem.current && platform.operatingSystem.name == 'windows' &&
|
||||||
|
platform.architecture.name == 'amd64'
|
||||||
|
}
|
||||||
|
List<String> getCppCompilerArgs() { ['-m64', '-fpermissive'] }
|
||||||
|
List<String> getCCompilerArgs() { ['-m64'] }
|
||||||
|
List<String> getObjectiveCCompilerArgs() { ['-m64'] }
|
||||||
|
List<String> getObjectiveCppCompilerArgs() { ['-m64'] }
|
||||||
|
List<String> getAssemblerArgs() { ['--64'] }
|
||||||
|
List<String> getLinkerArgs() { ['-m64'] }
|
||||||
|
List<String> getStaticLibraryArchiverArgs() { [] }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
repositories {
|
||||||
|
libs(PrebuiltLibraries) {
|
||||||
|
usb { lib ->
|
||||||
|
binaries.withType(StaticLibraryBinary) {
|
||||||
|
staticLibraryFile = file("lib/${targetPlatform.name}/libusb-1.0.dll")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
libraries {
|
||||||
|
main {
|
||||||
|
baseName project.archivesBaseName
|
||||||
|
}
|
||||||
|
all {
|
||||||
|
binaries.all {
|
||||||
|
linker.args '-Wl,--kill-at', '-static-libgcc', '-static-libstdc++'
|
||||||
|
// lib library: 'usb', linkage: 'static'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType(Upload) {
|
||||||
|
repositories {
|
||||||
|
mavenDeployer {
|
||||||
|
repository(url: uri('.maven'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
jni
|
||||||
|
}
|
||||||
|
|
||||||
|
def deployer = uploadJni.repositories.mavenDeployer
|
||||||
|
|
||||||
|
binaries.withType(SharedLibraryBinary) { binary ->
|
||||||
|
if (!buildable) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
def variantName = "${targetPlatform.operatingSystem.name}-${targetPlatform.architecture.name}"
|
||||||
|
def taskName = "jar-${variantName}"
|
||||||
|
def nativeJar = project.tasks.findByName(taskName)
|
||||||
|
if (nativeJar == null) {
|
||||||
|
nativeJar = project.task(taskName, type: Jar) {
|
||||||
|
baseName = "${project.archivesBaseName}-$variantName"
|
||||||
|
}
|
||||||
|
artifacts {
|
||||||
|
jni nativeJar
|
||||||
|
}
|
||||||
|
def jniPom = deployer.addFilter(variantName) { artifact, file ->
|
||||||
|
return file == nativeJar.archivePath
|
||||||
|
}
|
||||||
|
jniPom.groupId = project.group
|
||||||
|
jniPom.artifactId = nativeJar.baseName
|
||||||
|
jniPom.version = version
|
||||||
|
jniPom.scopeMappings.mappings.clear()
|
||||||
|
}
|
||||||
|
def builderTask = binary.tasks.builder
|
||||||
|
def libraryDirectory = project.group.replace('.', '/') + "/${project.archivesBaseName}/${variantName}"
|
||||||
|
nativeJar.into(libraryDirectory) {
|
||||||
|
from builderTask.outputFile
|
||||||
|
from file("lib/${targetPlatform.name}/libusb0.dll")
|
||||||
|
}
|
||||||
|
// nativeJar.dependsOn builderTask
|
||||||
|
}
|
||||||
|
|
||||||
|
def mainPom = uploadArchives.repositories.mavenDeployer.pom
|
||||||
|
mainPom.groupId = project.group
|
||||||
|
mainPom.artifactId = jar.baseName
|
||||||
|
mainPom.version = project.version
|
||||||
|
mainPom.scopeMappings.mappings.clear()
|
||||||
|
mainPom.withXml { provider ->
|
||||||
|
def node = provider.asNode()
|
||||||
|
def deps = node.appendNode('dependencies')
|
||||||
|
['windows-amd64', 'windows-i386'].each { platform ->
|
||||||
|
def dep = deps.appendNode('dependency')
|
||||||
|
dep.appendNode('groupId', project.group)
|
||||||
|
dep.appendNode('artifactId', "${project.archivesBaseName}-${platform}")
|
||||||
|
dep.appendNode('version', jniVersion)
|
||||||
|
}
|
||||||
|
def dep = deps.appendNode('dependency')
|
||||||
|
dep.appendNode('groupId', 'com.github.boukefalos')
|
||||||
|
dep.appendNode('artifactId', 'jlibloader')
|
||||||
|
dep.appendNode('version', '0.3')
|
||||||
|
}
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#Sun Jul 10 22:54:12 BST 2016
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-1.12-bin.zip
|
||||||
164
gradlew
vendored
Normal file
164
gradlew
vendored
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS=""
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn ( ) {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die ( ) {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# For Cygwin, ensure paths are in UNIX format before anything is touched.
|
||||||
|
if $cygwin ; then
|
||||||
|
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
PRG="$0"
|
||||||
|
# Need this for relative symlinks.
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG=`dirname "$PRG"`"/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
SAVED="`pwd`"
|
||||||
|
cd "`dirname \"$PRG\"`/" >&-
|
||||||
|
APP_HOME="`pwd -P`"
|
||||||
|
cd "$SAVED" >&-
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="java"
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||||
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
|
MAX_FD="$MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
ulimit -n $MAX_FD
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Darwin, add options to specify how the application appears in the dock
|
||||||
|
if $darwin; then
|
||||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin ; then
|
||||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
|
||||||
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
|
SEP=""
|
||||||
|
for dir in $ROOTDIRSRAW ; do
|
||||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||||
|
SEP="|"
|
||||||
|
done
|
||||||
|
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||||
|
# Add a user-defined pattern to the cygpath arguments
|
||||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||||
|
fi
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
i=0
|
||||||
|
for arg in "$@" ; do
|
||||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||||
|
|
||||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||||
|
else
|
||||||
|
eval `echo args$i`="\"$arg\""
|
||||||
|
fi
|
||||||
|
i=$((i+1))
|
||||||
|
done
|
||||||
|
case $i in
|
||||||
|
(0) set -- ;;
|
||||||
|
(1) set -- "$args0" ;;
|
||||||
|
(2) set -- "$args0" "$args1" ;;
|
||||||
|
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||||
|
function splitJvmOpts() {
|
||||||
|
JVM_OPTS=("$@")
|
||||||
|
}
|
||||||
|
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||||
|
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||||
|
|
||||||
|
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
||||||
90
gradlew.bat
vendored
Normal file
90
gradlew.bat
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS=
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:init
|
||||||
|
@rem Get command-line arguments, handling Windowz variants
|
||||||
|
|
||||||
|
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||||
|
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||||
|
|
||||||
|
:win9xME_args
|
||||||
|
@rem Slurp the command line arguments.
|
||||||
|
set CMD_LINE_ARGS=
|
||||||
|
set _SKIP=2
|
||||||
|
|
||||||
|
:win9xME_args_slurp
|
||||||
|
if "x%~1" == "x" goto execute
|
||||||
|
|
||||||
|
set CMD_LINE_ARGS=%*
|
||||||
|
goto execute
|
||||||
|
|
||||||
|
:4NT_args
|
||||||
|
@rem Get arguments from the 4NT Shell from JP Software
|
||||||
|
set CMD_LINE_ARGS=%$
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
27
src/main/cpp/wiiscan.cpp
Normal file
27
src/main/cpp/wiiscan.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// Copyright © 2009 MergeIt, Aps.
|
||||||
|
//
|
||||||
|
// License LGPLv3+: GNU lesser LGPL version 3 or later <http://gnu.org/licenses/lgpl.html>.
|
||||||
|
// This is free software: you are free to change and redistribute it.
|
||||||
|
// There is NO WARRANTY, to the extent permitted by law.
|
||||||
|
//
|
||||||
|
// This file is part of wiiscan.
|
||||||
|
//
|
||||||
|
// wiiscan is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// any later version.
|
||||||
|
//
|
||||||
|
// wiiscan 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with wiiscan. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "wiiscan.h"
|
||||||
|
|
||||||
|
int main(int argc,char** argv)
|
||||||
|
{
|
||||||
|
return Wiiscan::main(argc,argv);
|
||||||
|
}
|
||||||
128
src/main/headers/DelcomDLL.h
Normal file
128
src/main/headers/DelcomDLL.h
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
// Delcom Engineering
|
||||||
|
// DelcomDLL.h
|
||||||
|
// Version 0.6
|
||||||
|
// 02/11/07
|
||||||
|
|
||||||
|
#ifndef DELCOMDLL_HEADER
|
||||||
|
#define DELCOMDLL_HEADER 1
|
||||||
|
|
||||||
|
|
||||||
|
// defines
|
||||||
|
#define OFF 0
|
||||||
|
#define ON 1
|
||||||
|
#define FLASH 2
|
||||||
|
|
||||||
|
#define USBIODS 1
|
||||||
|
#define USBDELVI 2
|
||||||
|
#define USBNDSPY 3
|
||||||
|
|
||||||
|
#define GREENLED 0
|
||||||
|
#define REDLED 1
|
||||||
|
#define BLUELED 2
|
||||||
|
|
||||||
|
#define MaxDeviceLen 512
|
||||||
|
|
||||||
|
// Typedef
|
||||||
|
typedef struct _DeviceNameStruct{
|
||||||
|
char DeviceName[MaxDeviceLen];
|
||||||
|
} DeviceNameStruct, *pDeviceNameStruct;
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned long DWORD;
|
||||||
|
typedef int BOOL;
|
||||||
|
typedef unsigned char BYTE;
|
||||||
|
typedef char CHAR;
|
||||||
|
typedef unsigned short WORD;
|
||||||
|
typedef void * HANDLE;
|
||||||
|
typedef CHAR *LPSTR, *PSTR;
|
||||||
|
typedef unsigned char uchar;
|
||||||
|
typedef unsigned int uint;
|
||||||
|
|
||||||
|
typedef struct _PacketStruct{
|
||||||
|
uchar Recipient;
|
||||||
|
uchar DeviceModel;
|
||||||
|
uchar MajorCmd;
|
||||||
|
uchar MinorCmd;
|
||||||
|
uchar DataLSB;
|
||||||
|
uchar DataMSB;
|
||||||
|
short Length;
|
||||||
|
uchar ExtData[8];
|
||||||
|
} PacketStruct,*pPacketStruct;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// DLL Generic Functions
|
||||||
|
HANDLE DelcomGetDLLHandle(void);
|
||||||
|
double __stdcall DelcomGetDLLVersion(void);
|
||||||
|
DWORD __stdcall DelcomGetDLLDate(LPSTR);
|
||||||
|
DWORD __stdcall DelcomVerboseControl( DWORD Mode, LPSTR Header );
|
||||||
|
|
||||||
|
DWORD __stdcall DelcomGetNthDevice(DWORD, DWORD, LPSTR);
|
||||||
|
DWORD __stdcall DelcomScanDevices( DWORD, DeviceNameStruct[], DWORD );
|
||||||
|
HANDLE __stdcall DelcomOpenDevice( LPSTR, DWORD);
|
||||||
|
DWORD __stdcall DelcomCloseDevice(HANDLE);
|
||||||
|
DWORD __stdcall DelcomGetDeviceCount( DWORD Type );
|
||||||
|
|
||||||
|
DWORD __stdcall DelcomReadDeviceVersion(HANDLE );
|
||||||
|
DWORD __stdcall DelcomReadDeviceSerialNum(LPSTR, HANDLE );
|
||||||
|
DWORD __stdcall DelcomSendPacket( HANDLE, pPacketStruct, pPacketStruct);
|
||||||
|
|
||||||
|
|
||||||
|
// USBDELVI - Visual Indicator Functions
|
||||||
|
DWORD __stdcall DelcomLEDControl( HANDLE hFile, DWORD Color, DWORD Mode );
|
||||||
|
DWORD __stdcall DelcomEnableAutoConfirm(HANDLE hUsb, DWORD Mode);
|
||||||
|
DWORD __stdcall DelcomEnableAutoClear(HANDLE hUsb, DWORD Mode);
|
||||||
|
DWORD __stdcall DelcomBuzzer(HANDLE hUsb, uchar Mode, uchar Freq, uchar Repeat, uchar OnTime, uchar OffTime);
|
||||||
|
DWORD __stdcall DelcomLoadInitialPhaseDelay(HANDLE hUsb, BYTE Color, BYTE Delay);
|
||||||
|
DWORD __stdcall DelcomSyncLeds(HANDLE hUsb);
|
||||||
|
DWORD __stdcall DelcomLoadPreScalar(HANDLE hUsb, BYTE PreScalar);
|
||||||
|
DWORD __stdcall DelcomLoadLedFreqDuty(HANDLE hUsb, BYTE Color, BYTE Low, BYTE High);
|
||||||
|
DWORD __stdcall DelcomGetButtonStatus(HANDLE hUsb );
|
||||||
|
DWORD __stdcall DelcomReadVersionNumber(HANDLE hUsb );
|
||||||
|
DWORD __stdcall DelcomReadSerialNumber(HANDLE hUsb );
|
||||||
|
DWORD __stdcall DelcomLEDPower( HANDLE hUsb, DWORD Color, DWORD Power );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// USBIODS - USB IO Functions
|
||||||
|
DWORD __stdcall DelcomWritePortPin(HANDLE hUsb, BYTE Port, BYTE Pin, BYTE Value );
|
||||||
|
DWORD __stdcall DelcomWritePorts(HANDLE hUsb, BYTE Port0, BYTE Port1 );
|
||||||
|
DWORD __stdcall DelcomReadPorts(HANDLE hUsb, BYTE* Port0, BYTE* Port1 );
|
||||||
|
|
||||||
|
DWORD __stdcall DelcomWrite64Bit(HANDLE hUsb, LPSTR DataExt );
|
||||||
|
DWORD __stdcall DelcomRead64Bit(HANDLE hUsb, LPSTR DataExt );
|
||||||
|
|
||||||
|
DWORD __stdcall DelcomWriteI2C(HANDLE hUsb, BYTE CmdAdd, BYTE Length, LPSTR DataExt );
|
||||||
|
DWORD __stdcall DelcomReadI2C(HANDLE hUsb, BYTE CmdAdd, BYTE Length, LPSTR DataExt );
|
||||||
|
DWORD __stdcall DelcomSelReadI2C(HANDLE hUsb, BYTE SetAddCmd, BYTE Address, BYTE ReadCmd, BYTE Length, LPSTR DataExt );
|
||||||
|
DWORD __stdcall DelcomWriteI2CEEPROM(HANDLE hUsb, DWORD Address, DWORD Length, BYTE CtrlCode, BYTE WriteDelay, LPSTR pData );
|
||||||
|
DWORD __stdcall DelcomReadI2CEEPROM(HANDLE hUsb, DWORD Address, DWORD Length, BYTE CtrlCode, LPSTR pData );
|
||||||
|
|
||||||
|
|
||||||
|
DWORD __stdcall DelcomRS232Ctrl(HANDLE hUsb, DWORD Mode, DWORD Value );
|
||||||
|
DWORD __stdcall DelcomWriteRS232(HANDLE hUsb, DWORD Length, LPSTR DataExt );
|
||||||
|
DWORD __stdcall DelcomReadRS232(HANDLE hUsb, LPSTR DataExt );
|
||||||
|
|
||||||
|
// SPI Commands
|
||||||
|
DWORD __stdcall DelcomSPIWrite( HANDLE hUsb, DWORD ClockCount, LPSTR pData);
|
||||||
|
DWORD __stdcall DelcomSPISetClock( HANDLE hUsb, DWORD ClockPeriod );
|
||||||
|
DWORD __stdcall DelcomSPIRead(HANDLE hUsb, LPSTR pData);
|
||||||
|
DWORD __stdcall DelcomSPIWr8Read64( HANDLE hUsb, DWORD WrData, DWORD ClockCount, LPSTR pData);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// USBNDSPY Functions
|
||||||
|
DWORD __stdcall DelcomNumericMode(HANDLE hUsb, BYTE Mode, BYTE Rate );
|
||||||
|
DWORD __stdcall DelcomNumericScanRate(HANDLE hUsb, BYTE ScanRate );
|
||||||
|
DWORD __stdcall DelcomNumericSetup(HANDLE hUsb, BYTE Digits );
|
||||||
|
DWORD __stdcall DelcomNumericRaw(HANDLE hUsb, LPSTR Str );
|
||||||
|
DWORD __stdcall DelcomNumericInteger(HANDLE hUsb, DWORD Number, DWORD Base );
|
||||||
|
DWORD __stdcall DelcomNumericHexaDecimal(HANDLE hUsb, DWORD Number, DWORD Base );
|
||||||
|
DWORD __stdcall DelcomNumericDouble(HANDLE hUsb, double Number, DWORD Base );
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
143
src/main/headers/args.h
Normal file
143
src/main/headers/args.h
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __ARGS_H__
|
||||||
|
#define __ARGS_H__
|
||||||
|
|
||||||
|
class args{
|
||||||
|
private:
|
||||||
|
typedef vector<string> t_args;
|
||||||
|
t_args m_args;
|
||||||
|
|
||||||
|
void Remove(t_args::iterator itt1,int n)
|
||||||
|
{
|
||||||
|
t_args args2;
|
||||||
|
for(t_args::iterator itt2=m_args.begin();itt2!=m_args.end();++itt2) {
|
||||||
|
if(itt2!=itt1) args2.push_back(*itt2);
|
||||||
|
else {if (--n>0) ++itt1;}
|
||||||
|
}
|
||||||
|
m_args=args2;
|
||||||
|
}
|
||||||
|
|
||||||
|
t_args::iterator Find(const string& v)
|
||||||
|
{
|
||||||
|
for(t_args::iterator itt=m_args.begin();itt!=m_args.end();++itt) {
|
||||||
|
if (v==*itt) return itt;
|
||||||
|
}
|
||||||
|
return m_args.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
t_args::const_iterator Find(const string& v) const
|
||||||
|
{
|
||||||
|
for(t_args::const_iterator itt=m_args.begin();itt!=m_args.end();++itt) {
|
||||||
|
if (v==*itt) return itt;
|
||||||
|
}
|
||||||
|
return m_args.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
args(const int argc,char **argv,const bool printargs=false)
|
||||||
|
{
|
||||||
|
for(int i=0;i<argc;++i) {m_args.push_back(argv[i]);}
|
||||||
|
if (printargs) cout << "% Call args: " << *this << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
string operator[](const size_t i) const
|
||||||
|
{
|
||||||
|
if(i>=size()) throw_("argument[] out of range");
|
||||||
|
return m_args[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size() const {return m_args.size();}
|
||||||
|
bool hasopt(const string& tag) const {return Find(tag)!=m_args.end();}
|
||||||
|
template<class T> T Totype(const size_t i) const {return totype<T>((*this)[i]);}
|
||||||
|
template<class T> T Tounit(const size_t i) const {
|
||||||
|
const string& s=(*this)[i+1];
|
||||||
|
#ifndef USE_UNITS
|
||||||
|
// fake test of units, primitive test, must be one-of: kpc, per_kpc and msun1E10
|
||||||
|
if (s!="kpc/h" && s!="h/kpc" && s!="msun1E10/h") throw_("bad unit=<" + s + ">, can only handle units of type: kpc/h, h/kpc, and msun1E10/h");
|
||||||
|
#endif
|
||||||
|
return totype<T>((*this)[i] + " " + s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
T parseval(const string& tag,const T& defaultval)
|
||||||
|
{
|
||||||
|
t_args::iterator itt=Find(tag);
|
||||||
|
if (itt==m_args.end() || itt+1==m_args.end()) return defaultval;
|
||||||
|
|
||||||
|
const T v=totype<T>(*(++itt));
|
||||||
|
Remove(--itt,2);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T,class R>
|
||||||
|
pair<T,R> parseval(const string& tag,const T& defaultval1,const R& defaultval2)
|
||||||
|
{
|
||||||
|
t_args::iterator itt=Find(tag);
|
||||||
|
if (itt==m_args.end() || itt+1==m_args.end() || itt+2==m_args.end()) return make_pair(defaultval1,defaultval2);
|
||||||
|
|
||||||
|
const T v1=totype<T>(*(++itt));
|
||||||
|
const R v2=totype<R>(*(++itt));
|
||||||
|
Remove(----itt,3);
|
||||||
|
|
||||||
|
return make_pair(v1,v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
T parseunit(const string& tag,const T& defaultval)
|
||||||
|
{
|
||||||
|
t_args::iterator itt=Find(tag);
|
||||||
|
if (itt==m_args.end() || itt+2==m_args.end()) return defaultval;
|
||||||
|
|
||||||
|
const string s1=*(++itt);
|
||||||
|
const string s2=*(++itt);
|
||||||
|
const T v=totype<T>(s1 + " " + s2);
|
||||||
|
Remove(----itt,3);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool parseopt(const string& tag)
|
||||||
|
{
|
||||||
|
t_args::iterator itt=Find(tag);
|
||||||
|
if (itt==m_args.end()) return false;
|
||||||
|
Remove(itt,1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getoptindex(const string& tag) const
|
||||||
|
{
|
||||||
|
int n=0;
|
||||||
|
for(t_args::const_iterator itt=m_args.begin();itt!=m_args.end();++itt,++n) {
|
||||||
|
if (tag==*itt) {
|
||||||
|
assert( n>=0 && size_t(n)<m_args.size());
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove(const size_t i,const size_t n=1)
|
||||||
|
{
|
||||||
|
if (i>m_args.size() || i+n>m_args.size()) throw_("out of range");
|
||||||
|
m_args.erase(m_args.begin()+i,m_args.begin()+i+n);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream& s,const args& v)
|
||||||
|
{
|
||||||
|
for(t_args::const_iterator itt=v.m_args.begin();itt!=v.m_args.end();++itt){
|
||||||
|
s << *itt << " ";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __ARGS_H__
|
||||||
143
src/main/headers/configfile.h
Normal file
143
src/main/headers/configfile.h
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __CONFIGFILE_H__
|
||||||
|
#define __CONFIGFILE_H__
|
||||||
|
|
||||||
|
class Configfile {
|
||||||
|
private:
|
||||||
|
typedef vector<string> t_value;
|
||||||
|
t_value m_text;
|
||||||
|
map<string,t_value> m_vals;
|
||||||
|
string m_rem;
|
||||||
|
string m_strip;
|
||||||
|
string m_file;
|
||||||
|
|
||||||
|
void Load(istream &s)
|
||||||
|
{
|
||||||
|
if (!s) throw_("bad stream in configfile input operator");
|
||||||
|
char buff[32*1024];
|
||||||
|
bool ini=true;
|
||||||
|
while(s.getline(buff,32*1024)) {
|
||||||
|
const string b(strip(buff));
|
||||||
|
if (ini && b!=m_rem + " Configfile_begin") throw_("bad stream in configfile input operator, missing begin tag");
|
||||||
|
if (b==m_rem + " Configfile_end") return;
|
||||||
|
const string t(strip(removerems(b,m_rem)));
|
||||||
|
if (t.size()>0){
|
||||||
|
m_text.push_back(t);
|
||||||
|
const size_t n=t.find_first_of("=");
|
||||||
|
istringstream s2(t.substr(0,n) + " " + (n==string::npos ? "" : t.substr(n+1)));
|
||||||
|
string v,k;
|
||||||
|
s2 >> k;
|
||||||
|
while ((s2 >> v)) m_vals[k].push_back(v);
|
||||||
|
}
|
||||||
|
ini=false;
|
||||||
|
}
|
||||||
|
throw_("bad stream in configfile input operator, missing end tag");
|
||||||
|
}
|
||||||
|
|
||||||
|
string Strip(const string& s) const
|
||||||
|
{
|
||||||
|
for(size_t i=0;i<m_strip.size();++i){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
Configfile() : m_rem("%") {}
|
||||||
|
|
||||||
|
Configfile(const string& filename,const string rem="%") : m_rem(rem), m_file(filename)
|
||||||
|
{
|
||||||
|
ifstream s(filename.c_str());
|
||||||
|
if (!s) throw_("File <" + filename + "> does not exist");
|
||||||
|
Load(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
Configfile(istream& s,const string rem="%") : m_rem(rem)
|
||||||
|
{
|
||||||
|
if (!s) throw_("stream is invalid");
|
||||||
|
Load(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size() const {return m_text.size();}
|
||||||
|
const string& operator[](const size_t n) const {assert(n<m_text.size()); return m_text[n];}
|
||||||
|
const t_value& operator()(const string& key) const {return Get(key);}
|
||||||
|
bool hasEntry (const string& key) const {map<string,t_value >::const_iterator itt=m_vals.find(key); return itt!=m_vals.end();}
|
||||||
|
void Save(const string& filename) {ofstream s(filename.c_str()); s << *this;}
|
||||||
|
|
||||||
|
bool operator==(const Configfile& c) const
|
||||||
|
{
|
||||||
|
if (m_text!=c.m_text) return false;
|
||||||
|
else if (m_vals!=c.m_vals) return false;
|
||||||
|
else if (m_rem!=c.m_rem) return false;
|
||||||
|
else if (m_strip!=c.m_strip) return false;
|
||||||
|
else if (m_file!=c.m_file) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool operator!=(const Configfile& c) const {return !this->operator==(c);}
|
||||||
|
|
||||||
|
void Checkfilechange()
|
||||||
|
{
|
||||||
|
if (m_file.empty()) return;
|
||||||
|
Configfile c(m_file);
|
||||||
|
if (c!=*this) *this=c;
|
||||||
|
}
|
||||||
|
|
||||||
|
const t_value& Get(const string& key) const
|
||||||
|
{
|
||||||
|
map<string,t_value >::const_iterator itt=m_vals.find(key);
|
||||||
|
if (itt==m_vals.end()) throw_("No such entry, <" + key + ">, in configfile");
|
||||||
|
return itt->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> const T Get(const string& key,const bool fullline=false) const
|
||||||
|
{
|
||||||
|
const t_value& v=Get(key);
|
||||||
|
assert( v.size()>0 );
|
||||||
|
string s=v[0];
|
||||||
|
if (fullline) for(size_t i=1;i<v.size();++i) s += " " + v[i];
|
||||||
|
T t=totype<T>(s);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> const T Initialize(const string& key,const T valiueifnotfound,const bool fullline=false) const
|
||||||
|
{
|
||||||
|
if (!hasEntry(key)) return valiueifnotfound;
|
||||||
|
else return Get<T>(key,fullline);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
pair<bool,T> GetConfig(const string& e) const
|
||||||
|
{
|
||||||
|
if (!hasEntry(e)) return make_pair(false,T());
|
||||||
|
else return make_pair(true,Get<T>(e,true));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> void Set(const string& key,const T& v)
|
||||||
|
{
|
||||||
|
t_value val;
|
||||||
|
val.push_back(tostring(v));
|
||||||
|
m_vals[key]=val;
|
||||||
|
m_text.push_back(key + " " + val[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream& s,const Configfile& x)
|
||||||
|
{
|
||||||
|
s << x.m_rem << " Configfile_begin\n";
|
||||||
|
for(map<string,t_value>::const_iterator itt1=x.m_vals.begin();itt1!=x.m_vals.end();++itt1){
|
||||||
|
s << "\t" << itt1->first << " = ";
|
||||||
|
for(t_value::const_iterator itt2=itt1->second.begin();itt2!=itt1->second.end();++itt2) s << *itt2 << " ";
|
||||||
|
s << "\n";
|
||||||
|
}
|
||||||
|
s << x.m_rem << " Configfile_end\n";
|
||||||
|
// if (!s) throw_("bad stream in configfile output operator");, XXX throws in cout!?
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend istream& operator>>(istream& s,Configfile& x){x.Load(s); return s;}
|
||||||
|
};
|
||||||
|
#endif // __CONFIGFILE_H__
|
||||||
197
src/main/headers/exception.h
Normal file
197
src/main/headers/exception.h
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __EXCEPTION_H__
|
||||||
|
#define __EXCEPTION_H__
|
||||||
|
|
||||||
|
// forward defs to funs.h
|
||||||
|
string Getlocaltime();
|
||||||
|
size_t GetThreadId();
|
||||||
|
int Message(const string& title,const string& msg,const int type=0);
|
||||||
|
|
||||||
|
// simple class for debugging call stack
|
||||||
|
#ifdef _DEBUG
|
||||||
|
struct Stackinfo : public vector<string> {
|
||||||
|
friend ostream& operator<<(ostream& s,const Stackinfo& x)
|
||||||
|
{
|
||||||
|
s << "Function stack {" << endl;
|
||||||
|
for(int i=x.size();i>0;--i){
|
||||||
|
const string& f=x[i-1];
|
||||||
|
s << " [" << i-1 << "]: " << f << "(...)" << endl;
|
||||||
|
}
|
||||||
|
return s << "}" << endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Funstack {
|
||||||
|
private:
|
||||||
|
const string m_f;
|
||||||
|
static map<size_t,Stackinfo> m_s;
|
||||||
|
|
||||||
|
Funstack(const Funstack&);
|
||||||
|
void operator=(const Funstack&);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Funstack(const string& f,const int line,const string& file) : m_f(f) {m_s[GetThreadId()].push_back(f);}
|
||||||
|
~Funstack()
|
||||||
|
{
|
||||||
|
const size_t tid=GetThreadId();
|
||||||
|
assert(m_s.find(tid)!=m_s.end());
|
||||||
|
assert(m_s[tid].size()>0 && m_s[tid].back()==m_f);
|
||||||
|
m_s[tid].pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Stackinfo GetStack()
|
||||||
|
{
|
||||||
|
const size_t tid=GetThreadId();
|
||||||
|
if (m_s.find(tid)==m_s.end()) return Stackinfo();
|
||||||
|
else return m_s[tid];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
map<size_t,Stackinfo> Funstack::m_s; // initialize static var
|
||||||
|
#define FUNSTACK Funstack __f_stack__(__FUNCTION__,__LINE__,__FILE__)
|
||||||
|
#else
|
||||||
|
#define FUNSTACK
|
||||||
|
#define DUMPSTACK(s)
|
||||||
|
struct Stackinfo {
|
||||||
|
friend ostream& operator<<(ostream& s,const Stackinfo& x) {return s;}
|
||||||
|
};
|
||||||
|
class Funstack {
|
||||||
|
public:
|
||||||
|
static Stackinfo GetStack() {return Stackinfo();}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// tee like logger class
|
||||||
|
class Logger
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
//ostream* m_log;
|
||||||
|
string m_logfilename;
|
||||||
|
ofstream m_logfile;
|
||||||
|
ostream* m_log;
|
||||||
|
const bool m_logstdout,m_logstderr;
|
||||||
|
|
||||||
|
Logger(const Logger&);
|
||||||
|
void operator=(const Logger&);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Logger(ostream* log,const bool logstdout=true,const bool logstderr=false) : m_log(log), m_logstdout(logstdout), m_logstderr(logstderr) {}
|
||||||
|
|
||||||
|
void operator=(ostream* log){m_logfilename=""; m_logfile.close(); m_log=log;}
|
||||||
|
void open(const string& logfilename,const ios_base::openmode mode)
|
||||||
|
{
|
||||||
|
m_log=0;
|
||||||
|
if (m_logfile.is_open()) m_logfile.close();
|
||||||
|
m_logfilename=logfilename;
|
||||||
|
m_logfile.open(m_logfilename.c_str(),mode);
|
||||||
|
if (!m_logfile) throw("cannot write to logfile <" + logfilename + ">"); // Exception uses logger class, so do not throw a nice Exception class here, use a plain throw
|
||||||
|
m_log=&m_logfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
if (m_logfile.is_open()) m_logfile.close();
|
||||||
|
m_logfile.open(m_logfilename.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
friend Logger& operator<<(Logger& log,const T& t)
|
||||||
|
{
|
||||||
|
if(log.m_logstdout) cout << t;
|
||||||
|
if(log.m_logstderr) cerr << t;
|
||||||
|
if(log.m_log!=0) (*(log.m_log)) << t;
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle endl and like
|
||||||
|
friend Logger& operator<<(Logger& log,std::ostream& (*fn)(std::ostream&))
|
||||||
|
{
|
||||||
|
if(log.m_logstdout) fn(cout);
|
||||||
|
if(log.m_logstderr) fn(cerr);
|
||||||
|
if(log.m_log!=0) fn(*(log.m_log));
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
void writelogheader(const string& msg)
|
||||||
|
{
|
||||||
|
if(m_log==0) return;
|
||||||
|
else{
|
||||||
|
(*m_log) << "********************************************************" << endl;
|
||||||
|
(*m_log) << "** Logentry: " << msg << endl;
|
||||||
|
(*m_log) << "** Time: " << Getlocaltime();
|
||||||
|
(*m_log) << "********************************************************" << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// static global logging, default standand out
|
||||||
|
static Logger g_log(0,true,false);
|
||||||
|
|
||||||
|
class Exception{
|
||||||
|
private:
|
||||||
|
const string m_msg;
|
||||||
|
const string m_file;
|
||||||
|
const int m_line;
|
||||||
|
const Stackinfo m_stack;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Exception(const string msg,const string file,const int line,const Stackinfo s) : m_msg(msg), m_file(file), m_line(line), m_stack(s) {}
|
||||||
|
Exception(const char* msg,const string file,const int line,const Stackinfo s) : m_msg(msg), m_file(file), m_line(line), m_stack(s) {}
|
||||||
|
|
||||||
|
inline static string FormatCompilerMsg(const string& file,const int line,const bool warnonly=false)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
return file + "(" + Exception::tostring(line) + ") : " + (warnonly ? "warning : " : "error : ");
|
||||||
|
#else
|
||||||
|
return file + ":" + Exception::tostring(line) + ": " + (warnonly ? "warning: " : "error: ");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static void throw_fun(const string& msg,const string& file,const int line)
|
||||||
|
{
|
||||||
|
const string msg2=Exception::FormatCompilerMsg(file,line) + "throwing exception: " + msg;
|
||||||
|
g_log << msg2;
|
||||||
|
#ifdef _WINDOWS_
|
||||||
|
const string f=tostring(Funstack::GetStack());
|
||||||
|
const string msg3=msg2 + (f.size()>0 ? "\n\n" : "") + f.substr(0,300) + (f.size()>300 ? "\n..." : "");
|
||||||
|
Message("Exception encountered...",msg3,0);
|
||||||
|
#endif
|
||||||
|
throw Exception(msg,file,line,Funstack::GetStack());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string Msg() const
|
||||||
|
{
|
||||||
|
return FormatCompilerMsg(m_file,m_line) + "Exception: " + m_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream& os,const Exception& e)
|
||||||
|
{
|
||||||
|
return os << e.Msg() << endl << e.m_stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static string tostring(const T& x)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
os << x;
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define throw_(msg) Exception::throw_fun(msg,__FILE__, __LINE__)
|
||||||
|
#define warn_(msg) cerr << Exception::FormatCompilerMsg(__FILE__, __LINE__,true) << msg << endl;
|
||||||
|
|
||||||
|
#define CATCH_ALL\
|
||||||
|
catch(const char* s) {cout.flush(); cerr << Exception::FormatCompilerMsg(__FILE__, __LINE__) << "caught exception chars: " << s;}\
|
||||||
|
catch(const string& s) {cout.flush(); cerr << Exception::FormatCompilerMsg(__FILE__, __LINE__) << "caught exception string: " << s;}\
|
||||||
|
catch(const Exception& s){cout.flush(); cerr << Exception::FormatCompilerMsg(__FILE__, __LINE__) << "caught Exception class: " << s;}\
|
||||||
|
catch(...) {cout.flush(); cerr << Exception::FormatCompilerMsg(__FILE__, __LINE__) << "caught unknown exception";}\
|
||||||
|
cerr << "...aborting" << endl;
|
||||||
|
|
||||||
|
#endif // __EXCEPTION_H__
|
||||||
208
src/main/headers/file.h
Normal file
208
src/main/headers/file.h
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __FILE_H__
|
||||||
|
#define __FILE_H__
|
||||||
|
|
||||||
|
inline bool FileExists(const std::string& f)
|
||||||
|
{
|
||||||
|
ifstream s(f.c_str());
|
||||||
|
return (!s)==false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void AssertFileExists(const std::string& f)
|
||||||
|
{
|
||||||
|
if (!FileExists(f)) throw_("File <" + f + "> does not exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t FileSize(const std::string& f)
|
||||||
|
{
|
||||||
|
AssertFileExists(f);
|
||||||
|
ifstream s(f.c_str());
|
||||||
|
if (!s) throw_("Stream is bad (file <" + f + ">)");
|
||||||
|
s.seekg(0,ios::end);
|
||||||
|
if (!s) throw_("Stream is bad (file <" + f + ">)");
|
||||||
|
return s.tellg();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void AssertFileNotEmpty(const std::string& f)
|
||||||
|
{
|
||||||
|
if (FileSize(f)==0) throw_("File <" + f + "> is empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t FileTime(const string& file)
|
||||||
|
{
|
||||||
|
AssertFileExists(file);
|
||||||
|
const string t=System("date -r " + file + " +%s",true,true); // seconds since 1970-01-01 00:00:00 UTC
|
||||||
|
return totype<size_t>(t);
|
||||||
|
// #include <sys/stat.h>
|
||||||
|
// #include <unistd.h>
|
||||||
|
// struct stat s;
|
||||||
|
// int n=stat(file.c_str(),&s);
|
||||||
|
// if (n!=0) throw_("cannot stat file <" + file + ">");
|
||||||
|
// assert( sizeof(time_t)==sizeof(size_t) );
|
||||||
|
// return s.st_mtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isFileNewer(const string& file0,const string& file1)
|
||||||
|
{
|
||||||
|
return FileTime(file0)>FileTime(file1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool DirExists(const std::string& f)
|
||||||
|
{
|
||||||
|
const string file=f + "/.dummy.txt";
|
||||||
|
ofstream s(file.c_str());
|
||||||
|
if(!s) return false;
|
||||||
|
s << "testfile";
|
||||||
|
if(!s) return false;
|
||||||
|
s.close();
|
||||||
|
return FileSize(file)==8;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string MakeSuffix(const int n)
|
||||||
|
{
|
||||||
|
assert(n>=0);
|
||||||
|
if (n<=9) return "00" + tostring(n);
|
||||||
|
else if (n<=99) return "0" + tostring(n);
|
||||||
|
else return tostring(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Readdata(const string& tok,istream& is,T& t)
|
||||||
|
{
|
||||||
|
if (!is) throw_("Stream is bad");
|
||||||
|
is >> t;
|
||||||
|
if (!is) throw_("Reading {" + tok + "} settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string Readline(istream& is)
|
||||||
|
{
|
||||||
|
char buff[16*1024];
|
||||||
|
is.getline(buff,16*1024);
|
||||||
|
return string(buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline T Readtyp(ifstream& s){
|
||||||
|
T x;
|
||||||
|
s.read(reinterpret_cast<char*>(&x),sizeof(x));
|
||||||
|
if(!s) throw_("bad stream");
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string Readstring(ifstream& s){
|
||||||
|
char c=0;
|
||||||
|
string t;
|
||||||
|
do{
|
||||||
|
c=Readtyp<char>(s);
|
||||||
|
if(c!=0) t+=c;
|
||||||
|
}
|
||||||
|
while (c!=0);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline vector<T> Readbin(std::ifstream& s,const int size)
|
||||||
|
{
|
||||||
|
if(!s) throw_("bad stream");
|
||||||
|
vector<T> x(size);
|
||||||
|
s.read(reinterpret_cast<char*>(&x.front()),x.size()*sizeof(T));
|
||||||
|
if(!s) throw_( "bad write");
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Writetyp(ofstream& s,const T& x){
|
||||||
|
s.write(reinterpret_cast<const char*>(&x),sizeof(x));
|
||||||
|
if(!s) throw_( "bad stream");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Writebin(std::ofstream& s,const std::vector<T>& x,const bool writetag)
|
||||||
|
{
|
||||||
|
if(!s) throw_("bad stream");
|
||||||
|
const size_t sz=x.size()*sizeof(T);
|
||||||
|
if(writetag){
|
||||||
|
Writetyp(s,sz);
|
||||||
|
}
|
||||||
|
if(!s) throw_( "bad stream" );
|
||||||
|
s.write(reinterpret_cast<const char*>(&x.front()),sz);
|
||||||
|
if(!s) throw_( "bad write");
|
||||||
|
if (writetag) Writetyp(s,sz);
|
||||||
|
if(!s) throw_( "bad stream");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T,class R>
|
||||||
|
inline void Writebin(std::ofstream& s,const std::map<T,R>& x,const bool writetag)
|
||||||
|
{
|
||||||
|
vector<T> t;
|
||||||
|
vector<R> r;
|
||||||
|
t.reserve(x.size());
|
||||||
|
r.reserve(x.size());
|
||||||
|
for(typename std::map<T,R>::const_iterator itt=x.begin();itt!=x.end();++itt){
|
||||||
|
t.push_back(itt->first);
|
||||||
|
r.push_back(itt->second);
|
||||||
|
}
|
||||||
|
if (writetag) {
|
||||||
|
Writetyp(s,x.size());
|
||||||
|
Writetyp(s,static_cast<unsigned int>(sizeof(T)));
|
||||||
|
Writetyp(s,static_cast<unsigned int>(sizeof(R)));
|
||||||
|
}
|
||||||
|
Writebin(s,t,writetag);
|
||||||
|
Writebin(s,r,writetag);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Readbin(std::ifstream& s,vector<T>& x)
|
||||||
|
{
|
||||||
|
if(!s) throw_("bad stream");
|
||||||
|
const size_t sz=Readtyp<size_t>(s);
|
||||||
|
if(!s) throw_( "bad stream" );
|
||||||
|
if(sz%sizeof(T)!=0) throw_("bad size tag");
|
||||||
|
x.resize(sz/sizeof(T));
|
||||||
|
s.read(reinterpret_cast<char*>(&x.front()),sz);
|
||||||
|
if(!s) throw_( "bad write");
|
||||||
|
if (Readtyp<size_t>(s)!=sz) throw_("bad size tag");
|
||||||
|
if(!s) throw_( "bad stream");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T,class R>
|
||||||
|
inline void Readbin(std::ifstream& s,map<T,R>& x)
|
||||||
|
{
|
||||||
|
vector<T> t;
|
||||||
|
vector<R> r;
|
||||||
|
|
||||||
|
const size_t sz=Readtyp<size_t>(s);
|
||||||
|
const size_t szT=Readtyp<unsigned int>(s);
|
||||||
|
const size_t szR=Readtyp<unsigned int>(s);
|
||||||
|
|
||||||
|
if (szT!=sizeof(T)) throw_("type T size mismatch in Readbin (map)");
|
||||||
|
if (szR!=sizeof(R)) throw_("type R size mismatch in Readbin (map)");
|
||||||
|
|
||||||
|
Readbin(s,t);
|
||||||
|
Readbin(s,r);
|
||||||
|
if (t.size()!=r.size()) throw_("size mismatch in Readbin (map)");
|
||||||
|
x.clear();
|
||||||
|
for(size_t i=0;i<t.size();++i){
|
||||||
|
x[t[i]]=r[i];
|
||||||
|
}
|
||||||
|
if (x.size()!=sz) throw_("map size mismatch in Readbin (map)");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Writeascii(const string& filename,const std::vector<T>& x,const string& comment="",const char& newline='\n')
|
||||||
|
{
|
||||||
|
ofstream s(filename.c_str());
|
||||||
|
if(!s) throw_("bad file <" + filename + ">");
|
||||||
|
s << "% Writeascii: size=" << x.size() << " " << comment << "\n";
|
||||||
|
for(size_t i=0;i<x.size();++i) s << x[i] << newline;
|
||||||
|
if(!s) throw_( "bad writing to file <" + filename + ">");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __FILE_H__
|
||||||
413
src/main/headers/funs.h
Normal file
413
src/main/headers/funs.h
Normal file
@@ -0,0 +1,413 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __FUNS_H__
|
||||||
|
#define __FUNS_H__
|
||||||
|
|
||||||
|
#define Unimplemented throw_("Function unimplemented")
|
||||||
|
#define Dontgethere throw_("Dontgethere")
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define ON_DEBUG(a) a
|
||||||
|
#else
|
||||||
|
#define ON_DEBUG(a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_FFTW
|
||||||
|
extern int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Small template funs
|
||||||
|
template<class T,class R> bool isinmap (const map<T,R>& m,const T& t) {return m.size()>=2 && m.begin()->first<=t && t<(--m.end())->first;}
|
||||||
|
template<class T> const size_t getsteps(const T& r0,const T& r1,const T& rstep,const bool logarithmic) {size_t N=0; for(T r=r0;r<r1;logarithmic ? r*=rstep/T(1) : r+=rstep) ++N; return N;}
|
||||||
|
|
||||||
|
inline std::string Version(){return string("VERSION: ") + VERSION + "." + VERSION_REV;}
|
||||||
|
|
||||||
|
inline std::string Config()
|
||||||
|
{
|
||||||
|
std::string s;
|
||||||
|
#ifdef NDEBUG
|
||||||
|
s+="NDEBUG";
|
||||||
|
#else
|
||||||
|
#ifdef PROFILE
|
||||||
|
s+="PROFILE";
|
||||||
|
#else
|
||||||
|
s+="DEBUG";
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef USE_UNITS
|
||||||
|
s+= " USE_UNITS";
|
||||||
|
#endif
|
||||||
|
#ifdef USE_FLOAT_CHECKS
|
||||||
|
s+= " USE_FLOAT_CHECKS";
|
||||||
|
#endif
|
||||||
|
#ifdef USE_FFTW_IC
|
||||||
|
s+= " USE_FFTW_IC";
|
||||||
|
#endif
|
||||||
|
#ifdef USE_FFTW
|
||||||
|
s+= " USE_FFTW";
|
||||||
|
#endif
|
||||||
|
#ifdef USE_MPI
|
||||||
|
s+= " USE_MPI";
|
||||||
|
#endif
|
||||||
|
if (sizeof(void*)==4) s+=" 32BIT";
|
||||||
|
else if (sizeof(void*)==8) s+=" 64BIT";
|
||||||
|
else s+=" XXBIT";
|
||||||
|
|
||||||
|
const long one= 1;
|
||||||
|
const int big=!(*(reinterpret_cast<const char *>(&one)));
|
||||||
|
if (big) s+=" BIGENDIAN";
|
||||||
|
else s+=" LITENDIAN";
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string FormatCompilerMsg(const string& file,const int line)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
return file + ":" + line + ":";
|
||||||
|
#else
|
||||||
|
return file + "(" + line + ")";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
extern "C"{
|
||||||
|
#ifdef _UNICODE
|
||||||
|
#pragma message("ERROR: toolsfun cannot handle unicode...giving up compilation");
|
||||||
|
ERROR_complier
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _AFXDLL
|
||||||
|
__declspec(dllimport) void* __stdcall GetCurrentThread();
|
||||||
|
__declspec(dllimport) void* __stdcall GetCurrentThreadId();
|
||||||
|
__declspec(dllimport) int __stdcall SetThreadPriority(void* hThread,int nPriority);
|
||||||
|
#else
|
||||||
|
//void* __stdcall GetCurrentThread();
|
||||||
|
//void* __stdcall GetCurrentThreadId();
|
||||||
|
//int __stdcall SetThreadPriority(void* hThread,int nPriority);
|
||||||
|
__declspec(dllimport) void* __stdcall GetCurrentThread();
|
||||||
|
__declspec(dllimport) unsigned long __stdcall GetCurrentThreadId();
|
||||||
|
__declspec(dllimport) int __stdcall SetThreadPriority(void* hThread,int nPriority);
|
||||||
|
__declspec(dllimport) int __stdcall GetThreadPriority(void* hThread);
|
||||||
|
__declspec(dllimport) unsigned int __stdcall WinExec(const char* lpCmdLine,unsigned int uCmdShow);
|
||||||
|
#ifndef _WINDOWS_
|
||||||
|
__declspec(dllimport) unsigned int __stdcall MessageBox(void* hWnd,const char* lpText,const char* lpCaption,unsigned int Type);
|
||||||
|
__declspec(dllimport) unsigned long __stdcall GetCurrentDirectory(unsigned long nBufferLength,char* lpBuffer);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int nice(int inc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline int Message(const string& title,const string& msg,const int type)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
// 0 = MB_OK
|
||||||
|
// 1 = MB_OKCANCEL
|
||||||
|
// 2 = MB_ABORTRETRYIGNORE
|
||||||
|
// 3 = MB_YESNOCANCEL
|
||||||
|
// 4 = MB_YESNO
|
||||||
|
// 5 = MB_RETRYCANCEL
|
||||||
|
// 6 = MB_CANCELTRYCONTINUE: if(WINVER >= 0x0500)
|
||||||
|
const long hr=MessageBox(NULL,msg.c_str(),title.c_str(),type);
|
||||||
|
#else
|
||||||
|
Unimplemented;
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
string GetCurrentDir()
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
char buff[16*1024];
|
||||||
|
if(GetCurrentDirectory(16*1024,buff)==0) throw_("GetCurrentDirectory() failed");
|
||||||
|
return tostring(buff);
|
||||||
|
#else
|
||||||
|
Unimplemented;
|
||||||
|
return "";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
inline void SetNiceLevel(const int level)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
// THREAD_PRIORITY_ABOVE_NORMAL 1 Priority 1 point above the priority class.
|
||||||
|
// THREAD_PRIORITY_BELOW_NORMAL -1 Priority 1 point below the priority class.
|
||||||
|
// THREAD_PRIORITY_HIGHEST 2 Priority 2 points above the priority class.
|
||||||
|
// THREAD_PRIORITY_IDLE -15 Base priority of 1 for IDLE_PRIORITY_CLASS,...
|
||||||
|
// THREAD_PRIORITY_LOWEST -2 Priority 2 points below the priority class.
|
||||||
|
// THREAD_PRIORITY_NORMAL 0 Normal priority for the priority class.
|
||||||
|
// THREAD_PRIORITY_TIME_CRITICAL 15 Base priority of 15 for IDLE_PRIORITY_CLASS,...
|
||||||
|
if (level!=0 && level!=1 && level!=-1 && level!=2 && level!=-2 && level!=15 && level!=-15) throw_("wrong Win32 nice level, must be oneof -15,-2,-1,0,1,2,15");
|
||||||
|
SetThreadPriority(GetCurrentThread(),-level);
|
||||||
|
assert( GetThreadPriority(GetCurrentThread())==-level );
|
||||||
|
#else
|
||||||
|
const int n=nice(level);
|
||||||
|
if (n<0) throw_("Could not set nice level");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t GetThreadId()
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
assert( sizeof(size_t)==sizeof(unsigned long) );
|
||||||
|
return GetCurrentThreadId();
|
||||||
|
#else
|
||||||
|
// may be replaced by return 0; if phtread not found!
|
||||||
|
assert( sizeof(size_t)==sizeof(pthread_t) );
|
||||||
|
const pthread_t p=pthread_self();
|
||||||
|
size_t q=0;
|
||||||
|
memcpy(&q,&p,sizeof(q));
|
||||||
|
return q;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TOOLSFUN_QUIET_WIN32_SYSTEM
|
||||||
|
#ifdef WIN32
|
||||||
|
// make a special non-console system call, instead of the standard system()
|
||||||
|
// XXX SystemWin, does not wait for process to finish, CreatProc still create window
|
||||||
|
|
||||||
|
int SystemWin(const string& cmd)
|
||||||
|
{
|
||||||
|
//ShellExecute, CreateProcess, WinExec or system
|
||||||
|
// HINSTANCE hi=ShellExecute(NULL,NULL,cmdx,"","",SW_SHOSNOACTIVATE);
|
||||||
|
// if (reinterpret_cast<int>(hi)<32) MessageBox(NULL,(string("ShellExecute <") + cmd + "> failed").c_str(),"Error",0);
|
||||||
|
|
||||||
|
// const string cmd2="\\\"" + cmd + "\\\""; // fix problem with spaces in executable, not working yet
|
||||||
|
unsigned int r=WinExec(cmd.c_str(),4);
|
||||||
|
return r<32 ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CreateProc(const string& cmd,const bool throwexception=true,const bool waitforprocesstofinish=true)
|
||||||
|
{
|
||||||
|
STARTUPINFO s;
|
||||||
|
PROCESS_INFORMATION p;
|
||||||
|
memset(&s,0,sizeof(s));
|
||||||
|
memset(&p,0,sizeof(p));
|
||||||
|
s.cb=sizeof(s);
|
||||||
|
|
||||||
|
// to avoid const cast of char* in CreateProcess
|
||||||
|
char cmdx[16*1024];
|
||||||
|
strcpy_s(cmdx,16*1024,cmd.c_str());
|
||||||
|
|
||||||
|
const int r=CreateProcess(0,cmdx,0,0,false,CREATE_DEFAULT_ERROR_MODE,0,0,&s,&p);
|
||||||
|
if (r!=0) {if(waitforprocesstofinish) WaitForSingleObject(p.hProcess,INFINITE);}
|
||||||
|
else {
|
||||||
|
if (throwexception) throw_(string("CreateProcess() failed with return code <") + GetLastError() + ">");
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release handles
|
||||||
|
assert(r!=0);
|
||||||
|
CloseHandle(p.hProcess);
|
||||||
|
CloseHandle(p.hThread);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline string System(const string& cmd,const bool throwexception=true,const bool captureoutput=false,int* pret=0)
|
||||||
|
{
|
||||||
|
if (!captureoutput){
|
||||||
|
#ifdef TOOLSFUN_QUIET_WIN32_SYSTEM
|
||||||
|
const int n=SystemWin(cmd);
|
||||||
|
#else
|
||||||
|
const int n=system(cmd.c_str());
|
||||||
|
#endif
|
||||||
|
if (n!=0 && throwexception) throw_(string("system command failed with code=") + n + " cmd=<" + cmd + ">");
|
||||||
|
if (pret!=0) *pret=n;
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
static size_t n=0;
|
||||||
|
#ifdef WIN32
|
||||||
|
const string rm="del ";
|
||||||
|
char tmp[1024];
|
||||||
|
if (tmpnam_s(tmp,1024)) throw_("error in creating win32 temp name");
|
||||||
|
const string file(tmp);
|
||||||
|
#else
|
||||||
|
const string rm="rm ";
|
||||||
|
const string file=tmpnam("tempfile");
|
||||||
|
#endif
|
||||||
|
ifstream s1(file.c_str());
|
||||||
|
if(s1) {
|
||||||
|
s1.close();
|
||||||
|
System((rm + file).c_str(),true,false);
|
||||||
|
}
|
||||||
|
System(cmd + " > " + file,throwexception,false,pret);
|
||||||
|
|
||||||
|
string t;
|
||||||
|
char buff[16*1024];
|
||||||
|
ifstream s2(file.c_str());
|
||||||
|
while(s2) {
|
||||||
|
s2.getline(buff,16*1024);
|
||||||
|
if (s2) t += buff;
|
||||||
|
}
|
||||||
|
s2.close();
|
||||||
|
System((rm + file).c_str(),true,false);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Getlocaltime()
|
||||||
|
{
|
||||||
|
FUNSTACK;
|
||||||
|
time_t rawtime;
|
||||||
|
time(&rawtime);
|
||||||
|
struct tm timeinfo;
|
||||||
|
localtime_s(&timeinfo,&rawtime);
|
||||||
|
char buff[1024];
|
||||||
|
asctime_s(buff,1014,&timeinfo);
|
||||||
|
return string(buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
class timer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
double m_t,m_cpu_t;
|
||||||
|
double* m_addt;
|
||||||
|
mutable double m_last_t,m_last_eta;
|
||||||
|
|
||||||
|
static double gettime()
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
return 1.0*clock()/CLOCKS_PER_SEC; // use low-res clock
|
||||||
|
// FILETIME ft;
|
||||||
|
// unsigned __int64 tmpres = 0;
|
||||||
|
//
|
||||||
|
// GetSystemTimeAsFileTime(&ft);
|
||||||
|
//
|
||||||
|
// tmpres |= ft.dwHighDateTime;
|
||||||
|
// tmpres <<= 32;
|
||||||
|
// tmpres |= ft.dwLowDateTime;
|
||||||
|
//
|
||||||
|
// converting file time to unix epoch
|
||||||
|
// tmpres -= DELTA_EPOCH_IN_MICROSECS;
|
||||||
|
// tmpres /= 10; // convert into microseconds
|
||||||
|
// tv->tv_sec = (long)(tmpres / 1000000UL);
|
||||||
|
// tv->tv_usec = (long)(tmpres % 1000000UL);
|
||||||
|
#else
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv,NULL);
|
||||||
|
return tv.tv_sec + static_cast<double>(tv.tv_usec)/1000000;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static double getcputime()
|
||||||
|
{
|
||||||
|
static const double f=1.0/CLOCKS_PER_SEC;
|
||||||
|
return f*clock();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
static double Remaining(const double t,const T& n,const T& N)
|
||||||
|
{
|
||||||
|
if (n>=N || N<=T(0)) throw_("value out of range in timer::Remaining, n>=N or N<=0, n=" + tostring(n) + " N=" + tostring(N));
|
||||||
|
const double p=static_cast<double>(n/T(1)+1)/(N/T(1));
|
||||||
|
const double p2=p>0 ? t/p : 0;
|
||||||
|
return p2>t ? p2-t : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
timer() : m_t(gettime()), m_cpu_t(getcputime()), m_addt(0), m_last_t(-1), m_last_eta(-1) {}
|
||||||
|
timer(double& t) : m_t(gettime()), m_cpu_t(getcputime()), m_addt(&t), m_last_t(-1), m_last_eta(-1) {}
|
||||||
|
~timer() {if (m_addt!=0) (*m_addt) += elapsed();}
|
||||||
|
|
||||||
|
void reset () {m_t=gettime(); m_cpu_t=getcputime(); m_last_t=-1; m_last_eta=-1;}
|
||||||
|
double elapsed() const {return gettime()-m_t;}
|
||||||
|
double cputime() const {return getcputime()-m_cpu_t;}
|
||||||
|
|
||||||
|
static string ToHMS(const double& t)
|
||||||
|
{
|
||||||
|
assert( t>=0 );
|
||||||
|
const unsigned int it=static_cast<unsigned int>(t+.5);
|
||||||
|
const unsigned int hours=it/(60*60);
|
||||||
|
const unsigned int mins=(it-hours*60*60)/(60);
|
||||||
|
const unsigned int secs=(it-hours*60*60-mins*60);
|
||||||
|
assert( secs<60 && mins<60);
|
||||||
|
return tostring(hours) + ":" + (mins<10 ? "0": "") + tostring(mins) + ":" + (secs<10 ? "0": "") + tostring(secs);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> static inline int Topercent(const T x,const T N,const int decimals=-1)
|
||||||
|
{
|
||||||
|
assert(x<N && N!=T(0));
|
||||||
|
float pf=static_cast<float>(x/T(1))/(N/T(1));
|
||||||
|
if (decimals>0) pf=static_cast<int>(pf*decimals)/(1.0*decimals);
|
||||||
|
return static_cast<int>(pf*100+.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> void ToEta(const T& n,const T& N,ostream& s,const double timeprintsteps=30,const bool verboseprint=false) const
|
||||||
|
{
|
||||||
|
if (n>=N) return;
|
||||||
|
assert( n<N );
|
||||||
|
|
||||||
|
const double t=gettime()-m_t;
|
||||||
|
if (n==T(0)) {
|
||||||
|
m_last_t=t;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double e=(t-m_last_t);
|
||||||
|
if (e>timeprintsteps) {
|
||||||
|
const double f=timeprintsteps*60;
|
||||||
|
const double r=Remaining(t,n,N);
|
||||||
|
if (m_last_eta<0 || r<f || (r>f && e>f) /*|| (m_last_eta>0 && r>1.2*m_last_eta) */ ){
|
||||||
|
time_t tm;
|
||||||
|
time(&tm);
|
||||||
|
const string systime=ctime(&tm);
|
||||||
|
if (m_last_eta<0) s << "Current system time: " << systime;
|
||||||
|
tm += static_cast<time_t>(r);
|
||||||
|
const string eta=ctime(&tm);
|
||||||
|
const bool extraday=(eta.substr(0,3)!=systime.substr(0,3));
|
||||||
|
const string eday=extraday ? " "+eta.substr(0,3)+" " : "";
|
||||||
|
s << "Time [h:m:s]=" << ToHMS(t) << ", R=" << ToHMS(r) << ", ETA=" << eday << eta.substr(11,8);
|
||||||
|
if(verboseprint) {
|
||||||
|
const string t=", n/N=" + tostring(n) + "/" + tostring(N) + "=" + tostring(Topercent(n,N,10)) + " percent,";
|
||||||
|
s << t;
|
||||||
|
for(size_t i=t.size();i<42;++i) s << " ";
|
||||||
|
s << " CPU=" << ToHMS(cputime());
|
||||||
|
}
|
||||||
|
s << endl;
|
||||||
|
|
||||||
|
m_last_t=t;
|
||||||
|
m_last_eta=r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
friend ostream& operator<<(ostream& s,const timer x)
|
||||||
|
{
|
||||||
|
return s << "Time [h:m:s]= " << x.ToHMS(x.elapsed()) << " CPU=" << x.ToHMS(x.cputime());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
int SwapEndian(void *data,const size_t size) {
|
||||||
|
|
||||||
|
short xs;
|
||||||
|
long xl;
|
||||||
|
|
||||||
|
switch (size){
|
||||||
|
case 2:
|
||||||
|
xs = *(short *)data;
|
||||||
|
*(short *)data = ( ((xs & 0x0000ff00) >> 8) | ((xs & 0x000000ff) << 8) );
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
xl = *(long *)data;
|
||||||
|
*(long *)data = ( ((xl & 0xff000000) >> 24) | ((xl & 0x00ff0000) >> 8) |
|
||||||
|
((xl & 0x0000ff00) << 8) | ((xl & 0x000000ff) << 24) );
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // __FUNS_H__
|
||||||
282
src/main/headers/process.h
Normal file
282
src/main/headers/process.h
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
#ifndef __PROCESS_H__
|
||||||
|
#define __PROCESS_H__
|
||||||
|
|
||||||
|
#include <tlhelp32.h>
|
||||||
|
|
||||||
|
pair<HANDLE,PROCESSENTRY32> ProcessWalkInit()
|
||||||
|
{
|
||||||
|
// Take a snapshot of all processes in the system.
|
||||||
|
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
|
||||||
|
if( hProcessSnap == INVALID_HANDLE_VALUE ) throw_("CreateToolhelp32Snapshot() returned invalid handle");
|
||||||
|
|
||||||
|
// Set the size of the structure before using it.
|
||||||
|
PROCESSENTRY32 pe32;
|
||||||
|
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
|
||||||
|
// Retrieve information about the first process,
|
||||||
|
// and exit if unsuccessful
|
||||||
|
if(!Process32First(hProcessSnap,&pe32)) {
|
||||||
|
CloseHandle(hProcessSnap); // clean the snapshot object
|
||||||
|
throw_("Process32First"); // show cause of failure
|
||||||
|
}
|
||||||
|
|
||||||
|
return make_pair(hProcessSnap,pe32);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD GetProcessID(const string& processname)
|
||||||
|
{
|
||||||
|
pair<HANDLE,PROCESSENTRY32> h=ProcessWalkInit();
|
||||||
|
HANDLE hProcessSnap=h.first;
|
||||||
|
PROCESSENTRY32 pe32=h.second;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (pe32.szExeFile==processname) {
|
||||||
|
CloseHandle(hProcessSnap);
|
||||||
|
return pe32.th32ProcessID;
|
||||||
|
}
|
||||||
|
} while( Process32Next(hProcessSnap,&pe32) );
|
||||||
|
|
||||||
|
CloseHandle(hProcessSnap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESSENTRY32 GetProcessInfo(const DWORD id)
|
||||||
|
{
|
||||||
|
pair<HANDLE,PROCESSENTRY32> h=ProcessWalkInit();
|
||||||
|
HANDLE hProcessSnap=h.first;
|
||||||
|
PROCESSENTRY32 pe32=h.second;
|
||||||
|
|
||||||
|
int n=0;
|
||||||
|
do {
|
||||||
|
if (pe32.th32ProcessID==id) {
|
||||||
|
CloseHandle(hProcessSnap);
|
||||||
|
return pe32;
|
||||||
|
}
|
||||||
|
} while( Process32Next(hProcessSnap,&pe32) );
|
||||||
|
|
||||||
|
CloseHandle(hProcessSnap);
|
||||||
|
ZeroMemory( &pe32, sizeof(pe32) );
|
||||||
|
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
|
||||||
|
return pe32;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD GetProcessCount(const string& processname)
|
||||||
|
{
|
||||||
|
pair<HANDLE,PROCESSENTRY32> h=ProcessWalkInit();
|
||||||
|
HANDLE hProcessSnap=h.first;
|
||||||
|
PROCESSENTRY32 pe32=h.second;
|
||||||
|
int n=0;
|
||||||
|
do {
|
||||||
|
if (pe32.szExeFile==processname) ++n;
|
||||||
|
} while( Process32Next(hProcessSnap,&pe32) );
|
||||||
|
|
||||||
|
CloseHandle(hProcessSnap);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KillProcessID(const DWORD id)
|
||||||
|
{
|
||||||
|
HANDLE hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, id);
|
||||||
|
if(hProcess==NULL) return false; // might have gone in the meantime, so no throw_("OpenProcess() got null handle");
|
||||||
|
|
||||||
|
const BOOL t=TerminateProcess(hProcess,-1);
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
return t!=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KillAllProcesses(const string& exe)
|
||||||
|
{
|
||||||
|
// kill existing polls
|
||||||
|
DWORD id=GetProcessID(exe);
|
||||||
|
while(id!=0){
|
||||||
|
KillProcessID(id);
|
||||||
|
id=GetProcessID(exe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
BOOL GetProcessList( );
|
||||||
|
BOOL ListProcessModules( DWORD dwPID );
|
||||||
|
BOOL ListProcessThreads( DWORD dwOwnerPID );
|
||||||
|
void printError( TCHAR* msg );
|
||||||
|
|
||||||
|
FILE* log=fopen("d:\\plog.txt","w");
|
||||||
|
|
||||||
|
BOOL GetProcessList( )
|
||||||
|
{
|
||||||
|
HANDLE hProcessSnap;
|
||||||
|
HANDLE hProcess;
|
||||||
|
PROCESSENTRY32 pe32;
|
||||||
|
DWORD dwPriorityClass;
|
||||||
|
|
||||||
|
// Take a snapshot of all processes in the system.
|
||||||
|
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
|
||||||
|
if( hProcessSnap == INVALID_HANDLE_VALUE )
|
||||||
|
{
|
||||||
|
printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the size of the structure before using it.
|
||||||
|
pe32.dwSize = sizeof( PROCESSENTRY32 );
|
||||||
|
|
||||||
|
// Retrieve information about the first process,
|
||||||
|
// and exit if unsuccessful
|
||||||
|
if( !Process32First( hProcessSnap, &pe32 ) )
|
||||||
|
{
|
||||||
|
printError( TEXT("Process32First") ); // show cause of failure
|
||||||
|
CloseHandle( hProcessSnap ); // clean the snapshot object
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now walk the snapshot of processes, and
|
||||||
|
// display information about each process in turn
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fprintf(log, "\n\n=====================================================" );
|
||||||
|
fprintf(log, TEXT("\nPROCESS NAME: %s"), pe32.szExeFile );
|
||||||
|
fprintf(log, "\n-----------------------------------------------------" );
|
||||||
|
|
||||||
|
// Retrieve the priority class.
|
||||||
|
dwPriorityClass = 0;
|
||||||
|
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
|
||||||
|
if( hProcess == NULL )
|
||||||
|
printError( TEXT("OpenProcess") );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dwPriorityClass = GetPriorityClass( hProcess );
|
||||||
|
if( !dwPriorityClass )
|
||||||
|
printError( TEXT("GetPriorityClass") );
|
||||||
|
CloseHandle( hProcess );
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(log, "\n Process ID = 0x%08X", pe32.th32ProcessID );
|
||||||
|
fprintf(log, "\n Thread count = %d", pe32.cntThreads );
|
||||||
|
fprintf(log, "\n Parent process ID = 0x%08X", pe32.th32ParentProcessID );
|
||||||
|
fprintf(log, "\n Priority base = %d", pe32.pcPriClassBase );
|
||||||
|
if( dwPriorityClass )
|
||||||
|
fprintf(log, "\n Priority class = %d", dwPriorityClass );
|
||||||
|
|
||||||
|
// List the modules and threads associated with this process
|
||||||
|
ListProcessModules( pe32.th32ProcessID );
|
||||||
|
ListProcessThreads( pe32.th32ProcessID );
|
||||||
|
|
||||||
|
} while( Process32Next( hProcessSnap, &pe32 ) );
|
||||||
|
|
||||||
|
CloseHandle( hProcessSnap );
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL ListProcessModules( DWORD dwPID )
|
||||||
|
{
|
||||||
|
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
|
||||||
|
MODULEENTRY32 me32;
|
||||||
|
|
||||||
|
// Take a snapshot of all modules in the specified process.
|
||||||
|
hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
|
||||||
|
if( hModuleSnap == INVALID_HANDLE_VALUE )
|
||||||
|
{
|
||||||
|
printError( TEXT("CreateToolhelp32Snapshot (of modules)") );
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the size of the structure before using it.
|
||||||
|
me32.dwSize = sizeof( MODULEENTRY32 );
|
||||||
|
|
||||||
|
// Retrieve information about the first module,
|
||||||
|
// and exit if unsuccessful
|
||||||
|
if( !Module32First( hModuleSnap, &me32 ) )
|
||||||
|
{
|
||||||
|
printError( TEXT("Module32First") ); // show cause of failure
|
||||||
|
CloseHandle( hModuleSnap ); // clean the snapshot object
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now walk the module list of the process,
|
||||||
|
// and display information about each module
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fprintf(log, TEXT("\n\n MODULE NAME: %s"), me32.szModule );
|
||||||
|
fprintf(log, TEXT("\n Executable = %s"), me32.szExePath );
|
||||||
|
fprintf(log, "\n Process ID = 0x%08X", me32.th32ProcessID );
|
||||||
|
fprintf(log, "\n Ref count (g) = 0x%04X", me32.GlblcntUsage );
|
||||||
|
fprintf(log, "\n Ref count (p) = 0x%04X", me32.ProccntUsage );
|
||||||
|
fprintf(log, "\n Base address = 0x%08X", (DWORD) me32.modBaseAddr );
|
||||||
|
fprintf(log, "\n Base size = %d", me32.modBaseSize );
|
||||||
|
|
||||||
|
} while( Module32Next( hModuleSnap, &me32 ) );
|
||||||
|
|
||||||
|
CloseHandle( hModuleSnap );
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL ListProcessThreads( DWORD dwOwnerPID )
|
||||||
|
{
|
||||||
|
HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
|
||||||
|
THREADENTRY32 te32;
|
||||||
|
|
||||||
|
// Take a snapshot of all running threads
|
||||||
|
hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
|
||||||
|
if( hThreadSnap == INVALID_HANDLE_VALUE )
|
||||||
|
return( FALSE );
|
||||||
|
|
||||||
|
// Fill in the size of the structure before using it.
|
||||||
|
te32.dwSize = sizeof(THREADENTRY32);
|
||||||
|
|
||||||
|
// Retrieve information about the first thread,
|
||||||
|
// and exit if unsuccessful
|
||||||
|
if( !Thread32First( hThreadSnap, &te32 ) )
|
||||||
|
{
|
||||||
|
printError( TEXT("Thread32First") ); // show cause of failure
|
||||||
|
CloseHandle( hThreadSnap ); // clean the snapshot object
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now walk the thread list of the system,
|
||||||
|
// and display information about each thread
|
||||||
|
// associated with the specified process
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if( te32.th32OwnerProcessID == dwOwnerPID )
|
||||||
|
{
|
||||||
|
fprintf(log, "\n\n THREAD ID = 0x%08X", te32.th32ThreadID );
|
||||||
|
fprintf(log, "\n Base priority = %d", te32.tpBasePri );
|
||||||
|
fprintf(log, "\n Delta priority = %d", te32.tpDeltaPri );
|
||||||
|
}
|
||||||
|
} while( Thread32Next(hThreadSnap, &te32 ) );
|
||||||
|
|
||||||
|
CloseHandle( hThreadSnap );
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
void printError( TCHAR* msg )
|
||||||
|
{
|
||||||
|
DWORD eNum;
|
||||||
|
TCHAR sysMsg[256];
|
||||||
|
TCHAR* p;
|
||||||
|
|
||||||
|
eNum = GetLastError( );
|
||||||
|
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
NULL, eNum,
|
||||||
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
||||||
|
sysMsg, 256, NULL );
|
||||||
|
|
||||||
|
// Trim the end of the line and terminate it with a null
|
||||||
|
p = sysMsg;
|
||||||
|
while( ( *p > 31 ) || ( *p == 9 ) )
|
||||||
|
++p;
|
||||||
|
do { *p-- = 0; } while( ( p >= sysMsg ) &&
|
||||||
|
( ( *p == '.' ) || ( *p < 33 ) ) );
|
||||||
|
|
||||||
|
// Display the message
|
||||||
|
fprintf(log, TEXT("\n WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // __PROCESS_H__
|
||||||
95
src/main/headers/reg.h
Normal file
95
src/main/headers/reg.h
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
#ifndef __REGISTRY_H__
|
||||||
|
#define __REGISTRY_H__
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
|
||||||
|
namespace Registry{
|
||||||
|
void* StringtoRoot(const string& t)
|
||||||
|
{
|
||||||
|
if (t=="HKEY_CLASSES_ROOT") return HKEY_CLASSES_ROOT;
|
||||||
|
else if (t=="HKEY_CURRENT_USER") return HKEY_CURRENT_USER;
|
||||||
|
else if (t=="HKEY_LOCAL_MACHINE") return HKEY_LOCAL_MACHINE;
|
||||||
|
else if (t=="HKEY_USERS") return HKEY_USERS;
|
||||||
|
else {throw_("bad root path in registry"); return 0;}
|
||||||
|
}
|
||||||
|
|
||||||
|
pair<void*,pair<string,string> > GetPath(const string& fullpath)
|
||||||
|
{
|
||||||
|
const int n=fullpath.find_first_of('\\');
|
||||||
|
if (n==string::npos) throw_("mallformated registry entry");
|
||||||
|
const string t=fullpath.substr(0,n);
|
||||||
|
void* root=StringtoRoot(t);
|
||||||
|
|
||||||
|
const string r=fullpath.substr(n+1,-1);
|
||||||
|
const int m=r.find_last_of('\\');
|
||||||
|
if (m==string::npos) throw_("mallformated registry entry");
|
||||||
|
|
||||||
|
const string path=r.substr(0,m);
|
||||||
|
const string key =r.substr(m+1,-1);
|
||||||
|
|
||||||
|
return make_pair(root,make_pair(path,key));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasKey(void* root,const string& path,const string& key,string* val=0)
|
||||||
|
{
|
||||||
|
assert( sizeof(void*)==sizeof(HKEY) && root!=0 );
|
||||||
|
if (root!=HKEY_CLASSES_ROOT && root!=HKEY_CURRENT_USER && root!=HKEY_LOCAL_MACHINE && root!=HKEY_USERS) throw_("unknown root path in registry");
|
||||||
|
|
||||||
|
DWORD buffersize=1024*16;
|
||||||
|
char buff[1024*16];
|
||||||
|
buff[0]=0;
|
||||||
|
|
||||||
|
HKEY hKey;
|
||||||
|
if (ERROR_SUCCESS!=RegOpenKeyEx(static_cast<HKEY>(root),path.c_str(),NULL,KEY_READ,&hKey)) return false;
|
||||||
|
if (ERROR_SUCCESS!=RegQueryValueEx(hKey,key.c_str(),NULL,NULL,(LPBYTE)buff,&buffersize)) return false;
|
||||||
|
if (ERROR_SUCCESS!=RegCloseKey(hKey)) return false;
|
||||||
|
|
||||||
|
if (val!=0) *val=buff;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetKey(void* root,const string& path,const string& key)
|
||||||
|
{
|
||||||
|
string val;
|
||||||
|
if (!hasKey(root,path,key,&val)) throw_("could not read registry entry");
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetKey(const string& fullpath)
|
||||||
|
{
|
||||||
|
const pair<void*,pair<string,string> > p=GetPath(fullpath);
|
||||||
|
return GetKey(p.first,p.second.first,p.second.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SetKey(void* root,const string& path,const string& key,const string& val)
|
||||||
|
{
|
||||||
|
assert( sizeof(void*)==sizeof(HKEY) && root!=0 );
|
||||||
|
if (root!=HKEY_CLASSES_ROOT && root!=HKEY_CURRENT_USER && root!=HKEY_LOCAL_MACHINE && root!=HKEY_USERS) throw_("unknown root path in registry");
|
||||||
|
if (val.size()+1>1024*16) throw_("lenght of value to long");
|
||||||
|
|
||||||
|
char buff[1024*16];
|
||||||
|
size_t i;
|
||||||
|
for(i=0;i<val.size();++i) buff[i]=val[i];
|
||||||
|
buff[i]=0;
|
||||||
|
const DWORD buffersize=i;
|
||||||
|
|
||||||
|
HKEY hKey;
|
||||||
|
if (ERROR_SUCCESS!=RegCreateKeyEx(static_cast<HKEY>(root),path.c_str(),0,NULL,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL)) return false;
|
||||||
|
if (ERROR_SUCCESS!=RegSetValueEx(hKey,key.c_str(),NULL,REG_SZ,(LPBYTE)buff,buffersize)) return false;
|
||||||
|
if (ERROR_SUCCESS!=RegCloseKey(hKey)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SetKey(const string& fullpath,const string& val)
|
||||||
|
{
|
||||||
|
const pair<void*,pair<string,string> > p=GetPath(fullpath);
|
||||||
|
return SetKey(p.first,p.second.first,p.second.second,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
}; // namespace Registry
|
||||||
|
|
||||||
|
#endif // _WINDOWS
|
||||||
|
#endif // WIN32
|
||||||
|
#endif // __REGISTRY_H__
|
||||||
284
src/main/headers/stringfun.h
Normal file
284
src/main/headers/stringfun.h
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __STRINGFUN_H__
|
||||||
|
#define __STRINGFUN_H__
|
||||||
|
|
||||||
|
struct outputoperator_tags
|
||||||
|
{
|
||||||
|
string preline,endline;
|
||||||
|
int prewidth,postwidth,precision;
|
||||||
|
bool maptags,printnumbers,serialize;
|
||||||
|
|
||||||
|
outputoperator_tags()
|
||||||
|
: endline("\n"), prewidth(-1), postwidth(-1), precision(-1), maptags(false), printnumbers(false), serialize(false) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
static outputoperator_tags g_tags;
|
||||||
|
|
||||||
|
inline ostream& operator<<(ostream& os,const outputoperator_tags& x){
|
||||||
|
g_tags=x;
|
||||||
|
if (g_tags.precision>0) os.precision(g_tags.precision);
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline string tostring(const T& x)
|
||||||
|
{
|
||||||
|
ostringstream os;
|
||||||
|
outputoperator_tags t1=g_tags;
|
||||||
|
g_tags=outputoperator_tags();
|
||||||
|
g_tags.serialize=true;
|
||||||
|
g_tags.endline="";
|
||||||
|
os << x;
|
||||||
|
g_tags=t1;
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T totype(const string& s)
|
||||||
|
{
|
||||||
|
istringstream is(s);
|
||||||
|
T x;
|
||||||
|
is >> x;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string operator+ (const string& s,const char* c) {return s+string(c);}
|
||||||
|
inline string operator+ (const string& s,const short& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const unsigned short& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const int& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const long& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const unsigned long& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const float& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const double& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const string& s,const long double& c) {return s+tostring(c);}
|
||||||
|
inline string operator+ (const char* a ,const string& b) {return string(a)+b;}
|
||||||
|
|
||||||
|
#ifdef OS_Linux
|
||||||
|
#ifdef __GCC_V4__
|
||||||
|
// does not work under some compilers where size_t==unsigned int
|
||||||
|
inline string operator+ (const string& s,const size_t& c) {return s+tostring(c);}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline string tostring(const int argc,char** argv)
|
||||||
|
{
|
||||||
|
string s;
|
||||||
|
for(int i=0;i<argc;++i) s += string(argv[i]) + " ";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline string fwidth2(const T& x,const size_t wdt,const bool prefix)
|
||||||
|
{
|
||||||
|
string s=tostring(x);
|
||||||
|
if(wdt>1024 || s.size()>=wdt) return s;
|
||||||
|
size_t n=wdt-s.size();
|
||||||
|
while(n>0) {
|
||||||
|
if (prefix) s=' '+ s;
|
||||||
|
else s+=' ';
|
||||||
|
--n;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline string fwidth(const T& x,const size_t wdt=8,const size_t tailwdt=4)
|
||||||
|
{
|
||||||
|
string s=tostring(x);
|
||||||
|
if(wdt>1024 || tailwdt>1024 || s.size()>wdt+tailwdt) return s;
|
||||||
|
|
||||||
|
const size_t m=min(s.find('.'),s.find(' '));
|
||||||
|
if (m==string::npos) {
|
||||||
|
s=fwidth2(s,wdt,true);
|
||||||
|
return fwidth2(s,wdt+tailwdt,false);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(wdt<m) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
assert( wdt>=m );
|
||||||
|
size_t n1=wdt-m;
|
||||||
|
while(n1>0) {s= ' ' + s; --n1;}
|
||||||
|
return fwidth2(s,wdt+tailwdt,false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string strip(const string& s,const char ch=' ')
|
||||||
|
{
|
||||||
|
const size_t n=s.find_first_not_of(ch);
|
||||||
|
const size_t m=s.find_last_not_of (ch);
|
||||||
|
|
||||||
|
if (n==string::npos || m==string::npos) return "";
|
||||||
|
return s.substr(n,m-n+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string replace(const string& s,const string& f,const string& r)
|
||||||
|
{
|
||||||
|
if (f.size()==0) return s;
|
||||||
|
const size_t n=s.find(f);
|
||||||
|
if (n==string::npos) return s;
|
||||||
|
else return replace(s.substr(0,n) + r + s.substr(n+f.size()),f,r);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string indent(const string& s,const string& indent)
|
||||||
|
{
|
||||||
|
string t,q=s;
|
||||||
|
while(q.size()){
|
||||||
|
const string::size_type n=q.find_first_of("\n");
|
||||||
|
t += indent + q.substr(0,n) + "\n";
|
||||||
|
if (n==string::npos) break;
|
||||||
|
assert(n+1<=q.size());
|
||||||
|
q = q.substr(n+1,q.size());
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string removerems(const string& s,const string rem)
|
||||||
|
{
|
||||||
|
const size_t n=s.find_first_of(rem);
|
||||||
|
return s.substr(0,n);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string suffix(const int n)
|
||||||
|
{
|
||||||
|
assert(n>=0 && n<999);
|
||||||
|
if (n<=9) return "00" + tostring(n);
|
||||||
|
else if (n<=99) return "0" + tostring(n);
|
||||||
|
else return tostring(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
string tail(const string& s,const string& delimiter)
|
||||||
|
{
|
||||||
|
const size_t n=s.find_last_of(delimiter);
|
||||||
|
if (n==string::npos) return s;
|
||||||
|
else return s.substr(n+delimiter.size(),-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
string tail(const string& s,const char c) {
|
||||||
|
string t;
|
||||||
|
t.resize(1);
|
||||||
|
t[0]=c;
|
||||||
|
return tail(s,t);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ostream& operator<<(ostream& os,const pair<T*,int> x)
|
||||||
|
{
|
||||||
|
for(int i=0;i<x.second;++i) os << x.first[i] << " ";
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline istream& operator>>(istream& is,pair<T*,int> x)
|
||||||
|
{
|
||||||
|
for(int i=0;i<x.second;++i) is >> x.first[i];
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ostream& operator<<(ostream& s,const vector<T>& x)
|
||||||
|
{
|
||||||
|
int i=0;
|
||||||
|
if (g_tags.serialize) s << "vector: " << x.size() << " { ";
|
||||||
|
for(typename vector<T>::const_iterator itt=x.begin();itt!=x.end();++itt) {
|
||||||
|
s << g_tags.preline;
|
||||||
|
if(g_tags.printnumbers) s << "[" << fwidth(++i,3,0) << "] ";
|
||||||
|
s << *itt << " " << g_tags.endline;
|
||||||
|
}
|
||||||
|
if (g_tags.serialize) s << "} ";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline istream& operator>>(istream& s,vector<T>& x)
|
||||||
|
{
|
||||||
|
size_t n=0;
|
||||||
|
string t;
|
||||||
|
s >> t;
|
||||||
|
if (t!="vector:") throw_("bad format in vector serialization stream, tag missing");
|
||||||
|
s >> n >> t;
|
||||||
|
if (t!="{") throw_("bad format in vector serialization stream, missing begin brace");
|
||||||
|
x.resize(n);
|
||||||
|
for(size_t i=0;i<n;++i) s >> x[i];
|
||||||
|
s >> t;
|
||||||
|
if (t!="}") throw_("bad format in vector serialization stream, missing end brace");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ostream& operator<<(ostream& s,const list<T>& x)
|
||||||
|
{
|
||||||
|
if (g_tags.serialize) s << "list: " << x.size() << " { ";
|
||||||
|
int i=0;
|
||||||
|
for(typename list<T>::const_iterator itt=x.begin();itt!=x.end();++itt){
|
||||||
|
s << g_tags.preline;
|
||||||
|
if(g_tags.printnumbers) s << "[" << fwidth(++i,3,0) << "] ";
|
||||||
|
s << *itt << " " << g_tags.endline;
|
||||||
|
}
|
||||||
|
if (g_tags.serialize) s << "} ";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline istream& operator>>(istream& s,list<T>& x)
|
||||||
|
{
|
||||||
|
size_t n=0;
|
||||||
|
string t;
|
||||||
|
s >> t;
|
||||||
|
if (t!="list:") throw_("bad format in list serialization stream, tag missing");
|
||||||
|
s >> n >> t;
|
||||||
|
if (t!="{") throw_("bad format in list serialization stream, missing begin brace");
|
||||||
|
for(size_t i=0;i<n;++i) {
|
||||||
|
T y;
|
||||||
|
s >> y;
|
||||||
|
x.push_back(y);
|
||||||
|
}
|
||||||
|
s >> t;
|
||||||
|
if (t!="}") throw_("bad format in list serialization stream, missing end brace");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T,typename R>
|
||||||
|
inline ostream& operator<<(ostream& s,const map<T,R>& x)
|
||||||
|
{
|
||||||
|
if (g_tags.serialize) s << "map: " << x.size() << " { ";
|
||||||
|
int i=0;
|
||||||
|
for(typename map<T,R>::const_iterator itt=x.begin();itt!=x.end();++itt) {
|
||||||
|
s << g_tags.preline;
|
||||||
|
if(g_tags.printnumbers) s << "[" << fwidth(++i,3,0) << "] ";
|
||||||
|
s << fwidth(itt->first,g_tags.prewidth,g_tags.postwidth) << (g_tags.maptags ? " |-> " : " ");
|
||||||
|
s << fwidth(itt->second,g_tags.prewidth,g_tags.postwidth) << " " << g_tags.endline;
|
||||||
|
}
|
||||||
|
if (g_tags.serialize) s << "} ";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T,typename R>
|
||||||
|
inline istream& operator>>(istream& s,map<T,R>& x)
|
||||||
|
{
|
||||||
|
size_t n=0;
|
||||||
|
string t;
|
||||||
|
s >> t;
|
||||||
|
if (t!="map:") throw_("bad format in map serialization stream, tag missing");
|
||||||
|
s >> n >> t;
|
||||||
|
if (t!="{") throw_("bad format in map serialization stream, missing begin brace");
|
||||||
|
for(size_t i=0;i<n;++i) {
|
||||||
|
T y;
|
||||||
|
R z;
|
||||||
|
s >> y >> z;
|
||||||
|
if (x.find(y)!=x.end()) throw_("bad stream, key value no unique");
|
||||||
|
x[y]=z;
|
||||||
|
}
|
||||||
|
s >> t;
|
||||||
|
if (t!="}") throw_("bad format in map serialization stream, missing end brace");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __STRINGFUNS_H__
|
||||||
52
src/main/headers/templatefun.h
Normal file
52
src/main/headers/templatefun.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#ifndef __TEMPLATE_FUN__
|
||||||
|
#define __TEMPLATE_FUN__
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
class Autobool
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
volatile T* m_b;
|
||||||
|
Autobool(const Autobool&);
|
||||||
|
void operator=(const Autobool&);
|
||||||
|
public:
|
||||||
|
Autobool(volatile T* b) : m_b(b) {assert(m_b && *m_b==false); *m_b=true;}
|
||||||
|
~Autobool() {assert(m_b && *m_b==true); *m_b=false; m_b=0;}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T,class R>
|
||||||
|
class DeviceAutoClose
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
T m_dev;
|
||||||
|
R (__stdcall *m_fun)(void *);
|
||||||
|
bool m_init;
|
||||||
|
|
||||||
|
// private Copy CTOR and assignment operator
|
||||||
|
DeviceAutoClose(const DeviceAutoClose<T,R>&);
|
||||||
|
void operator=(const DeviceAutoClose<T,R>&);
|
||||||
|
|
||||||
|
public:
|
||||||
|
DeviceAutoClose(T dev,R(__stdcall *fun)(void*)) : m_dev(dev), m_fun(fun), m_init(true)
|
||||||
|
{
|
||||||
|
FUNSTACK;
|
||||||
|
assert(m_fun!=NULL);
|
||||||
|
}
|
||||||
|
~DeviceAutoClose()
|
||||||
|
{
|
||||||
|
FUNSTACK;
|
||||||
|
assert(m_init);
|
||||||
|
assert(m_fun!=NULL);
|
||||||
|
if (m_dev!=NULL){
|
||||||
|
R r=m_fun(m_dev);
|
||||||
|
if (!r) throw_("DeviceClose() failed"); // throw in DTOR -> bad, bad!
|
||||||
|
}
|
||||||
|
m_dev=NULL;
|
||||||
|
m_fun=NULL;
|
||||||
|
m_init=false;
|
||||||
|
}
|
||||||
|
const T& operator()() const {FUNSTACK; assert(m_init); return m_dev;}
|
||||||
|
T& operator()() {FUNSTACK; assert(m_init); return m_dev;}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __TEMPLATE_FUN__
|
||||||
34
src/main/headers/toolsfun.h
Normal file
34
src/main/headers/toolsfun.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// The code is copyrighted 2008 by Carsten Frigaard.
|
||||||
|
// All rights placed in public domain under GNU licence V2, 2008
|
||||||
|
//
|
||||||
|
// © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software
|
||||||
|
// and its documentation for any purpose and without fee is hereby granted, provided that
|
||||||
|
// the above copyright notice appear in all copies and that both that copyright notice
|
||||||
|
// and this permission notice appear in supporting documentation.
|
||||||
|
|
||||||
|
#ifndef __TOOLSFUN_H__
|
||||||
|
#define __TOOLSFUN__H__
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <ctime>
|
||||||
|
#include <time.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "exception.h"
|
||||||
|
#include "stringfun.h"
|
||||||
|
#include "args.h"
|
||||||
|
#include "funs.h"
|
||||||
|
#include "file.h"
|
||||||
|
#include "configfile.h"
|
||||||
|
#include "templatefun.h"
|
||||||
|
#include "reg.h"
|
||||||
|
|
||||||
|
#endif // __TOOLSFUN_H__
|
||||||
204
src/main/headers/usbm.h
Normal file
204
src/main/headers/usbm.h
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
#ifndef __USBM_H__
|
||||||
|
#define __USBM_H__
|
||||||
|
|
||||||
|
class USBio
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
HINSTANCE m_hDll;
|
||||||
|
|
||||||
|
// Discovery routine
|
||||||
|
typedef int (__stdcall *USBm_FindDevices_type) ();
|
||||||
|
|
||||||
|
// Info about devices
|
||||||
|
typedef int (__stdcall *USBm_NumberOfDevices_type) (void);
|
||||||
|
typedef int (__stdcall *USBm_DeviceValid_type) (unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_DeviceVID_type) (unsigned char device);
|
||||||
|
typedef int (__stdcall *USBm_DevicePID_type) (unsigned char device);
|
||||||
|
typedef int (__stdcall *USBm_DeviceDID_type) (unsigned char device);
|
||||||
|
typedef int (__stdcall *USBm_DeviceMfr_type) (unsigned char, char *);
|
||||||
|
typedef int (__stdcall *USBm_DeviceProd_type) (unsigned char, char *);
|
||||||
|
typedef int (__stdcall *USBm_DeviceSer_type) (unsigned char, char *);
|
||||||
|
|
||||||
|
// General U4xx functions
|
||||||
|
typedef int (__stdcall *USBm_InitPorts_type) (unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_WriteA_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_WriteB_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_WriteABit_type) (unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_WriteBBit_type) (unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_ReadA_type) (unsigned char, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_ReadB_type) (unsigned char, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_SetBit_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_ResetBit_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_DirectionA_type) (unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_DirectionB_type) (unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_StrobeWrite_type) (unsigned char, unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_StrobeRead_type) (unsigned char, unsigned char *, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_StrobeWrite2_type) (unsigned char, unsigned char, unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_StrobeRead2_type) (unsigned char, unsigned char *, unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_StrobeWrites_type) (unsigned char, unsigned char *, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_StrobeReads_type) (unsigned char, unsigned char *, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_InitLCD_type) (unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_LCDCmd_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_LCDData_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_InitSPI_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_SPIMaster_type) (unsigned char, unsigned char *, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_SPISlaveWrite_type) (unsigned char, unsigned char, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_SPISlaveRead_type) (unsigned char, unsigned char *, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_Stepper_type) (unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_Reset1Wire_type) (unsigned char, unsigned char *);
|
||||||
|
typedef int (__stdcall *USBm_Write1Wire_type) (unsigned char, unsigned char);
|
||||||
|
typedef int (__stdcall *USBm_Read1Wire_type) (unsigned char, unsigned char *);
|
||||||
|
|
||||||
|
// DLL string info access
|
||||||
|
typedef int (__stdcall *USBm_RecentError_type) (char *);
|
||||||
|
typedef int (__stdcall *USBm_ClearRecentError_type) (void);
|
||||||
|
typedef int (__stdcall *USBm_DebugString_type) (char *);
|
||||||
|
typedef int (__stdcall *USBm_Copyright_type) (char *);
|
||||||
|
typedef int (__stdcall *USBm_About_type) (char *);
|
||||||
|
typedef int (__stdcall *USBm_Version_type) (char *);
|
||||||
|
|
||||||
|
public:
|
||||||
|
USBio() : m_hDll(0)
|
||||||
|
{
|
||||||
|
m_hDll = LoadLibrary("USBm.dll");
|
||||||
|
if (m_hDll==0) throw_("could not locate USBm.dll");
|
||||||
|
|
||||||
|
USBm_FindDevices = (USBm_FindDevices_type)GetProcAddress(m_hDll, "USBm_FindDevices");
|
||||||
|
USBm_NumberOfDevices = (USBm_NumberOfDevices_type)GetProcAddress(m_hDll, "USBm_NumberOfDevices");
|
||||||
|
USBm_DeviceValid = (USBm_DeviceValid_type)GetProcAddress(m_hDll, "USBm_DeviceValid");
|
||||||
|
USBm_DeviceVID = (USBm_DeviceVID_type)GetProcAddress(m_hDll, "USBm_DeviceVID");
|
||||||
|
USBm_DevicePID = (USBm_DevicePID_type)GetProcAddress(m_hDll, "USBm_DevicePID");
|
||||||
|
USBm_DeviceDID = (USBm_DeviceDID_type)GetProcAddress(m_hDll, "USBm_DeviceDID");
|
||||||
|
USBm_DeviceMfr = (USBm_DeviceMfr_type)GetProcAddress(m_hDll, "USBm_DeviceMfr");
|
||||||
|
USBm_DeviceProd = (USBm_DeviceProd_type)GetProcAddress(m_hDll, "USBm_DeviceProd");
|
||||||
|
USBm_DeviceSer = (USBm_DeviceSer_type)GetProcAddress(m_hDll, "USBm_DeviceSer");
|
||||||
|
USBm_InitPorts = (USBm_InitPorts_type)GetProcAddress(m_hDll, "USBm_InitPorts");
|
||||||
|
USBm_WriteA = (USBm_WriteA_type)GetProcAddress(m_hDll, "USBm_WriteA");
|
||||||
|
USBm_WriteB = (USBm_WriteB_type)GetProcAddress(m_hDll, "USBm_WriteB");
|
||||||
|
USBm_WriteABit = (USBm_WriteABit_type)GetProcAddress(m_hDll, "USBm_WriteABit");
|
||||||
|
USBm_WriteBBit = (USBm_WriteBBit_type)GetProcAddress(m_hDll, "USBm_WriteBBit");
|
||||||
|
USBm_ReadA = (USBm_ReadA_type)GetProcAddress(m_hDll, "USBm_ReadA");
|
||||||
|
USBm_ReadB = (USBm_ReadB_type)GetProcAddress(m_hDll, "USBm_ReadB");
|
||||||
|
USBm_SetBit = (USBm_SetBit_type)GetProcAddress(m_hDll, "USBm_SetBit");
|
||||||
|
USBm_ResetBit = (USBm_ResetBit_type)GetProcAddress(m_hDll, "USBm_ResetBit");
|
||||||
|
USBm_DirectionA = (USBm_DirectionA_type)GetProcAddress(m_hDll, "USBm_DirectionA");
|
||||||
|
USBm_DirectionB = (USBm_DirectionB_type)GetProcAddress(m_hDll, "USBm_DirectionB");
|
||||||
|
USBm_StrobeWrite = (USBm_StrobeWrite_type)GetProcAddress(m_hDll, "USBm_StrobeWrite");
|
||||||
|
USBm_StrobeRead = (USBm_StrobeRead_type)GetProcAddress(m_hDll, "USBm_StrobeRead");
|
||||||
|
USBm_StrobeWrite2 = (USBm_StrobeWrite2_type)GetProcAddress(m_hDll, "USBm_StrobeWrite2");
|
||||||
|
USBm_StrobeRead2 = (USBm_StrobeRead2_type)GetProcAddress(m_hDll, "USBm_StrobeRead2");
|
||||||
|
USBm_StrobeWrites = (USBm_StrobeWrites_type)GetProcAddress(m_hDll, "USBm_StrobeWrites");
|
||||||
|
USBm_StrobeReads = (USBm_StrobeReads_type)GetProcAddress(m_hDll, "USBm_StrobeReads");
|
||||||
|
USBm_InitLCD = (USBm_InitLCD_type)GetProcAddress(m_hDll, "USBm_InitLCD");
|
||||||
|
USBm_LCDCmd = (USBm_LCDCmd_type)GetProcAddress(m_hDll, "USBm_LCDCmd");
|
||||||
|
USBm_LCDData = (USBm_LCDData_type)GetProcAddress(m_hDll, "USBm_LCDData");
|
||||||
|
USBm_InitSPI = (USBm_InitSPI_type)GetProcAddress(m_hDll, "USBm_InitSPI");
|
||||||
|
USBm_SPIMaster = (USBm_SPIMaster_type)GetProcAddress(m_hDll, "USBm_SPIMaster");
|
||||||
|
USBm_SPISlaveWrite = (USBm_SPISlaveWrite_type)GetProcAddress(m_hDll, "USBm_SPISlaveWrite");
|
||||||
|
USBm_SPISlaveRead = (USBm_SPISlaveRead_type)GetProcAddress(m_hDll, "USBm_SPISlaveRead");
|
||||||
|
USBm_Stepper = (USBm_Stepper_type)GetProcAddress(m_hDll, "USBm_Stepper");
|
||||||
|
USBm_Reset1Wire = (USBm_Reset1Wire_type)GetProcAddress(m_hDll, "USBm_Reset1Wire");
|
||||||
|
USBm_Write1Wire = (USBm_Write1Wire_type)GetProcAddress(m_hDll, "USBm_Write1Wire");
|
||||||
|
USBm_Read1Wire = (USBm_Read1Wire_type)GetProcAddress(m_hDll, "USBm_Read1Wire");
|
||||||
|
USBm_RecentError = (USBm_RecentError_type)GetProcAddress(m_hDll, "USBm_RecentError");
|
||||||
|
USBm_ClearRecentError = (USBm_ClearRecentError_type)GetProcAddress(m_hDll, "USBm_ClearRecentError");
|
||||||
|
USBm_DebugString = (USBm_DebugString_type)GetProcAddress(m_hDll, "USBm_DebugString");
|
||||||
|
USBm_Copyright = (USBm_Copyright_type)GetProcAddress(m_hDll, "USBm_Copyright");
|
||||||
|
USBm_About = (USBm_About_type)GetProcAddress(m_hDll, "USBm_About");
|
||||||
|
USBm_Version = (USBm_Version_type)GetProcAddress(m_hDll, "USBm_Version");
|
||||||
|
}
|
||||||
|
|
||||||
|
~USBio()
|
||||||
|
{
|
||||||
|
assert( m_hDll );
|
||||||
|
// XXX FreeLibrary(m_hDll);
|
||||||
|
m_hDll=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Devices() const
|
||||||
|
{
|
||||||
|
assert( m_hDll );
|
||||||
|
unsigned char numdev=USBm_NumberOfDevices();
|
||||||
|
return numdev;
|
||||||
|
}
|
||||||
|
|
||||||
|
string version() const
|
||||||
|
{
|
||||||
|
assert( m_hDll );
|
||||||
|
|
||||||
|
string s;
|
||||||
|
char textstr[300];
|
||||||
|
const int d=Devices();
|
||||||
|
|
||||||
|
s = string(" USBm.dll version = ") + USBm_Version(textstr) + "\n";
|
||||||
|
s += string(" USBm.dll version = ") + textstr + "\n";
|
||||||
|
|
||||||
|
USBm_Copyright(textstr);
|
||||||
|
s += string(" Copyright = ") + textstr + "\n";
|
||||||
|
|
||||||
|
USBm_About(textstr);
|
||||||
|
s += string(" About =") + textstr + "\n";
|
||||||
|
s += string(" Number of devices = ") + d + "\n";
|
||||||
|
|
||||||
|
// Gather info from each discovered device
|
||||||
|
for(int i=0;i<d;++i){
|
||||||
|
s += string(" Device[") + i + "]:\n";
|
||||||
|
s += string(" VID = ") + USBm_DeviceVID(i) + "\n";
|
||||||
|
USBm_DeviceMfr(i,textstr);
|
||||||
|
s += string(" Manuf = ") + textstr + "\n";
|
||||||
|
s += string(" PID = ") + USBm_DevicePID(i) + "\n";
|
||||||
|
USBm_DeviceProd(i,textstr);
|
||||||
|
s += string(" Prod = ") + textstr + "\n";
|
||||||
|
s += string(" DID = ") + USBm_DeviceDID(i) + "\n";
|
||||||
|
USBm_DeviceSer(i,textstr);
|
||||||
|
s += string(" Serial = ") + textstr + "\n";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
USBm_FindDevices_type USBm_FindDevices;
|
||||||
|
USBm_NumberOfDevices_type USBm_NumberOfDevices;
|
||||||
|
USBm_DeviceValid_type USBm_DeviceValid;
|
||||||
|
USBm_DeviceVID_type USBm_DeviceVID;
|
||||||
|
USBm_DevicePID_type USBm_DevicePID;
|
||||||
|
USBm_DeviceDID_type USBm_DeviceDID;
|
||||||
|
USBm_DeviceMfr_type USBm_DeviceMfr;
|
||||||
|
USBm_DeviceProd_type USBm_DeviceProd;
|
||||||
|
USBm_DeviceSer_type USBm_DeviceSer;
|
||||||
|
USBm_InitPorts_type USBm_InitPorts;
|
||||||
|
USBm_WriteA_type USBm_WriteA;
|
||||||
|
USBm_WriteB_type USBm_WriteB;
|
||||||
|
USBm_WriteABit_type USBm_WriteABit;
|
||||||
|
USBm_WriteBBit_type USBm_WriteBBit;
|
||||||
|
USBm_ReadA_type USBm_ReadA;
|
||||||
|
USBm_ReadB_type USBm_ReadB;
|
||||||
|
USBm_SetBit_type USBm_SetBit;
|
||||||
|
USBm_ResetBit_type USBm_ResetBit;
|
||||||
|
USBm_DirectionA_type USBm_DirectionA;
|
||||||
|
USBm_DirectionB_type USBm_DirectionB;
|
||||||
|
USBm_StrobeWrite_type USBm_StrobeWrite;
|
||||||
|
USBm_StrobeRead_type USBm_StrobeRead;
|
||||||
|
USBm_StrobeWrite2_type USBm_StrobeWrite2;
|
||||||
|
USBm_StrobeRead2_type USBm_StrobeRead2;
|
||||||
|
USBm_StrobeWrites_type USBm_StrobeWrites;
|
||||||
|
USBm_StrobeReads_type USBm_StrobeReads;
|
||||||
|
USBm_InitLCD_type USBm_InitLCD;
|
||||||
|
USBm_LCDCmd_type USBm_LCDCmd;
|
||||||
|
USBm_LCDData_type USBm_LCDData;
|
||||||
|
USBm_InitSPI_type USBm_InitSPI;
|
||||||
|
USBm_SPIMaster_type USBm_SPIMaster;
|
||||||
|
USBm_SPISlaveWrite_type USBm_SPISlaveWrite;
|
||||||
|
USBm_SPISlaveRead_type USBm_SPISlaveRead;
|
||||||
|
USBm_Stepper_type USBm_Stepper;
|
||||||
|
USBm_Reset1Wire_type USBm_Reset1Wire;
|
||||||
|
USBm_Write1Wire_type USBm_Write1Wire;
|
||||||
|
USBm_Read1Wire_type USBm_Read1Wire;
|
||||||
|
USBm_RecentError_type USBm_RecentError;
|
||||||
|
USBm_ClearRecentError_type USBm_ClearRecentError;
|
||||||
|
USBm_DebugString_type USBm_DebugString;
|
||||||
|
USBm_Copyright_type USBm_Copyright;
|
||||||
|
USBm_About_type USBm_About;
|
||||||
|
USBm_Version_type USBm_Version;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __USBM_H__
|
||||||
1108
src/main/headers/wiiscan.h
Normal file
1108
src/main/headers/wiiscan.h
Normal file
File diff suppressed because it is too large
Load Diff
653
src/main/headers/wiiuse.h
Normal file
653
src/main/headers/wiiuse.h
Normal file
@@ -0,0 +1,653 @@
|
|||||||
|
/*
|
||||||
|
* wiiuse
|
||||||
|
*
|
||||||
|
* Written By:
|
||||||
|
* Michael Laforest < para >
|
||||||
|
* Email: < thepara (--AT--) g m a i l [--DOT--] com >
|
||||||
|
*
|
||||||
|
* Copyright 2006-2007
|
||||||
|
*
|
||||||
|
* This file is part of wiiuse.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* $Header$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* @brief API header file.
|
||||||
|
*
|
||||||
|
* If this file is included from inside the wiiuse source
|
||||||
|
* and not from a third party program, then wiimote_internal.h
|
||||||
|
* is also included which extends this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WIIUSE_H_INCLUDED
|
||||||
|
#define WIIUSE_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* windows */
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
/* nix */
|
||||||
|
#include <bluetooth/bluetooth.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIIUSE_INTERNAL_H_INCLUDED
|
||||||
|
#define WCONST
|
||||||
|
#else
|
||||||
|
#define WCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* led bit masks */
|
||||||
|
#define WIIMOTE_LED_NONE 0x00
|
||||||
|
#define WIIMOTE_LED_1 0x10
|
||||||
|
#define WIIMOTE_LED_2 0x20
|
||||||
|
#define WIIMOTE_LED_3 0x40
|
||||||
|
#define WIIMOTE_LED_4 0x80
|
||||||
|
|
||||||
|
/* button codes */
|
||||||
|
#define WIIMOTE_BUTTON_TWO 0x0001
|
||||||
|
#define WIIMOTE_BUTTON_ONE 0x0002
|
||||||
|
#define WIIMOTE_BUTTON_B 0x0004
|
||||||
|
#define WIIMOTE_BUTTON_A 0x0008
|
||||||
|
#define WIIMOTE_BUTTON_MINUS 0x0010
|
||||||
|
#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020
|
||||||
|
#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040
|
||||||
|
#define WIIMOTE_BUTTON_HOME 0x0080
|
||||||
|
#define WIIMOTE_BUTTON_LEFT 0x0100
|
||||||
|
#define WIIMOTE_BUTTON_RIGHT 0x0200
|
||||||
|
#define WIIMOTE_BUTTON_DOWN 0x0400
|
||||||
|
#define WIIMOTE_BUTTON_UP 0x0800
|
||||||
|
#define WIIMOTE_BUTTON_PLUS 0x1000
|
||||||
|
#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000
|
||||||
|
#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000
|
||||||
|
#define WIIMOTE_BUTTON_UNKNOWN 0x8000
|
||||||
|
#define WIIMOTE_BUTTON_ALL 0x1F9F
|
||||||
|
|
||||||
|
/* nunchul button codes */
|
||||||
|
#define NUNCHUK_BUTTON_Z 0x01
|
||||||
|
#define NUNCHUK_BUTTON_C 0x02
|
||||||
|
#define NUNCHUK_BUTTON_ALL 0x03
|
||||||
|
|
||||||
|
/* classic controller button codes */
|
||||||
|
#define CLASSIC_CTRL_BUTTON_UP 0x0001
|
||||||
|
#define CLASSIC_CTRL_BUTTON_LEFT 0x0002
|
||||||
|
#define CLASSIC_CTRL_BUTTON_ZR 0x0004
|
||||||
|
#define CLASSIC_CTRL_BUTTON_X 0x0008
|
||||||
|
#define CLASSIC_CTRL_BUTTON_A 0x0010
|
||||||
|
#define CLASSIC_CTRL_BUTTON_Y 0x0020
|
||||||
|
#define CLASSIC_CTRL_BUTTON_B 0x0040
|
||||||
|
#define CLASSIC_CTRL_BUTTON_ZL 0x0080
|
||||||
|
#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200
|
||||||
|
#define CLASSIC_CTRL_BUTTON_PLUS 0x0400
|
||||||
|
#define CLASSIC_CTRL_BUTTON_HOME 0x0800
|
||||||
|
#define CLASSIC_CTRL_BUTTON_MINUS 0x1000
|
||||||
|
#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000
|
||||||
|
#define CLASSIC_CTRL_BUTTON_DOWN 0x4000
|
||||||
|
#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000
|
||||||
|
#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF
|
||||||
|
|
||||||
|
/* guitar hero 3 button codes */
|
||||||
|
#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001
|
||||||
|
#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008
|
||||||
|
#define GUITAR_HERO_3_BUTTON_GREEN 0x0010
|
||||||
|
#define GUITAR_HERO_3_BUTTON_BLUE 0x0020
|
||||||
|
#define GUITAR_HERO_3_BUTTON_RED 0x0040
|
||||||
|
#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080
|
||||||
|
#define GUITAR_HERO_3_BUTTON_PLUS 0x0400
|
||||||
|
#define GUITAR_HERO_3_BUTTON_MINUS 0x1000
|
||||||
|
#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000
|
||||||
|
#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF
|
||||||
|
|
||||||
|
|
||||||
|
/* wiimote option flags */
|
||||||
|
#define WIIUSE_SMOOTHING 0x01
|
||||||
|
#define WIIUSE_CONTINUOUS 0x02
|
||||||
|
#define WIIUSE_ORIENT_THRESH 0x04
|
||||||
|
#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH)
|
||||||
|
|
||||||
|
#define WIIUSE_ORIENT_PRECISION 100.0f
|
||||||
|
|
||||||
|
/* expansion codes */
|
||||||
|
#define EXP_NONE 0
|
||||||
|
#define EXP_NUNCHUK 1
|
||||||
|
#define EXP_CLASSIC 2
|
||||||
|
#define EXP_GUITAR_HERO_3 3
|
||||||
|
|
||||||
|
/* IR correction types */
|
||||||
|
typedef enum ir_position_t {
|
||||||
|
WIIUSE_IR_ABOVE,
|
||||||
|
WIIUSE_IR_BELOW
|
||||||
|
} ir_position_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if a button is pressed.
|
||||||
|
* @param dev Pointer to a wiimote_t or expansion structure.
|
||||||
|
* @param button The button you are interested in.
|
||||||
|
* @return 1 if the button is pressed, 0 if not.
|
||||||
|
*/
|
||||||
|
#define IS_PRESSED(dev, button) ((dev->btns & button) == button)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if a button is being held.
|
||||||
|
* @param dev Pointer to a wiimote_t or expansion structure.
|
||||||
|
* @param button The button you are interested in.
|
||||||
|
* @return 1 if the button is held, 0 if not.
|
||||||
|
*/
|
||||||
|
#define IS_HELD(dev, button) ((dev->btns_held & button) == button)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if a button is released on this event. \n\n
|
||||||
|
* This does not mean the button is not pressed, it means \n
|
||||||
|
* this button was just now released.
|
||||||
|
* @param dev Pointer to a wiimote_t or expansion structure.
|
||||||
|
* @param button The button you are interested in.
|
||||||
|
* @return 1 if the button is released, 0 if not.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if a button has just been pressed this event.
|
||||||
|
* @param dev Pointer to a wiimote_t or expansion structure.
|
||||||
|
* @param button The button you are interested in.
|
||||||
|
* @return 1 if the button is pressed, 0 if not.
|
||||||
|
*/
|
||||||
|
#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return the IR sensitivity level.
|
||||||
|
* @param wm Pointer to a wiimote_t structure.
|
||||||
|
* @param lvl [out] Pointer to an int that will hold the level setting.
|
||||||
|
* If no level is set 'lvl' will be set to 0.
|
||||||
|
*/
|
||||||
|
#define WIIUSE_GET_IR_SENSITIVITY(dev, lvl) \
|
||||||
|
do { \
|
||||||
|
if ((wm->state & 0x0200) == 0x0200) *lvl = 1; \
|
||||||
|
else if ((wm->state & 0x0400) == 0x0400) *lvl = 2; \
|
||||||
|
else if ((wm->state & 0x0800) == 0x0800) *lvl = 3; \
|
||||||
|
else if ((wm->state & 0x1000) == 0x1000) *lvl = 4; \
|
||||||
|
else if ((wm->state & 0x2000) == 0x2000) *lvl = 5; \
|
||||||
|
else *lvl = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020)
|
||||||
|
#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040)
|
||||||
|
#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080)
|
||||||
|
#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100)
|
||||||
|
|
||||||
|
#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Largest known payload is 21 bytes.
|
||||||
|
* Add 2 for the prefix and round up to a power of 2.
|
||||||
|
*/
|
||||||
|
#define MAX_PAYLOAD 32
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is left over from an old hack, but it may actually
|
||||||
|
* be a useful feature to keep so it wasn't removed.
|
||||||
|
*/
|
||||||
|
#ifdef WIN32
|
||||||
|
#define WIIMOTE_DEFAULT_TIMEOUT 10
|
||||||
|
#define WIIMOTE_EXP_TIMEOUT 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef unsigned char byte;
|
||||||
|
typedef char sbyte;
|
||||||
|
|
||||||
|
struct wiimote_t;
|
||||||
|
struct vec3b_t;
|
||||||
|
struct orient_t;
|
||||||
|
struct gforce_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Callback that handles a read event.
|
||||||
|
*
|
||||||
|
* @param wm Pointer to a wiimote_t structure.
|
||||||
|
* @param data Pointer to the filled data block.
|
||||||
|
* @param len Length in bytes of the data block.
|
||||||
|
*
|
||||||
|
* @see wiiuse_init()
|
||||||
|
*
|
||||||
|
* A registered function of this type is called automatically by the wiiuse
|
||||||
|
* library when the wiimote has returned the full data requested by a previous
|
||||||
|
* call to wiiuse_read_data().
|
||||||
|
*/
|
||||||
|
typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct read_req_t
|
||||||
|
* @brief Data read request structure.
|
||||||
|
*/
|
||||||
|
struct read_req_t {
|
||||||
|
wiiuse_read_cb cb; /**< read data callback */
|
||||||
|
byte* buf; /**< buffer where read data is written */
|
||||||
|
unsigned int addr; /**< the offset that the read started at */
|
||||||
|
unsigned short size; /**< the length of the data read */
|
||||||
|
unsigned short wait; /**< num bytes still needed to finish read */
|
||||||
|
byte dirty; /**< set to 1 if not using callback and needs to be cleaned up */
|
||||||
|
|
||||||
|
struct read_req_t* next; /**< next read request in the queue */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct vec2b_t
|
||||||
|
* @brief Unsigned x,y byte vector.
|
||||||
|
*/
|
||||||
|
typedef struct vec2b_t {
|
||||||
|
byte x, y;
|
||||||
|
} vec2b_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct vec3b_t
|
||||||
|
* @brief Unsigned x,y,z byte vector.
|
||||||
|
*/
|
||||||
|
typedef struct vec3b_t {
|
||||||
|
byte x, y, z;
|
||||||
|
} vec3b_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct vec3f_t
|
||||||
|
* @brief Signed x,y,z float struct.
|
||||||
|
*/
|
||||||
|
typedef struct vec3f_t {
|
||||||
|
float x, y, z;
|
||||||
|
} vec3f_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct orient_t
|
||||||
|
* @brief Orientation struct.
|
||||||
|
*
|
||||||
|
* Yaw, pitch, and roll range from -180 to 180 degrees.
|
||||||
|
*/
|
||||||
|
typedef struct orient_t {
|
||||||
|
float roll; /**< roll, this may be smoothed if enabled */
|
||||||
|
float pitch; /**< pitch, this may be smoothed if enabled */
|
||||||
|
float yaw;
|
||||||
|
|
||||||
|
float a_roll; /**< absolute roll, unsmoothed */
|
||||||
|
float a_pitch; /**< absolute pitch, unsmoothed */
|
||||||
|
} orient_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct gforce_t
|
||||||
|
* @brief Gravity force struct.
|
||||||
|
*/
|
||||||
|
typedef struct gforce_t {
|
||||||
|
float x, y, z;
|
||||||
|
} gforce_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct accel_t
|
||||||
|
* @brief Accelerometer struct. For any device with an accelerometer.
|
||||||
|
*/
|
||||||
|
typedef struct accel_t {
|
||||||
|
struct vec3b_t cal_zero; /**< zero calibration */
|
||||||
|
struct vec3b_t cal_g; /**< 1g difference around 0cal */
|
||||||
|
|
||||||
|
float st_roll; /**< last smoothed roll value */
|
||||||
|
float st_pitch; /**< last smoothed roll pitch */
|
||||||
|
float st_alpha; /**< alpha value for smoothing [0-1] */
|
||||||
|
} accel_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct ir_dot_t
|
||||||
|
* @brief A single IR source.
|
||||||
|
*/
|
||||||
|
typedef struct ir_dot_t {
|
||||||
|
byte visible; /**< if the IR source is visible */
|
||||||
|
|
||||||
|
unsigned int x; /**< interpolated X coordinate */
|
||||||
|
unsigned int y; /**< interpolated Y coordinate */
|
||||||
|
|
||||||
|
short rx; /**< raw X coordinate (0-1023) */
|
||||||
|
short ry; /**< raw Y coordinate (0-767) */
|
||||||
|
|
||||||
|
byte order; /**< increasing order by x-axis value */
|
||||||
|
|
||||||
|
byte size; /**< size of the IR dot (0-15) */
|
||||||
|
} ir_dot_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum aspect_t
|
||||||
|
* @brief Screen aspect ratio.
|
||||||
|
*/
|
||||||
|
typedef enum aspect_t {
|
||||||
|
WIIUSE_ASPECT_4_3,
|
||||||
|
WIIUSE_ASPECT_16_9
|
||||||
|
} aspect_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct ir_t
|
||||||
|
* @brief IR struct. Hold all data related to the IR tracking.
|
||||||
|
*/
|
||||||
|
typedef struct ir_t {
|
||||||
|
struct ir_dot_t dot[4]; /**< IR dots */
|
||||||
|
byte num_dots; /**< number of dots at this time */
|
||||||
|
|
||||||
|
enum aspect_t aspect; /**< aspect ratio of the screen */
|
||||||
|
|
||||||
|
enum ir_position_t pos; /**< IR sensor bar position */
|
||||||
|
|
||||||
|
unsigned int vres[2]; /**< IR virtual screen resolution */
|
||||||
|
int offset[2]; /**< IR XY correction offset */
|
||||||
|
int state; /**< keeps track of the IR state */
|
||||||
|
|
||||||
|
int ax; /**< absolute X coordinate */
|
||||||
|
int ay; /**< absolute Y coordinate */
|
||||||
|
|
||||||
|
int x; /**< calculated X coordinate */
|
||||||
|
int y; /**< calculated Y coordinate */
|
||||||
|
|
||||||
|
float distance; /**< pixel distance between first 2 dots*/
|
||||||
|
float z; /**< calculated distance */
|
||||||
|
} ir_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct joystick_t
|
||||||
|
* @brief Joystick calibration structure.
|
||||||
|
*
|
||||||
|
* The angle \a ang is relative to the positive y-axis into quadrant I
|
||||||
|
* and ranges from 0 to 360 degrees. So if the joystick is held straight
|
||||||
|
* upwards then angle is 0 degrees. If it is held to the right it is 90,
|
||||||
|
* down is 180, and left is 270.
|
||||||
|
*
|
||||||
|
* The magnitude \a mag is the distance from the center to where the
|
||||||
|
* joystick is being held. The magnitude ranges from 0 to 1.
|
||||||
|
* If the joystick is only slightly tilted from the center the magnitude
|
||||||
|
* will be low, but if it is closer to the outter edge the value will
|
||||||
|
* be higher.
|
||||||
|
*/
|
||||||
|
typedef struct joystick_t {
|
||||||
|
struct vec2b_t max; /**< maximum joystick values */
|
||||||
|
struct vec2b_t min; /**< minimum joystick values */
|
||||||
|
struct vec2b_t center; /**< center joystick values */
|
||||||
|
|
||||||
|
float ang; /**< angle the joystick is being held */
|
||||||
|
float mag; /**< magnitude of the joystick (range 0-1) */
|
||||||
|
} joystick_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct nunchuk_t
|
||||||
|
* @brief Nunchuk expansion device.
|
||||||
|
*/
|
||||||
|
typedef struct nunchuk_t {
|
||||||
|
struct accel_t accel_calib; /**< nunchuk accelerometer calibration */
|
||||||
|
struct joystick_t js; /**< joystick calibration */
|
||||||
|
|
||||||
|
int* flags; /**< options flag (points to wiimote_t.flags) */
|
||||||
|
|
||||||
|
byte btns; /**< what buttons have just been pressed */
|
||||||
|
byte btns_held; /**< what buttons are being held down */
|
||||||
|
byte btns_released; /**< what buttons were just released this */
|
||||||
|
|
||||||
|
float orient_threshold; /**< threshold for orient to generate an event */
|
||||||
|
int accel_threshold; /**< threshold for accel to generate an event */
|
||||||
|
|
||||||
|
struct vec3b_t accel; /**< current raw acceleration data */
|
||||||
|
struct orient_t orient; /**< current orientation on each axis */
|
||||||
|
struct gforce_t gforce; /**< current gravity forces on each axis */
|
||||||
|
} nunchuk_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct classic_ctrl_t
|
||||||
|
* @brief Classic controller expansion device.
|
||||||
|
*/
|
||||||
|
typedef struct classic_ctrl_t {
|
||||||
|
short btns; /**< what buttons have just been pressed */
|
||||||
|
short btns_held; /**< what buttons are being held down */
|
||||||
|
short btns_released; /**< what buttons were just released this */
|
||||||
|
|
||||||
|
float r_shoulder; /**< right shoulder button (range 0-1) */
|
||||||
|
float l_shoulder; /**< left shoulder button (range 0-1) */
|
||||||
|
|
||||||
|
struct joystick_t ljs; /**< left joystick calibration */
|
||||||
|
struct joystick_t rjs; /**< right joystick calibration */
|
||||||
|
} classic_ctrl_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct guitar_hero_3_t
|
||||||
|
* @brief Guitar Hero 3 expansion device.
|
||||||
|
*/
|
||||||
|
typedef struct guitar_hero_3_t {
|
||||||
|
short btns; /**< what buttons have just been pressed */
|
||||||
|
short btns_held; /**< what buttons are being held down */
|
||||||
|
short btns_released; /**< what buttons were just released this */
|
||||||
|
|
||||||
|
float whammy_bar; /**< whammy bar (range 0-1) */
|
||||||
|
|
||||||
|
struct joystick_t js; /**< joystick calibration */
|
||||||
|
} guitar_hero_3_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct expansion_t
|
||||||
|
* @brief Generic expansion device plugged into wiimote.
|
||||||
|
*/
|
||||||
|
typedef struct expansion_t {
|
||||||
|
int type; /**< type of expansion attached */
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct nunchuk_t nunchuk;
|
||||||
|
struct classic_ctrl_t classic;
|
||||||
|
struct guitar_hero_3_t gh3;
|
||||||
|
};
|
||||||
|
} expansion_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum win32_bt_stack_t
|
||||||
|
* @brief Available bluetooth stacks for Windows.
|
||||||
|
*/
|
||||||
|
typedef enum win_bt_stack_t {
|
||||||
|
WIIUSE_STACK_UNKNOWN,
|
||||||
|
WIIUSE_STACK_MS,
|
||||||
|
WIIUSE_STACK_BLUESOLEIL
|
||||||
|
} win_bt_stack_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct wiimote_state_t
|
||||||
|
* @brief Significant data from the previous event.
|
||||||
|
*/
|
||||||
|
typedef struct wiimote_state_t {
|
||||||
|
/* expansion_t */
|
||||||
|
float exp_ljs_ang;
|
||||||
|
float exp_rjs_ang;
|
||||||
|
float exp_ljs_mag;
|
||||||
|
float exp_rjs_mag;
|
||||||
|
unsigned short exp_btns;
|
||||||
|
struct orient_t exp_orient;
|
||||||
|
struct vec3b_t exp_accel;
|
||||||
|
float exp_r_shoulder;
|
||||||
|
float exp_l_shoulder;
|
||||||
|
|
||||||
|
/* ir_t */
|
||||||
|
int ir_ax;
|
||||||
|
int ir_ay;
|
||||||
|
float ir_distance;
|
||||||
|
|
||||||
|
struct orient_t orient;
|
||||||
|
unsigned short btns;
|
||||||
|
|
||||||
|
struct vec3b_t accel;
|
||||||
|
} wiimote_state_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum WIIUSE_EVENT_TYPE
|
||||||
|
* @brief Events that wiiuse can generate from a poll.
|
||||||
|
*/
|
||||||
|
typedef enum WIIUSE_EVENT_TYPE {
|
||||||
|
WIIUSE_NONE = 0,
|
||||||
|
WIIUSE_EVENT,
|
||||||
|
WIIUSE_STATUS,
|
||||||
|
WIIUSE_CONNECT,
|
||||||
|
WIIUSE_DISCONNECT,
|
||||||
|
WIIUSE_UNEXPECTED_DISCONNECT,
|
||||||
|
WIIUSE_READ_DATA,
|
||||||
|
WIIUSE_NUNCHUK_INSERTED,
|
||||||
|
WIIUSE_NUNCHUK_REMOVED,
|
||||||
|
WIIUSE_CLASSIC_CTRL_INSERTED,
|
||||||
|
WIIUSE_CLASSIC_CTRL_REMOVED,
|
||||||
|
WIIUSE_GUITAR_HERO_3_CTRL_INSERTED,
|
||||||
|
WIIUSE_GUITAR_HERO_3_CTRL_REMOVED
|
||||||
|
} WIIUSE_EVENT_TYPE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct wiimote_t
|
||||||
|
* @brief Wiimote structure.
|
||||||
|
*/
|
||||||
|
typedef struct wiimote_t {
|
||||||
|
WCONST int unid; /**< user specified id */
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
WCONST bdaddr_t bdaddr; /**< bt address */
|
||||||
|
WCONST char bdaddr_str[18]; /**< readable bt address */
|
||||||
|
WCONST int out_sock; /**< output socket */
|
||||||
|
WCONST int in_sock; /**< input socket */
|
||||||
|
#else
|
||||||
|
WCONST HANDLE dev_handle; /**< HID handle */
|
||||||
|
WCONST OVERLAPPED hid_overlap; /**< overlap handle */
|
||||||
|
WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */
|
||||||
|
WCONST int timeout; /**< read timeout */
|
||||||
|
WCONST byte normal_timeout; /**< normal timeout */
|
||||||
|
WCONST byte exp_timeout; /**< timeout for expansion handshake */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
WCONST int state; /**< various state flags */
|
||||||
|
WCONST byte leds; /**< currently lit leds */
|
||||||
|
WCONST float battery_level; /**< battery level */
|
||||||
|
|
||||||
|
WCONST int flags; /**< options flag */
|
||||||
|
|
||||||
|
WCONST byte handshake_state; /**< the state of the connection handshake */
|
||||||
|
|
||||||
|
WCONST struct read_req_t* read_req; /**< list of data read requests */
|
||||||
|
WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */
|
||||||
|
WCONST struct expansion_t exp; /**< wiimote expansion device */
|
||||||
|
|
||||||
|
WCONST struct vec3b_t accel; /**< current raw acceleration data */
|
||||||
|
WCONST struct orient_t orient; /**< current orientation on each axis */
|
||||||
|
WCONST struct gforce_t gforce; /**< current gravity forces on each axis */
|
||||||
|
|
||||||
|
WCONST struct ir_t ir; /**< IR data */
|
||||||
|
|
||||||
|
WCONST unsigned short btns; /**< what buttons have just been pressed */
|
||||||
|
WCONST unsigned short btns_held; /**< what buttons are being held down */
|
||||||
|
WCONST unsigned short btns_released; /**< what buttons were just released this */
|
||||||
|
|
||||||
|
WCONST float orient_threshold; /**< threshold for orient to generate an event */
|
||||||
|
WCONST int accel_threshold; /**< threshold for accel to generate an event */
|
||||||
|
|
||||||
|
WCONST struct wiimote_state_t lstate; /**< last saved state */
|
||||||
|
|
||||||
|
WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */
|
||||||
|
WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */
|
||||||
|
} wiimote;
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************
|
||||||
|
*
|
||||||
|
* Include API specific stuff
|
||||||
|
*
|
||||||
|
*****************************************/
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define WIIUSE_EXPORT_DECL __declspec(dllexport)
|
||||||
|
#define WIIUSE_IMPORT_DECL __declspec(dllimport)
|
||||||
|
#else
|
||||||
|
#define WIIUSE_EXPORT_DECL
|
||||||
|
#define WIIUSE_IMPORT_DECL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIIUSE_COMPILE_LIB
|
||||||
|
#define WIIUSE_EXPORT WIIUSE_EXPORT_DECL
|
||||||
|
#else
|
||||||
|
#define WIIUSE_EXPORT WIIUSE_IMPORT_DECL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* wiiuse.c */
|
||||||
|
WIIUSE_EXPORT extern const char* wiiuse_version();
|
||||||
|
|
||||||
|
WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_disconnected(struct wiimote_t* wm);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_cleanup(struct wiimote_t** wm, int wiimotes);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_rumble(struct wiimote_t* wm, int status);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_toggle_rumble(struct wiimote_t* wm);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_motion_sensing(struct wiimote_t* wm, int status);
|
||||||
|
WIIUSE_EXPORT extern int wiiuse_read_data(struct wiimote_t* wm, byte* buffer, unsigned int offset, unsigned short len);
|
||||||
|
WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_status(struct wiimote_t* wm);
|
||||||
|
WIIUSE_EXPORT extern struct wiimote_t* wiiuse_get_by_id(struct wiimote_t** wm, int wiimotes, int unid);
|
||||||
|
WIIUSE_EXPORT extern int wiiuse_set_flags(struct wiimote_t* wm, int enable, int disable);
|
||||||
|
WIIUSE_EXPORT extern float wiiuse_set_smooth_alpha(struct wiimote_t* wm, float alpha);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_bluetooth_stack(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_orient_threshold(struct wiimote_t* wm, float threshold);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_resync(struct wiimote_t* wm);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_accel_threshold(struct wiimote_t* wm, int threshold);
|
||||||
|
|
||||||
|
/* connect.c */
|
||||||
|
WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout);
|
||||||
|
WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm);
|
||||||
|
|
||||||
|
/* events.c */
|
||||||
|
WIIUSE_EXPORT extern int wiiuse_poll(struct wiimote_t** wm, int wiimotes);
|
||||||
|
|
||||||
|
/* ir.c */
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_ir(struct wiimote_t* wm, int status);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_ir_vres(struct wiimote_t* wm, unsigned int x, unsigned int y);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_ir_sensitivity(struct wiimote_t* wm, int level);
|
||||||
|
|
||||||
|
/* nunchuk.c */
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_nunchuk_orient_threshold(struct wiimote_t* wm, float threshold);
|
||||||
|
WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct wiimote_t* wm, int threshold);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* WIIUSE_H_INCLUDED */
|
||||||
|
|
||||||
Reference in New Issue
Block a user