Compare commits
No commits in common. "1.2" and "master" have entirely different histories.
753 changed files with 97944 additions and 3289 deletions
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
build/
|
||||||
|
qtcreator-build/
|
||||||
|
Doxyfile
|
||||||
|
html/
|
||||||
|
latex/
|
||||||
|
CMakeLists.txt.user
|
||||||
|
*.pyc
|
||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "telldus-gui/3rdparty/qt-components-desktop"]
|
||||||
|
path = telldus-gui/3rdparty/qt-components-desktop
|
||||||
|
url = http://git.telldus.com/qt-components-desktop.git
|
||||||
35
3rdparty/tellstick.net/Properties/AssemblyInfo.cs
vendored
Normal file
35
3rdparty/tellstick.net/Properties/AssemblyInfo.cs
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("TellStick.NET")]
|
||||||
|
[assembly: AssemblyDescription("A managed .NET wrapper class library for the TellStick native DLL")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Eyedealistic / Levén Labs (http://labs.leven.se)")]
|
||||||
|
[assembly: AssemblyProduct("TellStick.NET")]
|
||||||
|
[assembly: AssemblyCopyright("Created by Mikael Levén in 2007")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("24411992-c766-4eb8-b7ac-c002f0d7d5ad")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Revision and Build Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
[assembly: AssemblyVersion("0.1.0.*")]
|
||||||
|
[assembly: AssemblyFileVersion("0.1.0.0")]
|
||||||
102
3rdparty/tellstick.net/TellStick.NET.csproj
vendored
Normal file
102
3rdparty/tellstick.net/TellStick.NET.csproj
vendored
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.50727</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{700E41E9-ADB6-4D5A-B9EB-B6560C1C0D3F}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>TellStick</RootNamespace>
|
||||||
|
<AssemblyName>TellStick.NET</AssemblyName>
|
||||||
|
<SccProjectName>
|
||||||
|
</SccProjectName>
|
||||||
|
<SccLocalPath>
|
||||||
|
</SccLocalPath>
|
||||||
|
<SccAuxPath>
|
||||||
|
</SccAuxPath>
|
||||||
|
<SccProvider>
|
||||||
|
</SccProvider>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<NoStdLib>false</NoStdLib>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<CodeAnalysisRuleAssemblies>C:\Program Files (x86)\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules</CodeAnalysisRuleAssemblies>
|
||||||
|
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||||
|
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<OutputPath>bin\x86\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<CodeAnalysisRuleAssemblies>C:\Program Files (x86)\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules</CodeAnalysisRuleAssemblies>
|
||||||
|
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||||
|
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<DocumentationFile>bin\x86\Release\TellStick.NET.XML</DocumentationFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<CodeAnalysisRuleAssemblies>C:\Program Files\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules</CodeAnalysisRuleAssemblies>
|
||||||
|
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||||
|
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
|
||||||
|
<OutputPath>bin\x64\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<CodeAnalysisRuleAssemblies>C:\Program Files\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules</CodeAnalysisRuleAssemblies>
|
||||||
|
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
|
||||||
|
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<DocumentationFile>bin\x64\Release\TellStick.NET.XML</DocumentationFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="TellStick.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
318
3rdparty/tellstick.net/TellStick.cs
vendored
Normal file
318
3rdparty/tellstick.net/TellStick.cs
vendored
Normal file
|
|
@ -0,0 +1,318 @@
|
||||||
|
/* -------------------------------------------------------------------------------
|
||||||
|
* TellStick.NET
|
||||||
|
* -------------------------------------------------------------------------------
|
||||||
|
* Created by Mikael Levén (http://labs.leven.se)
|
||||||
|
*
|
||||||
|
* This piece of code is licensed as open source and can be freely used and
|
||||||
|
* redistributed in any type of project, both commercial and non-commercial,
|
||||||
|
* as long as this licensing policy is not altered. This means that any alterations
|
||||||
|
* of this code must also be licensed as open source and therefore cannot be
|
||||||
|
* protected or patented in any way. However, any software based on this code may
|
||||||
|
* still be copyrighted (and/or patented) and sold as propritary software as long as
|
||||||
|
* this code (and any alterations of it) can be freely used and modified by others.
|
||||||
|
*
|
||||||
|
* Altough the code is licensed as open source you don't need to republish any
|
||||||
|
* changes made back to the community (it will be much appreciated tough).
|
||||||
|
*
|
||||||
|
* The code comes without any kind of warrantys and the author cannot be held
|
||||||
|
* responsible for any kind of damage this software may (or may not) cause, no matter
|
||||||
|
* if it's direct or indirect damage.
|
||||||
|
*
|
||||||
|
* Please note:
|
||||||
|
* All TellStick core functionality is developed by Telldus Technologies
|
||||||
|
* and as of now (2007-12-14) that code is also licensed as open source. This may
|
||||||
|
* however change in the future and I suggest that you check there website
|
||||||
|
* to make sure the licensing terms are still the same: http://www.telldus.se/
|
||||||
|
* The documentation and example code for Tellstic is available at their Wiki:
|
||||||
|
* http://www.telldus.se/wiki/
|
||||||
|
*
|
||||||
|
* -------------------------------------------------------------------------------
|
||||||
|
* Description:
|
||||||
|
* TellStick.NET is a Microsoft .NET wrapper for the native TellStick DLL.
|
||||||
|
* The wrapper also adds some functionality to make it easier to work with
|
||||||
|
* TellStick devices.
|
||||||
|
*
|
||||||
|
* Author: Mikael Levén
|
||||||
|
* Created: 2007-12-14
|
||||||
|
*
|
||||||
|
* Dependencies:
|
||||||
|
* This library depends on the native DLL for TellStick. To be able to actually
|
||||||
|
* switch lights on and off you also need the driver to be installed as well
|
||||||
|
* as an TellStick USB device.
|
||||||
|
*
|
||||||
|
* Revisions:
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TellStick.NET is a Microsoft .NET wrapper for the native TellStick DLL.
|
||||||
|
/// The wrapper also adds some functionality to make it easier to work with TellStick devices.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class TellStick
|
||||||
|
{
|
||||||
|
private TellStick()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
#region TellStick native DLL imports class
|
||||||
|
public sealed class Native
|
||||||
|
{
|
||||||
|
private Native()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern int devAddDevice();
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devTurnOn(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devTurnOff(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern int devGetNumberOfDevices();
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern string devGetName(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devSetName(int intDeviceId, string chNewName);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern string devGetVendor(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devSetVendor(int intDeviceId, string chNewName);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern string devGetModel(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devSetModel(int intDeviceId, string chNewName);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern int[] devGetArguments(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devSetArguments(int intDeviceId, int[] intArguments, int intNumberOfArguments);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern int devAddDeviceWithArguments(string strVendor, int[] intArguments, int intNumberOfArguments);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern bool devRemoveDevice(int intDeviceId);
|
||||||
|
|
||||||
|
[DllImport("TellUsbD101.dll")]
|
||||||
|
public static extern int devGetDeviceId(int intDeviceIndex);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the number of devices registered
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Returns the number of devices as an integer</returns>
|
||||||
|
/// <remarks>The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown.</remarks>
|
||||||
|
public static int GetNumberOfDevices()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Native.devGetNumberOfDevices();
|
||||||
|
}
|
||||||
|
catch (System.DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex);
|
||||||
|
}
|
||||||
|
catch (System.Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the unique idetifier of the device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceIndex">Index number of the device to get ID for</param>
|
||||||
|
/// <returns>Returns the unique identifier as an integer</returns>
|
||||||
|
/// <remarks>The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown.</remarks>
|
||||||
|
public static int GetDeviceId(int deviceIndex)
|
||||||
|
{
|
||||||
|
// Retrieve and return the device unqiue identifier from the native method
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Native.devGetDeviceId(deviceIndex);
|
||||||
|
}
|
||||||
|
catch (System.DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex);
|
||||||
|
}
|
||||||
|
catch (System.Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user defined name of the device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Device unqiue identification</param>
|
||||||
|
/// <returns>Returns the user defined device name as a string</returns>
|
||||||
|
/// <remarks>The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown.</remarks>
|
||||||
|
public static string GetName(int deviceId)
|
||||||
|
{
|
||||||
|
// Retrieve and return the device name from the native method
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Native.devGetName(deviceId);
|
||||||
|
}
|
||||||
|
catch (System.DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex);
|
||||||
|
}
|
||||||
|
catch (System.Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Turns on the selected device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Device unqiue identification</param>
|
||||||
|
/// <returns>Returns true if the device was succesfully turned on</returns>
|
||||||
|
/// <remarks>The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown.</remarks>
|
||||||
|
public static bool TurnOn(int deviceId)
|
||||||
|
{
|
||||||
|
// Send "on" signal
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Native.devTurnOn(deviceId);
|
||||||
|
}
|
||||||
|
catch (System.DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex);
|
||||||
|
}
|
||||||
|
catch (System.Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Turns off the selected device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Device unqiue identification</param>
|
||||||
|
/// <returns>Returns true if the device was succesfully turned off</returns>
|
||||||
|
/// <remarks>The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown.</remarks>
|
||||||
|
public static bool TurnOff(int deviceId)
|
||||||
|
{
|
||||||
|
// Send "off" signal
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Native.devTurnOff(deviceId);
|
||||||
|
}
|
||||||
|
catch (System.DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex);
|
||||||
|
}
|
||||||
|
catch (System.Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the vendors name
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <remarks>The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown.</remarks>
|
||||||
|
public static string GetVendor(int deviceId)
|
||||||
|
{
|
||||||
|
// Retrieve and return the vendor from the native method
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Native.devGetVendor(deviceId);
|
||||||
|
}
|
||||||
|
catch (System.DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex);
|
||||||
|
}
|
||||||
|
catch (System.Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region "Support classes"
|
||||||
|
|
||||||
|
public abstract class TellStickException : System.Exception
|
||||||
|
{
|
||||||
|
public TellStickException() : base()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public TellStickException(string message)
|
||||||
|
: base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public TellStickException(string message, System.Exception innerException)
|
||||||
|
: base(message, innerException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UnmanagedException : TellStickException
|
||||||
|
{
|
||||||
|
public UnmanagedException() : base()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnmanagedException(string message)
|
||||||
|
: base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnmanagedException(string message, System.Exception innerException)
|
||||||
|
: base(message, innerException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ModuleNotFoundException : TellStickException
|
||||||
|
{
|
||||||
|
public ModuleNotFoundException()
|
||||||
|
: base("Could not find TellStick software. Please make sure it's installed before you run this application!")
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ModuleNotFoundException(string message)
|
||||||
|
: base(message)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ModuleNotFoundException(string message, System.Exception innerException)
|
||||||
|
: base(message, innerException)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
674
3rdparty/tellstickcontroller/License
vendored
Normal file
674
3rdparty/tellstickcontroller/License
vendored
Normal file
|
|
@ -0,0 +1,674 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||||
181
3rdparty/tellstickcontroller/Readme
vendored
Normal file
181
3rdparty/tellstickcontroller/Readme
vendored
Normal file
|
|
@ -0,0 +1,181 @@
|
||||||
|
This Readme explains how to use tellstickControllerTdtool and
|
||||||
|
tellstickControllerRfcmd programs to control a tellstick.
|
||||||
|
|
||||||
|
The tellstickController shell script can be used as a wrapper help
|
||||||
|
for old users.
|
||||||
|
|
||||||
|
The two configuration files can also be used as a starting point on
|
||||||
|
how to control receiver devices when running tellstickController in
|
||||||
|
daemon mode.
|
||||||
|
|
||||||
|
tellstickControllerTdtool.conf shows how the configuration file can
|
||||||
|
be written when using tdtool. Remember that tellstick.conf needs to
|
||||||
|
be used for actual confiuration of receiver devices.
|
||||||
|
|
||||||
|
tellstickControllerRfcmd.conf shows how the configuration file can
|
||||||
|
be written when using rfcmd.
|
||||||
|
|
||||||
|
The example directory contains a number of shell scripts that can be
|
||||||
|
used as a starting point for how to use tellstickController.
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
NAME
|
||||||
|
tellstickControllerTdtool
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
tellstickControllerTdtool [options]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
tellstickController is used for controlling wireless recevier devices from
|
||||||
|
a TellStick transmitter. This version uses the tdtool software to perform
|
||||||
|
the actual device control. tellstickController can be used for manual
|
||||||
|
control of devices, or used as a daemon that is controlled by a number of
|
||||||
|
configuration file rules.
|
||||||
|
Devices and groups can be accessed by either name or id.
|
||||||
|
States can be set to ON, OFF or an integer between 0-255 for dimmer.
|
||||||
|
|
||||||
|
-h, --help Show this help text.
|
||||||
|
-v, --verbose Show extra information.
|
||||||
|
-d, --daemon Starts in daemon mode.
|
||||||
|
-f, --file F Set configfile to file F.
|
||||||
|
-c, --check Check content of configuration file.
|
||||||
|
-t, --test Test mode, no real devices will used.
|
||||||
|
-a, --aliases List of aliases for devices/groups.
|
||||||
|
-l, --list List states for all devices/groups.
|
||||||
|
-s, --set D S Set device D to state S
|
||||||
|
-g, --get D Get state for device/group D.
|
||||||
|
-w, --swapfirst G Swap states for group G based on first device state.
|
||||||
|
-x, --swap D Swap state for device/group D.
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
tellstickControllerTdtool -l
|
||||||
|
tellstickControllerTdtool --set device_alias on
|
||||||
|
tellstickControllerTdtool --swap device_alias
|
||||||
|
tellstickControllerTdtool -d -f myConfigFile.conf
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
The following Perl modules needs to be installed:
|
||||||
|
DateTime and DateTime::Event::Sunrise
|
||||||
|
|
||||||
|
FILES
|
||||||
|
tellstickController.conf
|
||||||
|
tellstickController.log
|
||||||
|
tellstickController.pid
|
||||||
|
|
||||||
|
CONFIGURATION
|
||||||
|
The configuration file consists of a number of settings 'Set', a number of
|
||||||
|
group aliases 'Group', and a number of device rules 'Rules'.
|
||||||
|
|
||||||
|
The settings controls sunrise/sunset, logfile, pidfile, etc.
|
||||||
|
|
||||||
|
The groups configures a list of devices and a delay time.
|
||||||
|
|
||||||
|
The rules can be written as a string containing two parts.
|
||||||
|
The first part is optional and ends with an '/'. It can contain one or more
|
||||||
|
of these keywords 'Weekend', 'Workweek', 'Monday', 'Tuesday', 'Wednesday',
|
||||||
|
'Thursday', 'Friday', 'Saturday' and 'Sunday'. A specified date like
|
||||||
|
'2008-03-18', '2008-03-##', '####-03-##' or '####-##-15' is also allowed.
|
||||||
|
The second part is mandatory and is either a expression or the keyword 'No'.
|
||||||
|
The expression can contain a micture of these keywords 'Sunrise', 'Sunset',
|
||||||
|
'Random(HH:MM)', 'HH:MM' and 'Dimmer(HH:MM,startlevel,stoplevel,steplevel)'.
|
||||||
|
A Dimmer can be controlled to change dim level from startlevel to stoplevel
|
||||||
|
by adding/subtracting steplevel value every HH:MM time period.
|
||||||
|
|
||||||
|
Example rule: Weekend/07:15
|
||||||
|
Example rule: Monday+Sunday/07:15
|
||||||
|
Example rule: 2008-03-##/12:10
|
||||||
|
Example rule: 07:15+Random(02:00)
|
||||||
|
Example rule: Sunset-00:30
|
||||||
|
Example rule: Workweek/07:00+Dimmer(00:01,5,255,25)
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
Original version written by Rickard Andersson
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
Copyright (C) 2008-2010 Rickard Andersson. Version 2.0.0
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY.
|
||||||
|
This is free software, and you are welcome to redistribute it under certain
|
||||||
|
conditions; See license file for details.
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
NAME
|
||||||
|
tellstickControllerRfcmd
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
tellstickControllerRfcmd [options]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
tellstickController is used for controlling wireless recevier devices from
|
||||||
|
a TellStick transmitter. This version uses the rfcmd software to perform
|
||||||
|
the actual device control. tellstickController can be used for manual
|
||||||
|
control of devices, or used as a daemon that is controlled by a number of
|
||||||
|
configuration file rules.
|
||||||
|
A small database is used for keeping track of device states between every
|
||||||
|
execution of tellstickController.
|
||||||
|
|
||||||
|
-h, --help Show this help text.
|
||||||
|
-v, --verbose Show extra information.
|
||||||
|
-d, --daemon Starts in daemon mode.
|
||||||
|
-f, --file F Set configfile to file F.
|
||||||
|
-c, --check Check content of configuration file.
|
||||||
|
-t, --test Test mode, no real devices will used.
|
||||||
|
-a, --aliases List of aliases for devices/groups.
|
||||||
|
-l, --list List states for all devices/groups.
|
||||||
|
-s, --set D S Set device D to state S.
|
||||||
|
-g, --get D Get state for device/group D.
|
||||||
|
-w, --swapfirst G Swap states for group G based on first device state.
|
||||||
|
-x, --swap D Swap state for device/group D.
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
tellstickControllerRfcmd -l
|
||||||
|
tellstickControllerRfcmd --set device_alias on
|
||||||
|
tellstickControllerRfcmd --swap device_alias
|
||||||
|
tellstickControllerRfcmd -d -f myConfigFile.conf
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
The following Perl modules needs to be installed:
|
||||||
|
DB_File, DateTime and DateTime::Event::Sunrise
|
||||||
|
|
||||||
|
FILES
|
||||||
|
tellstickController.conf
|
||||||
|
tellstickController.db
|
||||||
|
tellstickController.log
|
||||||
|
tellstickController.pid
|
||||||
|
|
||||||
|
CONFIGURATION
|
||||||
|
The configuration file consists of a number of settings 'Set', a number of
|
||||||
|
device aliases 'Alias', and a number of device rules 'Rules'.
|
||||||
|
|
||||||
|
The settings controls sunrise/sunset, logfile, pidfile, etc.
|
||||||
|
|
||||||
|
The aliases configures device name, channel, code, etc.
|
||||||
|
|
||||||
|
The groups configures a list of devices and a delay time.
|
||||||
|
|
||||||
|
The rules can be written as a string containing two parts.
|
||||||
|
The first part is optional and ends with an '/'. It can contain one or more
|
||||||
|
of these keywords 'Weekend', 'Workweek', 'Monday', 'Tuesday', 'Wednesday',
|
||||||
|
'Thursday', 'Friday', 'Saturday' and 'Sunday'. A specified date like
|
||||||
|
'2008-03-18', '2008-03-##', '####-03-##' or '####-##-15' is also allowed.
|
||||||
|
The second part is mandatory and is either a expression or the keyword 'No'.
|
||||||
|
The expression can contain a micture of these keywords 'Sunrise', 'Sunset',
|
||||||
|
'Random(HH:MM)' and 'HH:MM'.
|
||||||
|
|
||||||
|
Example rule: Weekend/07:15
|
||||||
|
Example rule: Monday+Sunday/07:15
|
||||||
|
Example rule: 2008-03-##/12:10
|
||||||
|
Example rule: 07:15+Random(02:00)
|
||||||
|
Example rule: Sunset-00:30
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
Original version written by Rickard Andersson
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
Copyright (C) 2008-2010 Rickard Andersson. Version 2.0.0
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; See license file for details.
|
||||||
|
|
||||||
|
######################################################################
|
||||||
16
3rdparty/tellstickcontroller/examples/power_off_all_lights
vendored
Executable file
16
3rdparty/tellstickcontroller/examples/power_off_all_lights
vendored
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Power off every device that control light sources.
|
||||||
|
#
|
||||||
|
|
||||||
|
tellstickController --set bedroom_mythtv_leds off
|
||||||
|
tellstickController --set bedroom_window off
|
||||||
|
tellstickController --set kitchen_cabinets off
|
||||||
|
tellstickController --set livingroom_cabinets off
|
||||||
|
tellstickController --set livingroom_mythtv_leds off
|
||||||
|
tellstickController --set livingroom_uplight off
|
||||||
|
tellstickController --set livingroom_wall_north off
|
||||||
|
tellstickController --set livingroom_wall_east off
|
||||||
|
tellstickController --set livingroom_window off
|
||||||
|
tellstickController --set study_window off
|
||||||
|
|
||||||
8
3rdparty/tellstickcontroller/examples/power_off_bedroom_mythtv
vendored
Executable file
8
3rdparty/tellstickcontroller/examples/power_off_bedroom_mythtv
vendored
Executable file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Power off bedroom MythTV, turn off backlight leds.
|
||||||
|
#
|
||||||
|
|
||||||
|
tellstickController --set bedroom_mythtv_power off
|
||||||
|
tellstickController --set bedroom_mythtv_leds off
|
||||||
|
|
||||||
16
3rdparty/tellstickcontroller/examples/power_on_all_lights
vendored
Executable file
16
3rdparty/tellstickcontroller/examples/power_on_all_lights
vendored
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Power on every device that control light sources.
|
||||||
|
#
|
||||||
|
|
||||||
|
tellstickController --set bedroom_mythtv_leds on
|
||||||
|
tellstickController --set bedroom_window on
|
||||||
|
tellstickController --set kitchen_cabinets on
|
||||||
|
tellstickController --set livingroom_cabinets on
|
||||||
|
tellstickController --set livingroom_mythtv_leds on
|
||||||
|
tellstickController --set livingroom_uplight on
|
||||||
|
tellstickController --set livingroom_wall_north on
|
||||||
|
tellstickController --set livingroom_wall_east on
|
||||||
|
tellstickController --set Livingroom_window on
|
||||||
|
tellstickController --set study_window on
|
||||||
|
|
||||||
10
3rdparty/tellstickcontroller/examples/power_on_bedroom_mythtv
vendored
Executable file
10
3rdparty/tellstickcontroller/examples/power_on_bedroom_mythtv
vendored
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Power on bedroom MythTV, turn on backlight leds and turn off window lamp.
|
||||||
|
#
|
||||||
|
|
||||||
|
tellstickController --set bedroom_mythtv_power on
|
||||||
|
tellstickController --set bedroom_mythtv_leds on
|
||||||
|
tellstickController --set bedroom_window off
|
||||||
|
tellstickController --set bedroom_bed off
|
||||||
|
|
||||||
27
3rdparty/tellstickcontroller/examples/swap_livingroom_tv_mode
vendored
Executable file
27
3rdparty/tellstickcontroller/examples/swap_livingroom_tv_mode
vendored
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Swaps livingroom tv mode on/off
|
||||||
|
#
|
||||||
|
|
||||||
|
led_status=`tellstickController --get livingroom_mythtv_leds`
|
||||||
|
#echo $led_status
|
||||||
|
|
||||||
|
if [ "$led_status" != "on" ]; then
|
||||||
|
# echo on
|
||||||
|
tellstickController --set livingroom_cabinets on
|
||||||
|
tellstickController --set livingroom_mythtv_leds on
|
||||||
|
tellstickController --set livingroom_uplight off
|
||||||
|
tellstickController --set livingroom_wall_north on
|
||||||
|
tellstickController --set livingroom_wall_east off
|
||||||
|
tellstickController --set Livingroom_window on
|
||||||
|
else
|
||||||
|
# echo off
|
||||||
|
tellstickController --set livingroom_cabinets on
|
||||||
|
tellstickController --set livingroom_mythtv_leds off
|
||||||
|
tellstickController --set livingroom_uplight off
|
||||||
|
tellstickController --set livingroom_wall_north on
|
||||||
|
tellstickController --set livingroom_wall_east on
|
||||||
|
tellstickController --set Livingroom_window on
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit
|
||||||
96
3rdparty/tellstickcontroller/examples/tellstickController.conf
vendored
Normal file
96
3rdparty/tellstickcontroller/examples/tellstickController.conf
vendored
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# Configuration file for tellstickController
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Rickard Andersson (ran42ran@gmail.com)
|
||||||
|
# Version: 1.4
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# List of location settings.
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Set Key Value
|
||||||
|
# Set Timezone Europe/Stockholm
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Set Timezone Europe/Stockholm
|
||||||
|
Set Latitude 58.24
|
||||||
|
Set Longitude 15.31
|
||||||
|
Set dbfile /var/lib/tellstickController.db
|
||||||
|
Set pidfile /var/run/tellstickController.pid
|
||||||
|
Set logfile /var/log/tellstickController.log
|
||||||
|
|
||||||
|
|
||||||
|
# Aliases for recevier devices.
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Alias Name Sender Dimmer Protocol Housecode Channel
|
||||||
|
# Alias BedroomWindow /dev/tellstick0 yes Nexa A 1
|
||||||
|
# Alias device42 /dev/tellstick1 No Waveman B 3
|
||||||
|
# or
|
||||||
|
# Usage example:
|
||||||
|
# Alias Name Sender Dimmer Protocol Channel
|
||||||
|
# Alias MythTv_Backlight /dev/ttyUSB0 No Sartano 000000001
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Alias Bedroom_window /dev/tellstick0 No Nexa G 10
|
||||||
|
Alias Bedroom_mythtv_power /dev/tellstick0 No Nexa G 6
|
||||||
|
Alias Bedroom_mythtv_leds /dev/tellstick0 No Nexa G 7
|
||||||
|
Alias Kitchen_cabinets /dev/tellstick0 No Nexa G 2
|
||||||
|
Alias Kitchen_window /dev/tellstick0 No Nexa G 11
|
||||||
|
Alias Livingroom_cabinets /dev/tellstick0 No Nexa G 3
|
||||||
|
Alias Livingroom_wall_north /dev/tellstick0 No Nexa G 4
|
||||||
|
Alias Livingroom_wall_east /dev/tellstick0 No Nexa G 9
|
||||||
|
Alias Livingroom_uplight /dev/tellstick0 Yes Nexa G 5
|
||||||
|
Alias Livingroom_mythtv_leds /dev/tellstick0 No Nexa G 8
|
||||||
|
Alias Livingroom_window /dev/tellstick0 No Nexa G 1
|
||||||
|
Alias Study_window /dev/tellstick0 No Nexa G 12
|
||||||
|
|
||||||
|
|
||||||
|
# Group aliases uses for handling a group of aliases
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Group Name Delay List of Aliases
|
||||||
|
# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east
|
||||||
|
# Group Kitchen 5 Kitchen_cabinets Kitchen_window
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Group Christmas_lights 20 Bedroom_window Kitchen_window Study_window
|
||||||
|
Group Background_lights 60 Kitchen_cabinets Livingroom_window Livingroom_wall_east Livingroom_wall_north
|
||||||
|
Group All_lights 10 Bedroom_mythtv_leds Bedroom_window Kitchen_cabinets Kitchen_window Livingroom_cabinets Livingroom_mythtv_leds Livingroom_uplight Livingroom_wall_north Livingroom_wall_east Livingroom_window Study_window
|
||||||
|
|
||||||
|
|
||||||
|
# Timer rules for reciever devices.
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Rule Alias DeviceOn DeviceOff
|
||||||
|
# Rule BedroomWindow Sunrise Sunrise+01:30
|
||||||
|
# Rule BedroomWindow 18:33 23:10+Random(00:45)
|
||||||
|
# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Rule Background_lights Workweek/Sunset+Random(01:00) Workweek/00:00+Random(00:30)
|
||||||
|
Rule Background_lights Weekend/Sunset-Random(00:30) Weekend/00:45+Random(00:30)
|
||||||
|
|
||||||
|
Rule Christmas_lights 07:00+Random(00:30) 09:00+Random(00:30)
|
||||||
|
Rule Christmas_lights 14:30+Random(00:30) 00:30+Random(00:30)
|
||||||
|
|
||||||
|
Rule Kitchen_cabinets Sunrise-01:30 Sunrise+01:00
|
||||||
|
|
||||||
|
Rule All_lights No 02:00
|
||||||
142
3rdparty/tellstickcontroller/tellstick.conf
vendored
Normal file
142
3rdparty/tellstickcontroller/tellstick.conf
vendored
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
deviceNode = "/dev/tellstick0"
|
||||||
|
|
||||||
|
device {
|
||||||
|
id = 1
|
||||||
|
name = "Bedroom_bed"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100010"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 2
|
||||||
|
name = "Bedroom_window"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100020"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 3
|
||||||
|
name = "Bedroom_mythtv_leds"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100030"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 4
|
||||||
|
name = "Study_window"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100040"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 5
|
||||||
|
name = "Kitchen_cabinets"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100050"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 6
|
||||||
|
name = "Bedroom_dimmer"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-dimmer"
|
||||||
|
parameters {
|
||||||
|
house = "100060"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 7
|
||||||
|
name = "Livingroom_cabinets"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100070"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 8
|
||||||
|
name = "Livingroom_wall_north"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100080"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 9
|
||||||
|
name = "Test"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100090"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 10
|
||||||
|
name = "Livingroom_window"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100100"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 11
|
||||||
|
name = "Kitchen_window"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100110"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 12
|
||||||
|
name = "Livingroom_wall_east"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100120"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 13
|
||||||
|
name = "Livingroom_mythtv_leds"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-switch"
|
||||||
|
parameters {
|
||||||
|
house = "100130"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device {
|
||||||
|
id = 14
|
||||||
|
name = "Livingroom_uplight"
|
||||||
|
protocol = "arctech"
|
||||||
|
model = "selflearning-dimmer"
|
||||||
|
parameters {
|
||||||
|
house = "100140"
|
||||||
|
unit = "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
58
3rdparty/tellstickcontroller/tellstickController
vendored
Executable file
58
3rdparty/tellstickcontroller/tellstickController
vendored
Executable file
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/bin/sh
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# Wrapper script that can be used to select which tellstickController
|
||||||
|
# program to run
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com)
|
||||||
|
# Version 2.0.0
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# How to run tellstickController with tdtool
|
||||||
|
# tellstickController --tdtool --list
|
||||||
|
#
|
||||||
|
# How to run tellstickController with rfcmd
|
||||||
|
# tellstickController --rdfcmd --list
|
||||||
|
#
|
||||||
|
# How to run tellstickController with default program (tdtool or rfcmd)
|
||||||
|
# tellstickController --list
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
--tdtool)
|
||||||
|
shift
|
||||||
|
tellstickControllerTdtool $@
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
--rfcmd)
|
||||||
|
shift
|
||||||
|
tellstickControllerRfcmd $@
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#
|
||||||
|
# Uncomment your choice of default program below
|
||||||
|
#
|
||||||
|
|
||||||
|
# tellstickControllerRfcmd $@
|
||||||
|
tellstickControllerTdtool $@
|
||||||
|
|
||||||
|
exit $?
|
||||||
85
3rdparty/tellstickcontroller/tellstickController.conf
vendored
Normal file
85
3rdparty/tellstickcontroller/tellstickController.conf
vendored
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# Configuration file for tellstickController
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com)
|
||||||
|
# Version: 2.0.0
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# List of location settings.
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Set Key Value
|
||||||
|
#
|
||||||
|
# Set Timezone Europe/Stockholm
|
||||||
|
#
|
||||||
|
Set Timezone Europe/Stockholm
|
||||||
|
Set Altitude -0.833
|
||||||
|
Set Latitude 58.24
|
||||||
|
Set Longitude 15.31
|
||||||
|
Set dbfile /var/lib/tellstickController.db
|
||||||
|
Set pidfile /var/run/tellstickController.pid
|
||||||
|
Set logfile /var/log/tellstickController.log
|
||||||
|
|
||||||
|
|
||||||
|
# Aliases for recevier devices.
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Alias Name Sender Dimmer Protocol Housecode Channel
|
||||||
|
#
|
||||||
|
# Alias BedroomWindow /dev/tellstick0 yes Nexa A 1
|
||||||
|
# Alias device42 /dev/tellstick1 No Waveman B 3
|
||||||
|
#
|
||||||
|
# or
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Alias Name Sender Dimmer Protocol Channel
|
||||||
|
#
|
||||||
|
# Alias MythTv_Backlight /dev/ttyUSB0 No Sartano 000000001
|
||||||
|
#
|
||||||
|
Alias device1 /dev/tellstick No Nexa A 1
|
||||||
|
Alias device2 /dev/tellstick No Nexa A 2
|
||||||
|
|
||||||
|
|
||||||
|
# Groups used for handling a list of aliases.
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Group Name Delay Aliases
|
||||||
|
# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east
|
||||||
|
# Group Kitchen 5 Kitchen_cabinets Kitchen_window
|
||||||
|
#
|
||||||
|
Group allDevices 10 Device1 Device2
|
||||||
|
|
||||||
|
|
||||||
|
# Timer rules for reciever devices.
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Rule Alias DeviceOn DeviceOff
|
||||||
|
#
|
||||||
|
# Rule BedroomWindow Sunrise Sunrise+01:30
|
||||||
|
# Rule BedroomWindow 18:33 23:10+Random(00:45)
|
||||||
|
# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset
|
||||||
|
# Rule device42 2008-03-##/18:45 2008-03-##/22:11
|
||||||
|
# Rule device42 No 02:00
|
||||||
|
#
|
||||||
|
Rule device1 weekend/sunrise weekend/08:45
|
||||||
|
Rule device1 sunset+00:15 23:30+Random(00:20)
|
||||||
|
Rule device2 Workweek/07:00+Dimmer(00:02,0,200,25) weekend/08:45
|
||||||
|
Rule allDevices 16:45 23:45
|
||||||
|
|
||||||
1083
3rdparty/tellstickcontroller/tellstickControllerRfcmd
vendored
Executable file
1083
3rdparty/tellstickcontroller/tellstickControllerRfcmd
vendored
Executable file
File diff suppressed because it is too large
Load diff
108
3rdparty/tellstickcontroller/tellstickControllerRfcmd.conf
vendored
Normal file
108
3rdparty/tellstickcontroller/tellstickControllerRfcmd.conf
vendored
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# Configuration file for tellstickController
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Rickard Andersson (ran42ran@gmail.com)
|
||||||
|
# Version: 1.4
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# List of location settings.
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Set Key Value
|
||||||
|
# Set Timezone Europe/Stockholm
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Set Timezone Europe/Stockholm
|
||||||
|
Set Altitude -0.833
|
||||||
|
Set Latitude 58.24
|
||||||
|
Set Longitude 15.31
|
||||||
|
Set dbfile /var/lib/tellstickController.db
|
||||||
|
Set pidfile /var/run/tellstickController.pid
|
||||||
|
Set logfile /var/log/tellstickController.log
|
||||||
|
set progrsm /usr/bin/rfcmd
|
||||||
|
|
||||||
|
|
||||||
|
# Aliases for recevier devices.
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Alias Name Sender Dimmer Protocol Housecode Channel
|
||||||
|
# Alias BedroomWindow /dev/tellstick0 yes Nexa A 1
|
||||||
|
# Alias device42 /dev/tellstick1 No Waveman B 3
|
||||||
|
# or
|
||||||
|
# Usage example:
|
||||||
|
# Alias Name Sender Dimmer Protocol Channel
|
||||||
|
# Alias MythTv_Backlight /dev/ttyUSB0 No Sartano 000000001
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Alias Bedroom_bed /dev/tellstick0 No Nexa G 11
|
||||||
|
Alias Bedroom_window /dev/tellstick0 No Nexa G 10
|
||||||
|
Alias Bedroom_mythtv_power /dev/tellstick0 No Nexa G 6
|
||||||
|
Alias Bedroom_mythtv_leds /dev/tellstick0 No Nexa G 7
|
||||||
|
Alias Kitchen_cabinets /dev/tellstick0 No Nexa G 2
|
||||||
|
Alias Kitchen_window /dev/tellstick0 No Nexa G 12
|
||||||
|
Alias Livingroom_cabinets /dev/tellstick0 No Nexa G 3
|
||||||
|
Alias Livingroom_wall_north /dev/tellstick0 No Nexa G 4
|
||||||
|
Alias Livingroom_wall_east /dev/tellstick0 No Nexa G 9
|
||||||
|
Alias Livingroom_uplight /dev/tellstick0 Yes Nexa G 5
|
||||||
|
Alias Livingroom_mythtv_leds /dev/tellstick0 No Nexa G 8
|
||||||
|
Alias Livingroom_window /dev/tellstick0 No Nexa G 1
|
||||||
|
Alias Study_window /dev/tellstick0 No Nexa G 13
|
||||||
|
|
||||||
|
|
||||||
|
# Group aliases uses for handling a group of aliases
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Group Name Delay List of Aliases
|
||||||
|
# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east
|
||||||
|
# Group Kitchen 5 Kitchen_cabinets Kitchen_window
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Group Normal_lights 120 Bedroom_window Kitchen_cabinets Kitchen_window Livingroom_window Livingroom_wall_east Study_window
|
||||||
|
Group Extra_lights 180 Livingroom_cabinets Livingroom_uplight Livingroom_wall_north
|
||||||
|
Group All_lights 10 Bedroom_mythtv_leds Bedroom_window Bedroom_bed Kitchen_cabinets Kitchen_window Livingroom_cabinets Livingroom_mythtv_leds Livingroom_uplight Livingroom_wall_north Livingroom_wall_east Livingroom_window Study_window
|
||||||
|
Group Christmas_lights 60 Bedroom_window Kitchen_window Study_window
|
||||||
|
|
||||||
|
|
||||||
|
# Timer rules for reciever devices.
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Rule Alias DeviceOn DeviceOff
|
||||||
|
# Rule BedroomWindow Sunrise Sunrise+01:30
|
||||||
|
# Rule BedroomWindow 18:33 23:10+Random(00:45)
|
||||||
|
# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Rule Normal_lights Workweek/Sunset-01:00+Random(00:50) Workweek/00:01+Random(00:50)
|
||||||
|
Rule Normal_lights Weekend/Sunset-01:00+Random(00:50) Weekend/00:01+Random(00:50)
|
||||||
|
|
||||||
|
Rule Extra_lights No 00:15+Random(00:30)
|
||||||
|
|
||||||
|
Rule All_lights No 02:00
|
||||||
|
Rule All_lights No 03:00
|
||||||
|
|
||||||
|
#Rule Bedroom_window Workweek/07:30 Workweek/08:30
|
||||||
|
|
||||||
|
#Rule Christmas_lights 07:00+Random(00:15) 10:00+Random(00:30)
|
||||||
|
#Rule Christmas_lights 15:00+Random(00:30) 00:30+Random(00:15)
|
||||||
|
|
||||||
|
#Rule Livingroom_cabinets 18:55+Random(01:00) 21:55+Random(01:00)
|
||||||
|
#Rule Livingroom_wall_north 19:55+Random(01:00) 20:55+Random(01:00)
|
||||||
|
#Rule Bedroom_bed 20:55+Random(01:00) 22:55+Random(01:00)
|
||||||
|
|
||||||
1133
3rdparty/tellstickcontroller/tellstickControllerTdtool
vendored
Executable file
1133
3rdparty/tellstickcontroller/tellstickControllerTdtool
vendored
Executable file
File diff suppressed because it is too large
Load diff
89
3rdparty/tellstickcontroller/tellstickControllerTdtool.conf
vendored
Normal file
89
3rdparty/tellstickcontroller/tellstickControllerTdtool.conf
vendored
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# Configuration file for tellstickController
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com)
|
||||||
|
# Version: 2.0
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# List of location settings
|
||||||
|
#
|
||||||
|
# Usage example:
|
||||||
|
# Set Key Value
|
||||||
|
# Set Timezone Europe/Stockholm
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Set Timezone Europe/Stockholm
|
||||||
|
Set Altitude -0.833
|
||||||
|
Set Latitude 58.24
|
||||||
|
Set Longitude 15.31
|
||||||
|
|
||||||
|
Set pidfile /var/run/tellstickController.pid
|
||||||
|
Set logfile /var/log/tellstickController.log
|
||||||
|
Set program /usr/bin/tdtool
|
||||||
|
|
||||||
|
|
||||||
|
# Group aliases uses for handling a group of devices
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Group Name Delay List of devices
|
||||||
|
# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east
|
||||||
|
# Group Kitchen 5 Kitchen_cabinets Kitchen_window
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Group Normal_lights 120 Bedroom_window Kitchen_cabinets Kitchen_window Livingroom_window Livingroom_wall_east Study_window
|
||||||
|
|
||||||
|
Group Extra_lights 180 Livingroom_cabinets Livingroom_uplight Livingroom_wall_north
|
||||||
|
|
||||||
|
Group All_lights 10 Bedroom_mythtv_leds Bedroom_window Bedroom_bed Kitchen_cabinets Kitchen_window Livingroom_cabinets Livingroom_mythtv_leds Livingroom_uplight Livingroom_wall_north Livingroom_wall_east Livingroom_window Study_window
|
||||||
|
|
||||||
|
#Group Christmas_lights 60 Bedroom_window Kitchen_window Study_window
|
||||||
|
|
||||||
|
#Group dimmers 60 testDimmer test
|
||||||
|
|
||||||
|
|
||||||
|
# Timer rules for devices
|
||||||
|
#
|
||||||
|
# Usage examples:
|
||||||
|
# Rule Alias DeviceOn DeviceOff
|
||||||
|
# Rule LivingroomWindow Sunrise Sunrise+01:30
|
||||||
|
# Rule LivingroomWindow 18:33 23:10+Random(00:45)
|
||||||
|
# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset
|
||||||
|
# Rule BedroomDimmer 07:00+Dimmer(00:01,5,255,25) 08:00
|
||||||
|
#
|
||||||
|
#
|
||||||
|
Rule Normal_lights Workweek/Sunset-01:00+Random(00:50) Workweek/00:01+Random(00:50)
|
||||||
|
Rule Normal_lights Weekend/Sunset-01:00+Random(00:50) Weekend/00:01+Random(00:50)
|
||||||
|
|
||||||
|
Rule Extra_lights No 00:15+Random(00:30)
|
||||||
|
|
||||||
|
Rule All_lights No 02:00
|
||||||
|
Rule All_lights No 03:00
|
||||||
|
|
||||||
|
#Rule Bedroom_window Workweek/07:30 Workweek/08:30
|
||||||
|
|
||||||
|
#Rule Christmas_lights 07:00+Random(00:15) 10:00+Random(00:30)
|
||||||
|
#Rule Christmas_lights 15:00+Random(00:30) 00:30+Random(00:15)
|
||||||
|
|
||||||
|
#Rule Livingroom_cabinets 18:55+Random(01:00) 21:55+Random(01:00)
|
||||||
|
#Rule Livingroom_wall_north 19:55+Random(01:00) 20:55+Random(01:00)
|
||||||
|
#Rule Bedroom_bed 20:55+Random(01:00) 22:55+Random(01:00)
|
||||||
|
|
||||||
|
#Rule testDimmer 22:00+Dimmer(00:01,5,255,50) Sunrise+Dimmer(00:01,5,250,25)
|
||||||
|
#Rule dimmers No 23:00+Dimmer(00:01,250,0,50)
|
||||||
674
3rdparty/tellstickd/LICENSE
vendored
Normal file
674
3rdparty/tellstickd/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,674 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||||
46
3rdparty/tellstickd/README
vendored
Normal file
46
3rdparty/tellstickd/README
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
General
|
||||||
|
=================
|
||||||
|
This software is intended for controlling remote switch devices with rfcmd.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
=================
|
||||||
|
For this script to run you need perl and the following perl-modules:
|
||||||
|
DateTime
|
||||||
|
DateTime::Event::Sunrise
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
=================
|
||||||
|
0. Install rfcmd and necessary perl modules (on a typical Fedora/Centos/RHEL with the necessary repos installed, this should do it for you: yum install perl-DateTime perl-DateTime-Event-Sunrise).
|
||||||
|
|
||||||
|
1. Copy the file tellstickd-version/tellstickd to /usr/local/bin/ (or anywhere else depending on your wishes).
|
||||||
|
|
||||||
|
2. Copy the file tellstickd-version/tellstickd.conf to /etc/ (or anywhere else depending on your wishes).
|
||||||
|
|
||||||
|
3. Copy the suitable init script found under tellstickd-version/init_script to /etc/rc.d/init.d, this way you can control the script as any other service, easily make it start at boot (with chkconfig --level 35 tellstickd on). The file init_script/tellstickd is a Redhat type script whereas init_script/tellstickd.debian not unexpectedly should work on Debian type systems.
|
||||||
|
4. Remember to make the perl-script and init-script executable. As root chmod 755 /usr/local/bin/tellstickd /etc/rc.d/init.d/tellstickd
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=================
|
||||||
|
1. In tellstickd.conf:
|
||||||
|
a. Set appropriate coordinates and timezone to suit your geographical location (further information: http://search.cpan.org/dist/DateTime-Event-Sunrise/lib/DateTime/Event/Sunrise.pm).
|
||||||
|
b. Specifiy the rfcmd-binary location. Default: /usr/local/bin/rfcmd
|
||||||
|
c. Specify the tellstick device name. Default: /dev/tellstick
|
||||||
|
d. Specify the location of the logfile.
|
||||||
|
e. Add device configurations. Multiple definitions for each device are possible (avoid having on and off times of multiple definitions overlapping each other).
|
||||||
|
|
||||||
|
2. If you would like this script to start at boot-time, on a RHEL/Centos/Fedora system, execute the following command chkconfig --level 35 tellstickd on
|
||||||
|
|
||||||
|
|
||||||
|
Licensing
|
||||||
|
=================
|
||||||
|
This software is freely distributable under the GNU General Public License,
|
||||||
|
the full content of the license is included in the file LICENSE.
|
||||||
|
Bug reports are welcome, but even more appreciated are patches with the solution to the problem.
|
||||||
|
|
||||||
|
Authors
|
||||||
|
=================
|
||||||
|
Magnus Juntti
|
||||||
|
mjuntti@gmail.com
|
||||||
|
|
||||||
|
Anders Betnér
|
||||||
84
3rdparty/tellstickd/init_script/tellstickd
vendored
Executable file
84
3rdparty/tellstickd/init_script/tellstickd
vendored
Executable file
|
|
@ -0,0 +1,84 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Init file for tellstickd remote light switch daemon
|
||||||
|
#
|
||||||
|
# Written by Magnus Juntti
|
||||||
|
#
|
||||||
|
# chkconfig: 35 54 46
|
||||||
|
# description: tellstickd remote light switch daemon
|
||||||
|
#
|
||||||
|
# processname: tellstickd
|
||||||
|
# config: /etc/tellstickd.conf
|
||||||
|
# pidfile: /var/run/tellstick
|
||||||
|
|
||||||
|
source /etc/rc.d/init.d/functions
|
||||||
|
|
||||||
|
EXECUTABLE="/usr/bin/tellstickd"
|
||||||
|
CONFIG_FILE="/etc/tellstickd.conf"
|
||||||
|
OPTIONS=""
|
||||||
|
|
||||||
|
[ -x $EXECUTABLE ] || exit 1
|
||||||
|
[ -r $CONFIG_FILE ] || exit 1
|
||||||
|
|
||||||
|
RETVAL=0
|
||||||
|
prog="tellstickd"
|
||||||
|
desc="remote switch daemon"
|
||||||
|
|
||||||
|
start() {
|
||||||
|
echo -n $"Starting $desc ($prog): "
|
||||||
|
daemon --user root $prog --daemon --config $CONFIG_FILE $OPTIONS
|
||||||
|
RETVAL=$?
|
||||||
|
echo
|
||||||
|
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
|
||||||
|
return $RETVAL
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
echo -n $"Shutting down $desc ($prog): "
|
||||||
|
killproc $prog
|
||||||
|
RETVAL=$?
|
||||||
|
echo
|
||||||
|
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
|
||||||
|
return $RETVAL
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
echo -n $"Reloading $desc ($prog): "
|
||||||
|
killproc $prog -HUP
|
||||||
|
RETVAL=$?
|
||||||
|
echo
|
||||||
|
return $RETVAL
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
start
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
stop
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
restart
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
reload
|
||||||
|
;;
|
||||||
|
condrestart)
|
||||||
|
[ -e /var/lock/subsys/$prog ] && restart
|
||||||
|
RETVAL=$?
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status $prog
|
||||||
|
RETVAL=$?
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
|
||||||
|
RETVAL=1
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit $RETVAL
|
||||||
75
3rdparty/tellstickd/init_script/tellstickd.debian
vendored
Executable file
75
3rdparty/tellstickd/init_script/tellstickd.debian
vendored
Executable file
|
|
@ -0,0 +1,75 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Init file for tellstickd remote light switch daemon
|
||||||
|
#
|
||||||
|
# Written by Magnus Juntti
|
||||||
|
#
|
||||||
|
# chkconfig: 35 54 46
|
||||||
|
# description: tellstickd remote light switch daemon
|
||||||
|
#
|
||||||
|
# processname: tellstickd
|
||||||
|
# config: /etc/tellstickd.conf
|
||||||
|
# pidfile: /var/run/tellstick
|
||||||
|
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
DAEMON="/usr/local/bin/tellstickd"
|
||||||
|
NAME="tellstickd"
|
||||||
|
CONFIG_FILE="/etc/tellstickd.conf"
|
||||||
|
PID_FILE="/var/run/tellstickd.pid"
|
||||||
|
OPTIONS=""
|
||||||
|
|
||||||
|
[ -x $DAEMON ] || exit 1
|
||||||
|
[ -r $CONFIG_FILE ] || exit 1
|
||||||
|
|
||||||
|
|
||||||
|
RETVAL=0
|
||||||
|
prog="tellstickd"
|
||||||
|
desc="remote switch daemon"
|
||||||
|
|
||||||
|
start() {
|
||||||
|
log_begin_msg "Starting $desc ($prog): "
|
||||||
|
start-stop-daemon --start --quiet --pidfile "$PID_FILE" --name $NAME --exec $DAEMON -- --daemon --config $CONFIG_FILE $OPTIONS
|
||||||
|
log_end_msg $?
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
log_begin_msg "Shutting down $desc ($prog): "
|
||||||
|
start-stop-daemon --stop --quiet --pidfile "$PID_FILE" --name $NAME
|
||||||
|
log_end_msg $?
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
restart
|
||||||
|
# the daemon doesn't reacto to sig HUP, so just restart it
|
||||||
|
# log_begin_msg "Reloading $desc ($prog): "
|
||||||
|
# start-stop-daemon --stop --quiet --pidfile "$PID_FILE" --name $NAME --signal 1
|
||||||
|
# log_end_msg $?
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
start
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
stop
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
restart
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
reload
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo $"Usage: $0 {start|stop|restart|reload}"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
850
3rdparty/tellstickd/tellstickd
vendored
Executable file
850
3rdparty/tellstickd/tellstickd
vendored
Executable file
|
|
@ -0,0 +1,850 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use POSIX;
|
||||||
|
use DateTime;
|
||||||
|
use DateTime::Event::Sunrise;
|
||||||
|
use Time::Local;
|
||||||
|
use strict;
|
||||||
|
use sigtrap 'handler', \&daemon_exit, 'normal-signals';
|
||||||
|
|
||||||
|
# The following variables should be adapted to your geographical location and system setup
|
||||||
|
my $LATITUDE = "65.603"; # 65.603N 22.18W -> Luleå, Sweden
|
||||||
|
my $LONGITUDE = "22.18";
|
||||||
|
my $TIMEZONE = "Europe/Stockholm";
|
||||||
|
my $RFCMD = "/usr/local/bin/rfcmd";
|
||||||
|
my $TELLSTICK_DEVICE = "/dev/tellstick";
|
||||||
|
my $CONFIG_FILE = "/etc/tellstickd.conf";
|
||||||
|
my $LOG_FILE = "/var/log/tellstickd";
|
||||||
|
my $pidFile = '/var/run/tellstickd.pid';
|
||||||
|
|
||||||
|
|
||||||
|
# You should not need to go beyond this point (unless you have found a bug or need to improve the functionality).
|
||||||
|
my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
|
||||||
|
my @weekDays = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
|
||||||
|
my $NO = 0;
|
||||||
|
my $YES = 1;
|
||||||
|
my @device_cfg;
|
||||||
|
my $conf_file = "";
|
||||||
|
my $make_daemon = $NO;
|
||||||
|
my $simulate = $NO;
|
||||||
|
my $n_rfcmd_calls;
|
||||||
|
my $current_time;
|
||||||
|
my $number_of_rules;
|
||||||
|
my $Day;
|
||||||
|
my $Month;
|
||||||
|
my $Year;
|
||||||
|
my $Minute;
|
||||||
|
my $Hour;
|
||||||
|
my $Second;
|
||||||
|
my $WeekDay;
|
||||||
|
my $DayOfYear;
|
||||||
|
my $IsDST;
|
||||||
|
my $daylightSavings;
|
||||||
|
my $dayOfYear;
|
||||||
|
my $dayOfWeek;
|
||||||
|
my $dayOfMonth;
|
||||||
|
|
||||||
|
my $PROGRAM_NAME = "tellstickd";
|
||||||
|
my $VERSION = "0.6.3";
|
||||||
|
|
||||||
|
# Structure of the configurations to be read;
|
||||||
|
# $device_cfg[$i][0]; # Protocol, only NEXA, WAVEMAN and SARTANO supported so far by rfcmd
|
||||||
|
# $device_cfg[$i][1]; # Housecode A-P
|
||||||
|
# $device_cfg[$i][2]; # Channel 1-3
|
||||||
|
# $device_cfg[$i][3]; # On time
|
||||||
|
# $device_cfg[$i][4]; # Off time
|
||||||
|
# $device_cfg[$i][5]; # Off when bright, 0 = no, 1 = yes
|
||||||
|
# $device_cfg[$i][6]; # Off when bright delay
|
||||||
|
# $device_cfg[$i][7]; # Time in advance when getting dark
|
||||||
|
# $device_cfg[$i][8]; # On time random interval
|
||||||
|
# $device_cfg[$i][9]; # Off time random interval
|
||||||
|
# $device_cfg[$i][10]; # Rule active these days [11234567], 1=monday, ... 7=sunday.
|
||||||
|
# $device_cfg[$i][20]; # Sunrise off time, calculated in this program and stored here
|
||||||
|
# $device_cfg[$i][21]; # Sunset on time, calculated in this program and stored here
|
||||||
|
# $device_cfg[$i][22]; # Switch state, 0 = off, 1 = on
|
||||||
|
# $device_cfg[$i][23]; # Original on time
|
||||||
|
# $device_cfg[$i][24]; # Original off time
|
||||||
|
|
||||||
|
sub daemonize {
|
||||||
|
chdir '/' or die "$PROGRAM_NAME: Can't chdir to /: $!";
|
||||||
|
open STDIN, '/dev/null' or die "$PROGRAM_NAME: Can't read /dev/null: $!";
|
||||||
|
#open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
|
||||||
|
#open STDERR, '>/dev/null' or die "$PROGRAM_NAME: Can't write to /dev/null: $!";
|
||||||
|
defined(my $pid = fork) or die "$PROGRAM_NAME: Can't fork: $!";
|
||||||
|
exit if $pid;
|
||||||
|
setsid or die "$PROGRAM_NAME: Can't start a new session: $!";
|
||||||
|
umask 0;
|
||||||
|
}
|
||||||
|
sub daemon_exit() {
|
||||||
|
# Remove pidfile
|
||||||
|
unlink $pidFile;
|
||||||
|
# Since tellstickd most probably is stuck sleeping just kill ourself
|
||||||
|
kill('TERM', $$);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
sub get_sunrise_time
|
||||||
|
{
|
||||||
|
my $sunrise_time;
|
||||||
|
|
||||||
|
($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time);
|
||||||
|
$Year += 1900;
|
||||||
|
|
||||||
|
# Note, localtime returns months 0..11, Datetime->new expects months 1..12.
|
||||||
|
my $dt = DateTime->new( year => $Year, month => $Month+1, day => $Day, time_zone => $TIMEZONE, );
|
||||||
|
my $sunrise = DateTime::Event::Sunrise ->new( longitude => $LONGITUDE, latitude => $LATITUDE, altitude => '-0.833', iteration => '1');
|
||||||
|
|
||||||
|
my $dt1 = $sunrise->sunrise_datetime($dt);
|
||||||
|
|
||||||
|
($sunrise_time) = $dt1->datetime =~ /T(.*)\:/;
|
||||||
|
|
||||||
|
return $sunrise_time
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_sunset_time
|
||||||
|
{
|
||||||
|
my $sunset_time;
|
||||||
|
|
||||||
|
($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time);
|
||||||
|
$Year += 1900;
|
||||||
|
|
||||||
|
# Note, localtime returns months 0..11, Datetime->new expects months 1..12.
|
||||||
|
my $dt = DateTime->new( year => $Year, month => $Month+1, day => $Day, time_zone => $TIMEZONE, );
|
||||||
|
my $sunrise = DateTime::Event::Sunrise ->new( longitude => $LONGITUDE, latitude => $LATITUDE, altitude => '-0.833', iteration => '1');
|
||||||
|
|
||||||
|
my $dt2 = $sunrise->sunset_datetime($dt);
|
||||||
|
|
||||||
|
($sunset_time) = $dt2->datetime =~ /T(.*)\:/;
|
||||||
|
|
||||||
|
return $sunset_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if $current_time is inbetween argument 1 ($time1) and argument 2 ($time2)
|
||||||
|
sub is_inbetween_times
|
||||||
|
{
|
||||||
|
my $time1 = $_[0];
|
||||||
|
my $time2 = $_[1];
|
||||||
|
my $curr_time = $_[2];
|
||||||
|
|
||||||
|
$curr_time =~ s/://g;
|
||||||
|
$time1 =~ s/://g;
|
||||||
|
$time2 =~ s/://g;
|
||||||
|
$curr_time =~ s/^0*//;
|
||||||
|
$time1 =~ s/^0*//;
|
||||||
|
$time2 =~ s/^0*//;
|
||||||
|
|
||||||
|
# If we pass midnight, the following has to be checked/done
|
||||||
|
if ($time2 <= $time1) {
|
||||||
|
if ($curr_time >= $time1 && $curr_time < 2400 || $curr_time >= 0000 && $curr_time < $time2) {
|
||||||
|
return $YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# The following applies to the most common rules within a day.
|
||||||
|
else {
|
||||||
|
if ($curr_time >= $time1 && $curr_time < $time2) {
|
||||||
|
return $YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub rfcmd_exec {
|
||||||
|
my $device_id = $_[0];
|
||||||
|
my $action = $_[1];
|
||||||
|
my $RFCMD_OPTIONS;
|
||||||
|
|
||||||
|
if ($device_cfg[$device_id][0] eq "SARTANO") {
|
||||||
|
$RFCMD_OPTIONS = "$TELLSTICK_DEVICE $device_cfg[$device_id][0] $device_cfg[$device_id][1]";
|
||||||
|
}
|
||||||
|
elsif ($device_cfg[$device_id][0] eq "NEXA" || $device_cfg[$device_id][0] eq "WAVEMAN") {
|
||||||
|
$RFCMD_OPTIONS = "$TELLSTICK_DEVICE $device_cfg[$device_id][0] $device_cfg[$device_id][1] $device_cfg[$device_id][2]";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die("$PROGRAM_NAME: Device $device_id has an unknown protocol. Only NEXA, WAVEMAN and SARTANO allowed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Action = 1 means turn device on, 0 turn device off
|
||||||
|
if ($action == 1) {
|
||||||
|
# Only turn the device on if it is not already turned on to avoid flashing dimmers.
|
||||||
|
# and check that it is not disabled by on/off time set to -1 in the config file
|
||||||
|
if ($device_cfg[$device_id][22] == 0 && $device_cfg[$device_id][23] != -1) {
|
||||||
|
printf("$PROGRAM_NAME: Time is $current_time. Switching on $device_cfg[$device_id][0] device $device_cfg[$device_id][1]$device_cfg[$device_id][2].\n");
|
||||||
|
if ($simulate == $NO) {
|
||||||
|
`$RFCMD $RFCMD_OPTIONS 1`;
|
||||||
|
}
|
||||||
|
$device_cfg[$device_id][22] = 1;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elsif ($action == 0) {
|
||||||
|
if ($device_cfg[$device_id][22] == 1 && $device_cfg[$device_id][24] != -1) {
|
||||||
|
printf("$PROGRAM_NAME: Time is $current_time. Switching off $device_cfg[$device_id][0] device $device_cfg[$device_id][1]$device_cfg[$device_id][2].\n");
|
||||||
|
if ($simulate == $NO) {
|
||||||
|
`$RFCMD $RFCMD_OPTIONS 0`;
|
||||||
|
}
|
||||||
|
$device_cfg[$device_id][22] = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Time format xx:yy for input parameters argument1 has to be positive, argument2 can be positive or negative
|
||||||
|
sub add_time
|
||||||
|
{
|
||||||
|
my $time1 = $_[0];
|
||||||
|
my $time2 = $_[1];
|
||||||
|
my $multiplier = 1;
|
||||||
|
my $hour;
|
||||||
|
my $min;
|
||||||
|
my $time1_hour;
|
||||||
|
my $time1_minute;
|
||||||
|
my $time2_hour;
|
||||||
|
my $time2_minute;
|
||||||
|
my $time1_epoch_seconds;
|
||||||
|
my $time2_offset_seconds;
|
||||||
|
|
||||||
|
($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time);
|
||||||
|
$Year += 1900;
|
||||||
|
|
||||||
|
(my $sign) = $time2 =~ /^(.*?)[0-9]/;
|
||||||
|
($time1_hour, $time1_minute) = $time1 =~ /(.*)\:(.*)/;
|
||||||
|
# Remove any leading signs
|
||||||
|
$time2 =~ s/^-?//g;
|
||||||
|
($time2_hour, $time2_minute) = $time2 =~ /(.*)\:(.*)/;
|
||||||
|
|
||||||
|
if ($sign eq "-") {
|
||||||
|
$multiplier = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$time1_epoch_seconds = timelocal(0,$time1_minute,$time1_hour, $Day, $Month, $Year);
|
||||||
|
$time2_offset_seconds = 3600*$time2_hour + 60*$time2_minute;
|
||||||
|
|
||||||
|
my $result_seconds = $time1_epoch_seconds + $multiplier*$time2_offset_seconds;
|
||||||
|
|
||||||
|
($min,$hour)= (localtime($result_seconds))[1,2];
|
||||||
|
|
||||||
|
return sprintf("%02d:%02d", $hour, $min);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Time format xx:yy for input parameters
|
||||||
|
sub subtract_time
|
||||||
|
{
|
||||||
|
my $time1 = $_[0];
|
||||||
|
my $time2 = $_[1];
|
||||||
|
my $multiplier = 1;
|
||||||
|
my $hour;
|
||||||
|
my $min;
|
||||||
|
my $time1_hour;
|
||||||
|
my $time1_minute;
|
||||||
|
my $time2_hour;
|
||||||
|
my $time2_minute;
|
||||||
|
my $time1_epoch_seconds;
|
||||||
|
my $time2_offset_seconds;
|
||||||
|
|
||||||
|
($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time);
|
||||||
|
$Year += 1900;
|
||||||
|
|
||||||
|
(my $sign) = $time2 =~ /^(.*?)[0-9]/;
|
||||||
|
($time1_hour, $time1_minute) = $time1 =~ /(.*)\:(.*)/;
|
||||||
|
# Remove any leading signs
|
||||||
|
$time2 =~ s/^-?//g;
|
||||||
|
($time2_hour, $time2_minute) = $time2 =~ /(.*)\:(.*)/;
|
||||||
|
|
||||||
|
if ($sign eq "-") {
|
||||||
|
$multiplier = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$time1_epoch_seconds = timelocal(0,$time1_minute,$time1_hour, $Day, $Month, $Year);
|
||||||
|
$time2_offset_seconds = 3600*$time2_hour + 60*$time2_minute;
|
||||||
|
|
||||||
|
my $result_seconds = $time1_epoch_seconds - $multiplier*$time2_offset_seconds;
|
||||||
|
|
||||||
|
($min,$hour)= (localtime($result_seconds))[1,2];
|
||||||
|
|
||||||
|
return sprintf("%02d:%02d", $hour, $min);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub randomize_on
|
||||||
|
{
|
||||||
|
my $device_id = $_[0];
|
||||||
|
|
||||||
|
# If the on- and off times are the same, just return
|
||||||
|
if ($device_cfg[$device_id][23] eq $device_cfg[$device_id][24]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(my $random_hour, my $random_minute) = $device_cfg[$device_id][8] =~ /(.*)\:(.*)/;
|
||||||
|
|
||||||
|
my $rand_res = int(rand(60 * $random_hour + $random_minute));
|
||||||
|
|
||||||
|
my $rand_res_hour = floor($rand_res / 60);
|
||||||
|
my $rand_res_minute = $rand_res - 60*$rand_res_hour;
|
||||||
|
|
||||||
|
# Here we have the random offset in format xx:yy
|
||||||
|
my $random_time = sprintf("%02d:%02d", $rand_res_hour, $rand_res_minute);
|
||||||
|
|
||||||
|
$device_cfg[$device_id][3] = add_time($device_cfg[$device_id][23], $random_time);
|
||||||
|
|
||||||
|
if (is_inbetween_times($device_cfg[$device_id][23], $device_cfg[$device_id][24], $device_cfg[$device_id][3]) == $NO) {
|
||||||
|
randomize_on($device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub randomize_off
|
||||||
|
{
|
||||||
|
my $device_id = $_[0];
|
||||||
|
|
||||||
|
# If the on- and off times are the same, just return
|
||||||
|
if ($device_cfg[$device_id][23] eq $device_cfg[$device_id][24]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(my $random_hour, my $random_minute) = $device_cfg[$device_id][9] =~ /(.*)\:(.*)/;
|
||||||
|
|
||||||
|
my $rand_res = int(rand(60 * $random_hour + $random_minute));
|
||||||
|
|
||||||
|
my $rand_res_hour = floor($rand_res / 60);
|
||||||
|
my $rand_res_minute = $rand_res - 60*$rand_res_hour;
|
||||||
|
|
||||||
|
# Here we have the random offset in format xx:yy
|
||||||
|
my $random_time = sprintf("%02d:%02d", $rand_res_hour, $rand_res_minute);
|
||||||
|
|
||||||
|
$device_cfg[$device_id][4] = add_time($device_cfg[$device_id][24], $random_time);
|
||||||
|
|
||||||
|
if (is_inbetween_times($device_cfg[$device_id][23], $device_cfg[$device_id][24], $device_cfg[$device_id][4]) == $YES) {
|
||||||
|
randomize_off($device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Time format sanity check routine
|
||||||
|
sub is_time_format_correct
|
||||||
|
{
|
||||||
|
my $time = $_[0];
|
||||||
|
(my $hour, my $minute) = $time =~ /^-?(\d\d)\:(\d\d)$/;
|
||||||
|
|
||||||
|
if ($hour && $minute) {
|
||||||
|
if ($hour >= 0 && $hour <= 23 && $minute >= 0 && $minute <= 59) {
|
||||||
|
return $YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Time format sanity check routine
|
||||||
|
sub is_rule_valid_today
|
||||||
|
{
|
||||||
|
my $device_id = $_[0];
|
||||||
|
my $now = $_[1];
|
||||||
|
my $rule = $device_cfg[$device_id][10];
|
||||||
|
|
||||||
|
(my $week_rule) = $rule =~/^([e|o])/;
|
||||||
|
if ($week_rule) {
|
||||||
|
my $is_odd_week = ($now->week_number % 2);
|
||||||
|
if (($is_odd_week && ($week_rule eq "e")) ||
|
||||||
|
(!$is_odd_week && ($week_rule eq "o"))) {
|
||||||
|
return $NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
my $day_of_week = $now->day_of_week;
|
||||||
|
if ($rule =~ /$day_of_week/) {
|
||||||
|
return $YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ugly hack, but we have to get the log_file option from the config file
|
||||||
|
# before parsing the config file
|
||||||
|
sub get_config_log_file_param
|
||||||
|
{
|
||||||
|
my $input_file = $_[0];
|
||||||
|
open(CFG_FILE, "<$input_file") or die "$PROGRAM_NAME: Could not access config file: $conf_file\n";
|
||||||
|
|
||||||
|
while ($_ = <CFG_FILE>) {
|
||||||
|
chomp($_);
|
||||||
|
(my $value) = $_ =~ /^log_file\s*=\s*([a-zA-Z0-9_\/\.]*)/;
|
||||||
|
if ($value) {
|
||||||
|
close(CFG_FILE);
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(CFG_FILE);
|
||||||
|
return $NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub read_config
|
||||||
|
{
|
||||||
|
my $input_file = $_[0];
|
||||||
|
my @inrad;
|
||||||
|
my $on_interval_end;
|
||||||
|
my $off_interval_end;
|
||||||
|
|
||||||
|
printf("$PROGRAM_NAME: Reading configuration file $conf_file...\n");
|
||||||
|
|
||||||
|
open(CFG_FILE, "<$input_file") or die "$PROGRAM_NAME: Could not access config file: $conf_file\n";
|
||||||
|
|
||||||
|
my $i = 0;
|
||||||
|
my $conf_row = 0;
|
||||||
|
while ($_ = <CFG_FILE>) {
|
||||||
|
$conf_row++;
|
||||||
|
if ($_ =~ /^[\#|\s|\n]/) {
|
||||||
|
# skip lines beginning with # or space or just a new line
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($_ =~ /^[NEXA|WAVEMAN|SARTANO]/ ) {
|
||||||
|
chomp($_);
|
||||||
|
|
||||||
|
@inrad = split /\s+/, $_;
|
||||||
|
$device_cfg[$i][0] = $inrad[0]; # Protocol
|
||||||
|
$device_cfg[$i][1] = $inrad[1]; # Housecode A and channel for NEXA, WAVEMAN, channel for SARTANO.
|
||||||
|
$device_cfg[$i][10] = $inrad[2]; # Rule valid days [[oe]1234567]
|
||||||
|
$device_cfg[$i][22] = 1; # Initial state set to on (1) so that they will be switched off at startup
|
||||||
|
|
||||||
|
|
||||||
|
if ($device_cfg[$i][0] eq "SARTANO") {
|
||||||
|
$device_cfg[$i][2] = "";
|
||||||
|
}
|
||||||
|
elsif ($device_cfg[$i][0] eq "NEXA" || $device_cfg[$i][0] eq "WAVEMAN") {
|
||||||
|
# Put the housecode and channel in the respective fields.
|
||||||
|
(my $house_code,my $channel) = $device_cfg[$i][1] =~ /^([A-P])(\d{1,2})$/;
|
||||||
|
if (!$house_code || !$channel || ($channel < 1) || ($channel > 16)) {
|
||||||
|
die("$PROGRAM_NAME: Housecode/channel out of range error on row $conf_row in configuration file.\n");
|
||||||
|
}
|
||||||
|
$device_cfg[$i][1] = $house_code;
|
||||||
|
$device_cfg[$i][2] = $channel;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die("$PROGRAM_NAME: Unsupported protcol: $device_cfg[$i][0]. Only NEXA, WAVEMAN or SARTANO allowed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Lets find the on interval and put it into the proper fields, $device_cfg[$i][3]=On time, $device_cfg[$i][8] = On time random interval
|
||||||
|
|
||||||
|
if ($inrad[3] =~ /-/) {
|
||||||
|
($device_cfg[$i][3], $on_interval_end) = $inrad[3] =~ /^(\d?\d:\d\d)-(\d?\d:\d\d)$/;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
($device_cfg[$i][3]) = $inrad[3] =~ /^(\d?\d:\d\d)$/;
|
||||||
|
$on_interval_end = $device_cfg[$i][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
$device_cfg[$i][8] = subtract_time($on_interval_end, $device_cfg[$i][3]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Off time = $device_cfg[$i][4], Off time random interval = $device_cfg[$i][9]
|
||||||
|
if ($inrad[4] =~ /-/) {
|
||||||
|
($device_cfg[$i][4], $off_interval_end) = $inrad[4] =~ /^(\d?\d:\d\d)-(\d?\d:\d\d)$/;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
($device_cfg[$i][4]) = $inrad[4] =~ /^(\d?\d:\d\d)$/;
|
||||||
|
$off_interval_end = $device_cfg[$i][4];
|
||||||
|
}
|
||||||
|
|
||||||
|
$device_cfg[$i][9] = subtract_time($off_interval_end, $device_cfg[$i][4]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Save the original on and off
|
||||||
|
$device_cfg[$i][23] = $device_cfg[$i][3]; # Original on time is stored here pos 3 will be used for random on times
|
||||||
|
$device_cfg[$i][24] = $device_cfg[$i][4]; # Original off time is stored here pos 4 will be used for random off times
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# $inrad[5] is the off post sunrise value including sign, $inrad[6] is the on pre sunrise value sign,
|
||||||
|
if (length($inrad[5]) > 0 && length($inrad[6]) > 0) {
|
||||||
|
# Found a parameter after off interval, assuming daytime switch off is sought.
|
||||||
|
$device_cfg[$i][5] = 1;
|
||||||
|
|
||||||
|
|
||||||
|
# First the off post sunrise
|
||||||
|
(my $sign, my $minutes) = $inrad[5] =~ /^([-\+]?)(.*?)$/;
|
||||||
|
|
||||||
|
if ($sign eq "+") {
|
||||||
|
$sign = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
(my $hours) = floor($minutes / 60);
|
||||||
|
$minutes = $minutes - $hours * 60;
|
||||||
|
|
||||||
|
$device_cfg[$i][6] = sprintf("%s%02d:%02d", $sign, $hours, $minutes);
|
||||||
|
|
||||||
|
# Then figure on pre sunset out
|
||||||
|
(my $sign, my $minutes) = $inrad[6] =~ /^([-\+]?)(.*?)$/;
|
||||||
|
|
||||||
|
if ($sign eq "+") {
|
||||||
|
$sign = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
(my $hours) = floor($minutes / 60);
|
||||||
|
$minutes = $minutes - $hours * 60;
|
||||||
|
|
||||||
|
$device_cfg[$i][7] = sprintf("%s%02d:%02d", $sign, $hours, $minutes);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# If no parameters given after off interval it is assumed that the light will be on daytime
|
||||||
|
$device_cfg[$i][5] = 0;
|
||||||
|
$device_cfg[$i][6] = "00:00";
|
||||||
|
$device_cfg[$i][7] = "00:00";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Some sanity checks
|
||||||
|
# If the turn on time is not to be used, this is marked with -1
|
||||||
|
if ($device_cfg[$i][3] != -1) {
|
||||||
|
if (is_time_format_correct($device_cfg[$i][3]) == $NO) {
|
||||||
|
die("$PROGRAM_NAME: Format of turn on time for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][3]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("$PROGRAM_NAME: Noted configuration for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] with no turn on time.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the turn off time is not to be used, this is marked with -1
|
||||||
|
if ($device_cfg[$i][4] != -1) {
|
||||||
|
if (is_time_format_correct($device_cfg[$i][4]) == $NO) {
|
||||||
|
die("$PROGRAM_NAME: Format of turn off time for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][4]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("$PROGRAM_NAME: Noted configuration for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] with no turn off time.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_time_format_correct($device_cfg[$i][6]) == $NO) {
|
||||||
|
die("$PROGRAM_NAME: Format of turn off after sunrise for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][6]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_time_format_correct($device_cfg[$i][7]) == $NO) {
|
||||||
|
die("$PROGRAM_NAME: Format of turn on before sunset for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct. Exiting.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_time_format_correct($device_cfg[$i][8]) == $NO) {
|
||||||
|
die("$PROGRAM_NAME: Format of on interval for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][8]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_time_format_correct($device_cfg[$i][9]) == $NO) {
|
||||||
|
die("$PROGRAM_NAME: Format of off interval for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][9]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($device_cfg[$i][10] =~ /^[o|e][^1-7]/) {
|
||||||
|
die("$PROGRAM_NAME: Device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2]: Specified rule validity day out of range: $device_cfg[$i][10]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printf("$PROGRAM_NAME: $device_cfg[$i][0] device $device_cfg[$i][1]$device_cfg[$i][2] config:\n");
|
||||||
|
|
||||||
|
printf(" This rule is valid: ");
|
||||||
|
for (my $j = 1 ; $j <= 7 ; $j++) {
|
||||||
|
if ($device_cfg[$i][10] =~ /$j/) {
|
||||||
|
printf(" $weekDays[$j]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($device_cfg[$i][10] =~ /o/) {
|
||||||
|
printf(" (odd weeks)");
|
||||||
|
}
|
||||||
|
if ($device_cfg[$i][10] =~ /e/) {
|
||||||
|
printf(" (even weeks)");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
if ($device_cfg[$i][3] == -1) {
|
||||||
|
printf(" On time: N/A\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf(" On time: $device_cfg[$i][3]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($device_cfg[$i][4] == -1) {
|
||||||
|
printf(" Off time: N/A\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf(" Off time: $device_cfg[$i][4]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" On time random interval: $device_cfg[$i][8]\n");
|
||||||
|
printf(" Off time random interval: $device_cfg[$i][9]\n");
|
||||||
|
|
||||||
|
if ($device_cfg[$i][5] == $YES) {
|
||||||
|
printf(" Turned off daytime: yes\n");
|
||||||
|
printf(" Off post sunrise: $device_cfg[$i][6]\n");
|
||||||
|
printf(" On pre sunset: $device_cfg[$i][7]\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf(" Turned off daytime: no\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
# Try to get config parameter name and value
|
||||||
|
(my $param, my $value) = $_ =~ /\s*(\w+)\s*=\s*(-?[a-zA-Z0-9_\/\.]*)/;
|
||||||
|
if ($param && $value) {
|
||||||
|
printf("$PROGRAM_NAME: $param = $value\n");
|
||||||
|
if ($param eq 'latitude') {
|
||||||
|
if ($value !~ /^-?[0-9\.]*$/) {
|
||||||
|
die ("$PROGRAM_NAME: Latitude must be a valid number\n");
|
||||||
|
}
|
||||||
|
if ($value < -90 || $value > 90) {
|
||||||
|
die ("$PROGRAM_NAME: Latitude must be between -90 and 90 degrees\n");
|
||||||
|
}
|
||||||
|
$LATITUDE = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($param eq 'longitude') {
|
||||||
|
if ($value !~ /^-?[0-9\.]*$/) {
|
||||||
|
die ("$PROGRAM_NAME: Longitude must be a valid number\n");
|
||||||
|
}
|
||||||
|
if ($value < -90 || $value > 90) {
|
||||||
|
die ("$PROGRAM_NAME: Longitude must be between -180 and 180 degrees\n");
|
||||||
|
}
|
||||||
|
$LONGITUDE = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($param eq 'timezone') {
|
||||||
|
if (!DateTime::TimeZone->is_valid_name($value)) {
|
||||||
|
die ("$PROGRAM_NAME: Invalid timezone\n");
|
||||||
|
}
|
||||||
|
$TIMEZONE = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($param eq 'rfcmd') {
|
||||||
|
$RFCMD = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($param eq 'tellstick_device') {
|
||||||
|
$TELLSTICK_DEVICE = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($param eq 'log_file') {
|
||||||
|
$LOG_FILE = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
if ($param eq 'pid_file') {
|
||||||
|
$pidFile = $value;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
die ("$PROGRAM_NAME: Unknown config parameter $param = $value\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die("$PROGRAM_NAME: Unknown config file line $_\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(CFG_FILE);
|
||||||
|
return $i;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usageprompt
|
||||||
|
{
|
||||||
|
printf("This program is intended for control of Tellstick remote devices.\n");
|
||||||
|
printf("Version: %s\n", $VERSION);
|
||||||
|
|
||||||
|
printf("\nUsage: %s [options]\n", $PROGRAM_NAME);
|
||||||
|
printf("\nOptions:\n");
|
||||||
|
printf("-c, --config filename Searchpath to configuration file, if not given $CONFIG_FILE is assumed.\n");
|
||||||
|
printf("-d, --daemon Run the program as a daemon and write a logfile.\n");
|
||||||
|
printf("-h, --help Show this message and exit.\n");
|
||||||
|
printf("--simulate Run in foreground, log to console, no actual device operations performed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ############## Main section ######################
|
||||||
|
my $i = -1;
|
||||||
|
|
||||||
|
while ($i < $#ARGV) {
|
||||||
|
if ($i+1 <= $#ARGV) {
|
||||||
|
if ($ARGV[$i+1] =~ /^--config$/ || $ARGV[$i+1] =~ /^-c$/) {
|
||||||
|
$i++;
|
||||||
|
$conf_file = $ARGV[$i+1];
|
||||||
|
}
|
||||||
|
elsif ($ARGV[$i+1] =~ /^-d$/ || $ARGV[$i+1] =~ /^--daemon$/) {
|
||||||
|
$make_daemon = $YES;
|
||||||
|
}
|
||||||
|
elsif ($ARGV[$i+1] =~ /^-h$/ || $ARGV[$i+1] =~ /^--help$/) {
|
||||||
|
usageprompt();
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
elsif ($ARGV[$i+1] =~ /--simulate/) {
|
||||||
|
$simulate = $YES;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die("$PROGRAM_NAME: Unknown input argument: $ARGV[$i+1]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($#ARGV < 0) {
|
||||||
|
die "Try \"$PROGRAM_NAME --help\" for more information.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (length($conf_file) < 1) {
|
||||||
|
$conf_file = $CONFIG_FILE;
|
||||||
|
}
|
||||||
|
$LOG_FILE = get_config_log_file_param($conf_file);
|
||||||
|
|
||||||
|
if ($LOG_FILE && $make_daemon && !$simulate) {
|
||||||
|
open STDOUT, "> $LOG_FILE" or die "$PROGRAM_NAME: Can't write to $LOG_FILE: $!";
|
||||||
|
open STDERR, ">> $LOG_FILE" or die "$PROGRAM_NAME: Can't write to $LOG_FILE: $!";
|
||||||
|
}
|
||||||
|
if (!$LOG_FILE && $make_daemon) {
|
||||||
|
# start a daemon without a log file
|
||||||
|
open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
|
||||||
|
open STDERR, '>/dev/null' or die "$PROGRAM_NAME: Can't write to /dev/null: $!";
|
||||||
|
}
|
||||||
|
# Read the configuration file
|
||||||
|
$number_of_rules = read_config($conf_file);
|
||||||
|
|
||||||
|
if ($number_of_rules < 1) {
|
||||||
|
die("$PROGRAM_NAME: Configuration file has no devices to control, exiting.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("\n$PROGRAM_NAME: $number_of_rules rule(s) has been read.\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($make_daemon == $YES && $simulate == $NO) {
|
||||||
|
&daemonize();
|
||||||
|
open PIDFILE, ">$pidFile" or die "$PROGRAM_NAME: Can't open $pidFile: $!\n";
|
||||||
|
print PIDFILE $$ . "\n";
|
||||||
|
close PIDFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("$PROGRAM_NAME: Starting $PROGRAM_NAME version $VERSION\n");
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
# Now to the eternal loop
|
||||||
|
my $first_loop = $YES;
|
||||||
|
my $now;
|
||||||
|
while (1) {
|
||||||
|
$n_rfcmd_calls = 0;
|
||||||
|
|
||||||
|
# What is the current time
|
||||||
|
($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime();
|
||||||
|
$Year += 1900;
|
||||||
|
$current_time = sprintf("%02d:%02d", $Hour, $Minute);
|
||||||
|
$now = DateTime->now( time_zone => $TIMEZONE);
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
# First, lets set the sunrise and sunset times for the devices that it applies to, once a day, at 00:00.
|
||||||
|
if ($first_loop == $YES || $current_time eq "00:00") {
|
||||||
|
my $sunrise_time = get_sunrise_time();
|
||||||
|
printf("$PROGRAM_NAME: Recalculating sunrise/sunset. Current date: %d-%02d-%02d\n", $Year, $Month + 1, $Day);
|
||||||
|
printf("$PROGRAM_NAME: Time is $current_time. Sunrise today is expected at $sunrise_time\n");
|
||||||
|
|
||||||
|
my $sunset_time = get_sunset_time();
|
||||||
|
printf("$PROGRAM_NAME: Time is $current_time. Sunset today is expected at $sunset_time\n\n");
|
||||||
|
|
||||||
|
for (my $i = 0; $i < $number_of_rules; $i++) {
|
||||||
|
# Initially all devices are switched off to get a known state
|
||||||
|
if ($first_loop == $YES) {
|
||||||
|
rfcmd_exec($i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Lets set the actual on- and offtimes depending on random interval settings.
|
||||||
|
randomize_on($i);
|
||||||
|
if (is_rule_valid_today($i, $now) == $YES) {
|
||||||
|
printf("$PROGRAM_NAME: Today device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] will be turned on $device_cfg[$i][3]\n");
|
||||||
|
}
|
||||||
|
randomize_off($i);
|
||||||
|
if (is_rule_valid_today($i, $now) == $YES) {
|
||||||
|
printf("$PROGRAM_NAME: Today device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] will be turned off $device_cfg[$i][4]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the device is supposed to be off daytime, the following applies
|
||||||
|
# Sunrise time + requested offset
|
||||||
|
if ($device_cfg[$i][5] == $YES) {
|
||||||
|
$device_cfg[$i][20] = add_time($sunrise_time, $device_cfg[$i][6]);
|
||||||
|
if (is_rule_valid_today($i, $now) == $YES) {
|
||||||
|
printf("$PROGRAM_NAME: Device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] sunrise off time set to $device_cfg[$i][20].\n");
|
||||||
|
}
|
||||||
|
# Sunset time - requested offset
|
||||||
|
$device_cfg[$i][21] = subtract_time($sunset_time, $device_cfg[$i][7]);
|
||||||
|
if (is_rule_valid_today($i, $now) == $YES) {
|
||||||
|
printf("$PROGRAM_NAME: Device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] sunset on time set to $device_cfg[$i][21].\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
# Below the required actions are performed for each device
|
||||||
|
for ($i = 0; $i < $number_of_rules; $i++) {
|
||||||
|
|
||||||
|
|
||||||
|
# Lets check if the rule is to be applied today
|
||||||
|
if (is_rule_valid_today($i, $now) == $YES) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# First if we consider daytime off
|
||||||
|
if ($device_cfg[$i][5] == $YES) {
|
||||||
|
if (is_inbetween_times($device_cfg[$i][3], $device_cfg[$i][4], $current_time) == $YES && is_inbetween_times($device_cfg[$i][20], $device_cfg[$i][21], $current_time) == $NO) {
|
||||||
|
rfcmd_exec($i, 1);
|
||||||
|
$n_rfcmd_calls++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rfcmd_exec($i, 0);
|
||||||
|
$n_rfcmd_calls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Then if daytime off is not considered
|
||||||
|
else {
|
||||||
|
if (is_inbetween_times($device_cfg[$i][3], $device_cfg[$i][4], $current_time) == $YES) {
|
||||||
|
rfcmd_exec($i, 1);
|
||||||
|
$n_rfcmd_calls++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rfcmd_exec($i, 0);
|
||||||
|
$n_rfcmd_calls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$first_loop = $NO;
|
||||||
|
|
||||||
|
if ($n_rfcmd_calls < 30) {
|
||||||
|
sleep(60 - 2*$n_rfcmd_calls); # Wait a while until next round [seconds]. If rfcmd has been called, reduce this figure by 2 seconds per call.
|
||||||
|
}
|
||||||
|
}
|
||||||
60
3rdparty/tellstickd/tellstickd.conf
vendored
Normal file
60
3rdparty/tellstickd/tellstickd.conf
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
# Tellstickd file for control of remote switches with rfcmd.
|
||||||
|
|
||||||
|
# To be able to calculate sunrise and sunset times tellstickd needs to know your position
|
||||||
|
# Your latitude
|
||||||
|
latitude = 65.603
|
||||||
|
|
||||||
|
# Your longitude
|
||||||
|
longitude = 22.18
|
||||||
|
|
||||||
|
# Your timezone
|
||||||
|
timezone = Europe/Stockholm
|
||||||
|
|
||||||
|
# Where to find the rfcmd command
|
||||||
|
rfcmd = /usr/local/bin/rfcmd
|
||||||
|
|
||||||
|
# The tellstick device name
|
||||||
|
tellstick_device = /dev/tellstick
|
||||||
|
|
||||||
|
# Where to put the log file
|
||||||
|
log_file = /var/log/tellstickd
|
||||||
|
|
||||||
|
# Where to put the pid file
|
||||||
|
pid_file = /var/run/tellstickd.pid
|
||||||
|
|
||||||
|
#
|
||||||
|
#<protocol> <housecode/channel> <valid day(s)> <on time[-end random on time]> <off time[-end random off time]> <off after sunrise in minutes> <on before sunset in minutes>
|
||||||
|
#
|
||||||
|
# In valid day field, days are numbered 1=Monday, 2=Tuesday, ... , 7=Sunday. I.e. 1234567 means that the rule should be active every weekday.
|
||||||
|
# The day fields can be prefixed with "o" or "e" making the rule valid on odd or even weeks. Week numbers are
|
||||||
|
# calculated according to ISO, with the first week of the year being the one containing 4 jan
|
||||||
|
|
||||||
|
# Time format xx:yy where xx is hour and yy is minute
|
||||||
|
# Multiple definitions are possible for each device. Be aware that overlapping rules (overlapping in time) can/will cause troubles.
|
||||||
|
#
|
||||||
|
# Setting <on time> and <off time> the same means that the device will always be switched on.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Sample rules
|
||||||
|
|
||||||
|
|
||||||
|
# The sample rule below will turn on the device between 06:10 and 06:20 and off between 22:00 and 23:00 monday to friday.
|
||||||
|
# The device will be turned off daytime 10 minutes after sunrise and 15 before sunset
|
||||||
|
SARTANO 0000000000 12345 06:10-06:20 22:00-23:00 10 15
|
||||||
|
|
||||||
|
# This device will be turned on between 07:34 and 07:48, turned off between 23:00 and 23:15 (every day of the week).
|
||||||
|
# It will be turned off exactly on sunrise and off exactly on sunset.
|
||||||
|
WAVEMAN P2 1234567 07:34-07:48 23:00-23:15 0 0
|
||||||
|
|
||||||
|
# This device will be turned on 07:00 off between 20:00 and 20:30 and will be on daytime on sundays.
|
||||||
|
NEXA P3 7 07:00 20:00-20:30
|
||||||
|
|
||||||
|
# This device will be turned on 07:00 and off 20:00 on fridays and sundays on evenly numbered weeks
|
||||||
|
NEXA P3 e57 07:00 20:00
|
||||||
|
|
||||||
|
# This device will be turned on 07:00 and off 20:00 on fridays and sundays on oddly numbered weeks
|
||||||
|
NEXA P3 o57 07:00 20:00
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
36
bindings/dotnet/TelldusNETWrapper/Properties/AssemblyInfo.cs
Normal file
36
bindings/dotnet/TelldusNETWrapper/Properties/AssemblyInfo.cs
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("TelldusNETWrapper")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Telldus Technologies AB")]
|
||||||
|
[assembly: AssemblyProduct("")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Telldus Technologies AB 2011")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(true)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("a66028f7-b342-4dc0-9504-9e07c462ec15")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
816
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.cs
Normal file
816
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.cs
Normal file
|
|
@ -0,0 +1,816 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace TelldusWrapper
|
||||||
|
{
|
||||||
|
public sealed class TelldusNETWrapper //don't allow inheritance
|
||||||
|
{
|
||||||
|
int lastEventID = 0;
|
||||||
|
Dictionary<int, Object> callbackFunctionReferenceList = new Dictionary<int, Object>(); //this prevents errors in "unknown module" due to callback functions being garbage collected since there are no reference to them
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
List<Object> lista = new List<object>();
|
||||||
|
|
||||||
|
//Device methods
|
||||||
|
public const int TELLSTICK_TURNON = 1;
|
||||||
|
public const int TELLSTICK_TURNOFF = 2;
|
||||||
|
public const int TELLSTICK_BELL = 4;
|
||||||
|
public const int TELLSTICK_TOGGLE = 8;
|
||||||
|
public const int TELLSTICK_DIM = 16;
|
||||||
|
public const int TELLSTICK_LEARN = 32;
|
||||||
|
public const int TELLSTICK_EXECUTE = 64;
|
||||||
|
public const int TELLSTICK_UP = 128;
|
||||||
|
public const int TELLSTICK_DOWN = 256;
|
||||||
|
public const int TELLSTICK_STOP = 512;
|
||||||
|
|
||||||
|
//Error codes
|
||||||
|
public const int TELLSTICK_SUCCESS = 0;
|
||||||
|
public const int TELLSTICK_ERROR_NOT_FOUND = -1;
|
||||||
|
public const int TELLSTICK_ERROR_PERMISSION_DENIED = -2;
|
||||||
|
public const int TELLSTICK_ERROR_DEVICE_NOT_FOUND = -3;
|
||||||
|
public const int TELLSTICK_ERROR_METHOD_NOT_SUPPORTED = -4;
|
||||||
|
public const int TELLSTICK_ERROR_COMMUNICATION = -5;
|
||||||
|
public const int TELLSTICK_ERROR_CONNECTING_SERVICE = -6;
|
||||||
|
public const int TELLSTICK_ERROR_UNKNOWN_RESPONSE = -7;
|
||||||
|
public const int TELLSTICK_ERROR_UNKNOWN = -99;
|
||||||
|
|
||||||
|
//Device typedef
|
||||||
|
public const int TELLSTICK_TYPE_DEVICE = 1;
|
||||||
|
public const int TELLSTICK_TYPE_GROUP = 2;
|
||||||
|
public const int TELLSTICK_TYPE_SCENE = 3;
|
||||||
|
|
||||||
|
//Device changes
|
||||||
|
public const int TELLSTICK_DEVICE_ADDED = 1;
|
||||||
|
public const int TELLSTICK_DEVICE_CHANGED = 2;
|
||||||
|
public const int TELLSTICK_DEVICE_REMOVED = 3;
|
||||||
|
public const int TELLSTICK_DEVICE_STATE_CHANGED = 4;
|
||||||
|
|
||||||
|
//Change types
|
||||||
|
public const int TELLSTICK_CHANGE_NAME = 1;
|
||||||
|
public const int TELLSTICK_CHANGE_PROTOCOL = 2;
|
||||||
|
public const int TELLSTICK_CHANGE_MODEL = 3;
|
||||||
|
|
||||||
|
//variables for event callback (e.g. turnon, turnoff)
|
||||||
|
public delegate int EventCallbackFunction(int deviceId, int method, string data, int callbackId, Object obj);
|
||||||
|
private struct DeviceEventFunctionContext
|
||||||
|
{
|
||||||
|
public EventCallbackFunction eventCallbackFunc;
|
||||||
|
public Object context;
|
||||||
|
public int callbackId;
|
||||||
|
}
|
||||||
|
Dictionary<int, DeviceEventFunctionContext> deviceEventList = new Dictionary<int, DeviceEventFunctionContext>();
|
||||||
|
int registeredEventFunctionId = -1;
|
||||||
|
|
||||||
|
//variables for device event callback (e.g. change of name/protocol)
|
||||||
|
public delegate int DeviceChangeEventCallbackFunction(int deviceId, int changeEvent, int changeType, int callbackId, Object obj);
|
||||||
|
private struct DeviceChangeEventFunctionContext
|
||||||
|
{
|
||||||
|
public DeviceChangeEventCallbackFunction changeEventCallbackFunc;
|
||||||
|
public Object context;
|
||||||
|
public int callbackId;
|
||||||
|
}
|
||||||
|
Dictionary<int, DeviceChangeEventFunctionContext> deviceChangeEventList = new Dictionary<int, DeviceChangeEventFunctionContext>();
|
||||||
|
int registeredDeviceChangeEventFunctionId = -1;
|
||||||
|
|
||||||
|
//variables for raw controller listening callback (e.g. Tellstick Duo receives data)
|
||||||
|
public delegate int RawListeningCallbackFunction(string data, int controllerId, int callbackId, Object obj);
|
||||||
|
private struct RawEventFunctionContext
|
||||||
|
{
|
||||||
|
public RawListeningCallbackFunction rawCallbackFunc;
|
||||||
|
public Object context;
|
||||||
|
public int callbackId;
|
||||||
|
}
|
||||||
|
Dictionary<int, RawEventFunctionContext> rawListenerList = new Dictionary<int, RawEventFunctionContext>();
|
||||||
|
int registeredRawListenerFunctionId = -1;
|
||||||
|
|
||||||
|
public TelldusNETWrapper()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~TelldusNETWrapper()
|
||||||
|
{
|
||||||
|
//clean up
|
||||||
|
if (registeredEventFunctionId != -1)
|
||||||
|
{
|
||||||
|
UnmanagedImport.tdUnregisterCallback(registeredEventFunctionId);
|
||||||
|
}
|
||||||
|
if (registeredDeviceChangeEventFunctionId != -1)
|
||||||
|
{
|
||||||
|
UnmanagedImport.tdUnregisterCallback(registeredDeviceChangeEventFunctionId);
|
||||||
|
}
|
||||||
|
if (registeredRawListenerFunctionId != -1)
|
||||||
|
{
|
||||||
|
UnmanagedImport.tdUnregisterCallback(registeredRawListenerFunctionId);
|
||||||
|
}
|
||||||
|
UnmanagedImport.tdClose(); //Close the library and clean up the cache it uses.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Imported functions from TelldusCore.dll
|
||||||
|
/// </summary>
|
||||||
|
private sealed class UnmanagedImport
|
||||||
|
{
|
||||||
|
private UnmanagedImport() { } //cannot instantiate this class
|
||||||
|
|
||||||
|
#region Unmanaged Code
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdGetNumberOfDevices();
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdGetDeviceId(int value);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern char* tdGetName(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern char* tdGetProtocol(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern char* tdGetModel(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern char* tdGetDeviceParameter(int deviceId, char* name, char* defaultValue);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern bool tdSetName(int deviceId, char* name);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern bool tdSetProtocol(int deviceId, char* protocol);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern bool tdSetModel(int deviceId, char* model);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern bool tdSetDeviceParameter(int deviceId, char* name, char* value);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdAddDevice();
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern bool tdRemoveDevice(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdMethods(int deviceId, int methodsSupported);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdTurnOn(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdTurnOff(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdBell(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdDim(int deviceId, char level);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdExecute(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdUp(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdDown(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdStop(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern char* tdGetErrorString(int errorNo);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern void tdClose();
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern void tdInit();
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdRegisterDeviceEvent(Delegate deviceEventFunction, void* context);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdLastSentCommand(int deviceId, int methods);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdGetDeviceType(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdSendRawCommand(char* command, int reserved);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdRegisterRawDeviceEvent(Delegate rawListeningFunction, void* context);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdLearn(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern char* tdLastSentValue(int deviceId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern void tdReleaseString(char* value);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdUnregisterCallback(int eventId);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static unsafe extern int tdRegisterDeviceChangeEvent(Delegate deviceChangeEventFunction, void* context);
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
||||||
|
public unsafe delegate void EventFunctionDelegate(int deviceId, int method, char* data, int callbackId, void* context);
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
||||||
|
public unsafe delegate void DeviceChangeEventFunctionDelegate(int deviceId, int changeEvent, int changeType, int callbackId, void* context);
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
||||||
|
public unsafe delegate void RawListeningDelegate(char* data, int controllerId, int callbackId, void* context);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Public Methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a new device to the global database of devices. This function must be called first before
|
||||||
|
/// any call to tdSetName(), tdSetProtocol() and similar functions.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns> The device id for the newly created device. If the creation fails it returnes a
|
||||||
|
/// negative value.</returns>
|
||||||
|
public static int tdAddDevice()
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdAddDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends bell command to devices supporting this.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to sound the bell on</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdBell(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdBell(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Close the library and clean up the cache it uses.
|
||||||
|
/// This should be called when the library is not supposed to be used anymore.
|
||||||
|
/// Do not use when this has been instantiated, will be closed in destructor then, only on static methods.
|
||||||
|
/// </summary>
|
||||||
|
public static void tdClose()
|
||||||
|
{
|
||||||
|
UnmanagedImport.tdClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dims a device.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">The device id to dim</param>
|
||||||
|
/// <param name="level">The level the device should dim to. This value should be 0-255</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdDim(int deviceId, char level)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdDim(deviceId, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send "down" command to device.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">The device id to send the command to</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdDown(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdDown(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Execute a scene action.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to perform the execute action on</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdExecute(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdExecute(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This function returns the unique id of a device with a specific index.
|
||||||
|
/// To get all the id numbers you should loop over all the devices, use tdGetNumberOfDevices() to get the number of devices
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="order">Device index</param>
|
||||||
|
/// <returns>Id of device at that position</returns>
|
||||||
|
public static int tdGetDeviceId(int order)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdGetDeviceId(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a protocol specific device parameter
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">The id of the device to query</param>
|
||||||
|
/// <param name="name">The name of the parameter to query</param>
|
||||||
|
/// <param name="defaultValue">A defaultValue to return if the current parameter hasn't previously been set</param>
|
||||||
|
/// <returns>Any protocol specific parameter specified by "name"</returns>
|
||||||
|
public static unsafe string tdGetDeviceParameter(int deviceId, string name, string defaultValue)
|
||||||
|
{
|
||||||
|
return getString(UnmanagedImport.tdGetDeviceParameter(deviceId, stringToChar(name), stringToChar(defaultValue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns which type the device is
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of the device</param>
|
||||||
|
/// <returns>TELLSTICK_TYPE_DEVICE or TELLSTICK_TYPE_GROUP</returns>
|
||||||
|
public static int tdGetDeviceType(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdGetDeviceType(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a human readable string from an error code returned from a function in telldus-core
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="errorNo">The error code to translate</param>
|
||||||
|
/// <returns>A string ready to show to the user.
|
||||||
|
/// TELLSTICK_SUCCESS
|
||||||
|
/// TELLSTICK_ERROR_NOT_FOUND
|
||||||
|
/// TELLSTICK_ERROR_PERMISSION_DENIED
|
||||||
|
/// TELLSTICK_ERROR_DEVICE_NOT_FOUND
|
||||||
|
/// TELLSTICK_ERROR_METHOD_NOT_SUPPORTED
|
||||||
|
/// TELLSTICK_ERROR_COMMUNICATION
|
||||||
|
/// TELLSTICK_ERROR_CONNECTING_SERVICE
|
||||||
|
/// TELLSTICK_ERROR_UNKNOWN_RESPONSE
|
||||||
|
/// TELLSTICK_ERROR_UNKNOWN
|
||||||
|
/// </returns>
|
||||||
|
public static unsafe string tdGetErrorString(int errorNo)
|
||||||
|
{
|
||||||
|
return getString(UnmanagedImport.tdGetErrorString(errorNo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Query a device for it’s name
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to query</param>
|
||||||
|
/// <returns>The name of the device or an empty string if the device is not found</returns>
|
||||||
|
public static unsafe string tdGetName(int deviceId)
|
||||||
|
{
|
||||||
|
return getString(UnmanagedImport.tdGetName(deviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Query a device for which methods it supports. By supplying the methods you support
|
||||||
|
/// the library could remap the methods a device support for better fit the application.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to query</param>
|
||||||
|
/// <param name="methodsSupported">Methods that the client application supports</param>
|
||||||
|
/// <returns>Supported (both by client application and by device) method-flags OR'ed into an integer
|
||||||
|
/// TELLSTICK_TURNON
|
||||||
|
/// TELLSTICK_TURNOFF
|
||||||
|
/// TELLSTICK_BELL
|
||||||
|
/// TELLSTICK_TOGGLE
|
||||||
|
/// TELLSTICK_DIM
|
||||||
|
/// TELLSTICK_EXECUTE
|
||||||
|
/// TELLSTICK_UP
|
||||||
|
/// TELLSTICK_DOWN
|
||||||
|
/// TELLSTICK_EXECUTE
|
||||||
|
/// TELLSTICK_LEARN
|
||||||
|
/// </returns>
|
||||||
|
public static int tdMethods(int deviceId, int methodsSupported)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdMethods(deviceId, methodsSupported);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Query a device for it’s model
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to query</param>
|
||||||
|
/// <returns>The model for a device. Not all protocols use this.</returns>
|
||||||
|
public static unsafe string tdGetModel(int deviceId)
|
||||||
|
{
|
||||||
|
return getString(UnmanagedImport.tdGetModel(deviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This function returns the number of devices configured
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The total number of devices configured</returns>
|
||||||
|
public static int tdGetNumberOfDevices()
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdGetNumberOfDevices();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Query a device for it’s protocol
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to query</param>
|
||||||
|
/// <returns>The protocol for a device.</returns>
|
||||||
|
public static unsafe string tdGetProtocol(int deviceId)
|
||||||
|
{
|
||||||
|
return getString(UnmanagedImport.tdGetProtocol(deviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the last sent command to a specific device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to query</param>
|
||||||
|
/// <param name="methods">The methods supported by the client. See tdMethods() for more information.</param>
|
||||||
|
/// <returns>The last sent command as integer, for example TELLSTICK_TURNON or TELLSTICK_TURNOFF</returns>
|
||||||
|
public static int tdLastSentCommand(int deviceId, int methods)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdLastSentCommand(deviceId, methods);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If the last sent command it TELLSTICK_DIM this returns the dimmed value
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to query</param>
|
||||||
|
/// <returns>The the value as a human readable string, for example "128" for 50%</returns>
|
||||||
|
public static unsafe string tdLastSentValue(int deviceId)
|
||||||
|
{
|
||||||
|
return getString(UnmanagedImport.tdLastSentValue(deviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends a special learn command to some devices that need a special learn-command to be used from TellStick
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to learn</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdLearn(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdLearn(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register a callback event function to be called when a device event (e.g. turn on, turn off) occurs
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventFunc">Callback function to be called</param>
|
||||||
|
/// <param name="obj">Context object that will be echoed back when function is called. Only the object when the first function is registered will be used. Set to null if not used.</param>
|
||||||
|
/// <returns>Callback event id</returns>
|
||||||
|
public unsafe int tdRegisterDeviceEvent(EventCallbackFunction deviceEventFunc, Object obj)
|
||||||
|
{
|
||||||
|
int returnValue = 0;
|
||||||
|
|
||||||
|
if (deviceEventList.Count == 0)
|
||||||
|
{
|
||||||
|
//first added, register with dll too
|
||||||
|
UnmanagedImport.EventFunctionDelegate deviceEventFunctionDelegate = new UnmanagedImport.EventFunctionDelegate(deviceEventFunction);
|
||||||
|
|
||||||
|
registeredEventFunctionId = UnmanagedImport.tdRegisterDeviceEvent(deviceEventFunctionDelegate, (void*)null); //context here or above?
|
||||||
|
GC.Collect();
|
||||||
|
callbackFunctionReferenceList.Add(registeredEventFunctionId, deviceEventFunctionDelegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
++lastEventID;
|
||||||
|
returnValue = lastEventID;
|
||||||
|
DeviceEventFunctionContext deviceEventFuncContext = new DeviceEventFunctionContext();
|
||||||
|
deviceEventFuncContext.eventCallbackFunc = deviceEventFunc;
|
||||||
|
deviceEventFuncContext.context = obj;
|
||||||
|
deviceEventFuncContext.callbackId = returnValue;
|
||||||
|
deviceEventList.Add(returnValue, deviceEventFuncContext);
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register a callback device change event function to be called when a device change event (e.g. change of name, device added) occurs
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceEventFunc">Callback function to be called</param>
|
||||||
|
/// <param name="obj">Context object that will be echoed back when function is called. Only the object when the first function is registered will be used. Set to null if not used.</param>
|
||||||
|
/// <returns>Callback event id</returns>
|
||||||
|
public unsafe int tdRegisterDeviceChangeEvent(DeviceChangeEventCallbackFunction deviceChangeEventFunc, Object obj)
|
||||||
|
{
|
||||||
|
int returnValue = 0;
|
||||||
|
if (deviceChangeEventList.Count == 0)
|
||||||
|
{
|
||||||
|
//first added, register with dll too
|
||||||
|
//only the context object of the first event will be registered
|
||||||
|
UnmanagedImport.DeviceChangeEventFunctionDelegate deviceChangeEventFunctionDelegate = new UnmanagedImport.DeviceChangeEventFunctionDelegate(deviceChangeEventFunction);
|
||||||
|
|
||||||
|
registeredDeviceChangeEventFunctionId = UnmanagedImport.tdRegisterDeviceChangeEvent(deviceChangeEventFunctionDelegate, (void*)null);
|
||||||
|
GC.Collect();
|
||||||
|
callbackFunctionReferenceList.Add(registeredDeviceChangeEventFunctionId, deviceChangeEventFunctionDelegate);
|
||||||
|
}
|
||||||
|
++lastEventID;
|
||||||
|
returnValue = lastEventID;
|
||||||
|
DeviceChangeEventFunctionContext deviceChangeEventFuncContext = new DeviceChangeEventFunctionContext();
|
||||||
|
deviceChangeEventFuncContext.changeEventCallbackFunc = deviceChangeEventFunc;
|
||||||
|
deviceChangeEventFuncContext.context = obj;
|
||||||
|
deviceChangeEventFuncContext.callbackId = returnValue;
|
||||||
|
deviceChangeEventList.Add(returnValue, deviceChangeEventFuncContext);
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register a callback listening function to be called when a listening event (e.g. data is received with Tellstick Duo) occurs
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="listeningFunc">Callback function to be called</param>
|
||||||
|
/// <param name="obj">Context object that will be echoed back when function is called. Only the object when the first function is registered will be used. Set to null if not used.</param>
|
||||||
|
/// <returns>Callback event id</returns>
|
||||||
|
public unsafe int tdRegisterRawDeviceEvent(RawListeningCallbackFunction listeningFunc, Object obj)
|
||||||
|
{
|
||||||
|
int returnValue = 0;
|
||||||
|
if (rawListenerList.Count == 0)
|
||||||
|
{
|
||||||
|
//first added, register with dll too
|
||||||
|
//only the context object of the first event will be registered
|
||||||
|
UnmanagedImport.RawListeningDelegate listeningFunctionDelegate = new UnmanagedImport.RawListeningDelegate(rawListeningFunction);
|
||||||
|
|
||||||
|
registeredRawListenerFunctionId = UnmanagedImport.tdRegisterRawDeviceEvent(listeningFunctionDelegate, (void*)null);
|
||||||
|
GC.Collect();
|
||||||
|
callbackFunctionReferenceList.Add(registeredRawListenerFunctionId, listeningFunctionDelegate);
|
||||||
|
}
|
||||||
|
++lastEventID;
|
||||||
|
returnValue = lastEventID;
|
||||||
|
RawEventFunctionContext rawEventFuncContext = new RawEventFunctionContext();
|
||||||
|
rawEventFuncContext.rawCallbackFunc = listeningFunc;
|
||||||
|
rawEventFuncContext.context = obj;
|
||||||
|
rawEventFuncContext.callbackId = returnValue;
|
||||||
|
rawListenerList.Add(returnValue, rawEventFuncContext);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes a device.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to remove</param>
|
||||||
|
/// <returns>True on success, false otherwise</returns>
|
||||||
|
public static bool tdRemoveDevice(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdRemoveDevice(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send a raw command to TellStick. Please read the TellStick protocol definition on how the command should be constructed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command">The command for TellStick in its native format</param>
|
||||||
|
/// <param name="reserved"></param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static unsafe int tdSendRawCommand(string command, int reserved)
|
||||||
|
{
|
||||||
|
char* commandChar = stringToChar(command);
|
||||||
|
int returnValue = UnmanagedImport.tdSendRawCommand(commandChar, reserved);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)commandChar);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets a new protocol specific parameter. Please see the documentation of the protocols before setting any parameter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to change</param>
|
||||||
|
/// <param name="name">The name of the parameter to change</param>
|
||||||
|
/// <param name="value">The new value for the parameter</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static unsafe bool tdSetDeviceParameter(int deviceId, string name, string value)
|
||||||
|
{
|
||||||
|
char* nameChar = stringToChar(name);
|
||||||
|
char* valueChar = stringToChar(value);
|
||||||
|
bool returnValue = UnmanagedImport.tdSetDeviceParameter(deviceId, nameChar, valueChar);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)nameChar);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)valueChar);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets a new model for a device. Which model to set depends on the current protocol.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to change</param>
|
||||||
|
/// <param name="model">The new model</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static unsafe bool tdSetModel(int deviceId, string model)
|
||||||
|
{
|
||||||
|
char* modelChar = stringToChar(model);
|
||||||
|
bool returnValue = UnmanagedImport.tdSetModel(deviceId, modelChar);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)modelChar);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets a new name for a device.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to change</param>
|
||||||
|
/// <param name="name">The new name</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static unsafe bool tdSetName(int deviceId, string name)
|
||||||
|
{
|
||||||
|
char* nameChar = stringToChar(name);
|
||||||
|
bool returnValue = UnmanagedImport.tdSetName(deviceId, nameChar);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)nameChar);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This changes the current protocol used by a device. After changing the protocol, setting new parameters is required.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to change</param>
|
||||||
|
/// <param name="protocol">The new protocol to use</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static unsafe bool tdSetProtocol(int deviceId, string protocol)
|
||||||
|
{
|
||||||
|
char* protocolChar = stringToChar(protocol);
|
||||||
|
bool returnValue = UnmanagedImport.tdSetProtocol(deviceId, protocolChar);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)protocolChar);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send "stop" command to device.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">The device id to stop</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdStop(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdStop(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Turns a device on.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to turn on</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdTurnOn(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdTurnOn(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Turns a device off.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of device to turn off</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdTurnOff(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdTurnOff(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unregister a callback function. All functions will be unregistered automatically when this objekt is deleted.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventId">Id of callback even to unregister</param>
|
||||||
|
public void unregisterCallback(int eventId)
|
||||||
|
{
|
||||||
|
deviceEventList.Remove(eventId);
|
||||||
|
if (deviceEventList.Count == 0)
|
||||||
|
{
|
||||||
|
//no more events in list
|
||||||
|
UnmanagedImport.tdUnregisterCallback(registeredEventFunctionId);
|
||||||
|
callbackFunctionReferenceList.Remove(registeredEventFunctionId);
|
||||||
|
/*
|
||||||
|
if (eventContextHandle.IsAllocated)
|
||||||
|
{
|
||||||
|
eventContextHandle.Free();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceChangeEventList.Remove(eventId);
|
||||||
|
if (deviceChangeEventList.Count == 0)
|
||||||
|
{
|
||||||
|
//no more events in list
|
||||||
|
UnmanagedImport.tdUnregisterCallback(registeredDeviceChangeEventFunctionId);
|
||||||
|
callbackFunctionReferenceList.Remove(registeredDeviceChangeEventFunctionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
rawListenerList.Remove(eventId);
|
||||||
|
if (rawListenerList.Count == 0)
|
||||||
|
{
|
||||||
|
//no more events in list
|
||||||
|
UnmanagedImport.tdUnregisterCallback(registeredRawListenerFunctionId);
|
||||||
|
callbackFunctionReferenceList.Remove(registeredRawListenerFunctionId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send "up" command to device.
|
||||||
|
/// Make sure the device supports this by calling tdMethods() before any calls to this function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">The device id to send the command to</param>
|
||||||
|
/// <returns>Success or error code</returns>
|
||||||
|
public static int tdUp(int deviceId)
|
||||||
|
{
|
||||||
|
return UnmanagedImport.tdUp(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region Private Methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert char* to correctly encoded string, clean up received char*
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Char* to convert</param>
|
||||||
|
/// <returns>Converted string</returns>
|
||||||
|
private static unsafe string getString(char* input)
|
||||||
|
{
|
||||||
|
return getString(input, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert char* to correctly encoded string, clean up of received char* is optional
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">Char* to convert</param>
|
||||||
|
/// <param name="release">Clean up char* or not (don't do that if it is still should be used somewhere)</param>
|
||||||
|
/// <returns>Converted string</returns>
|
||||||
|
private static unsafe string getString(char* input, bool release)
|
||||||
|
{
|
||||||
|
string returnString = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(input)));
|
||||||
|
|
||||||
|
if (returnString.Contains("\0"))
|
||||||
|
{
|
||||||
|
returnString = returnString.Substring(0, returnString.IndexOf('\0'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (release)
|
||||||
|
{
|
||||||
|
UnmanagedImport.tdReleaseString(input);
|
||||||
|
}
|
||||||
|
GC.Collect();
|
||||||
|
return returnString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert string to correctly encoded char*
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">String to convert</param>
|
||||||
|
/// <returns>Converted char*</returns>
|
||||||
|
private static unsafe char* stringToChar(string input)
|
||||||
|
{
|
||||||
|
input = String.Concat(input, char.MinValue); //add null terminator
|
||||||
|
byte[] inputByte = System.Text.Encoding.UTF8.GetBytes(input);
|
||||||
|
int size = Marshal.SystemDefaultCharSize * inputByte.Length;
|
||||||
|
IntPtr inputPointer = Marshal.AllocHGlobal(size);
|
||||||
|
|
||||||
|
Marshal.Copy(inputByte, 0, inputPointer, inputByte.Length);
|
||||||
|
return (char*)inputPointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event function wrapper that will call all registered event functions with C#-arguments when
|
||||||
|
/// this event function is called from telldus core, with C++-style arguments. This function will
|
||||||
|
/// be registered with telldus core when the first event callback function is added.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of affected device</param>
|
||||||
|
/// <param name="method">Method that was executed on device</param>
|
||||||
|
/// <param name="data">Optional data that was sent to the method (e.g. dim value)</param>
|
||||||
|
/// <param name="callbackId">Callback event id</param>
|
||||||
|
/// <param name="context">Context (optional)</param>
|
||||||
|
/// <returns>0</returns>
|
||||||
|
private unsafe void deviceEventFunction(int deviceId, int method, char* data, int callbackId, void* context)
|
||||||
|
{
|
||||||
|
foreach (DeviceEventFunctionContext deviceEventFuncContext in deviceEventList.Values)
|
||||||
|
{
|
||||||
|
deviceEventFuncContext.eventCallbackFunc(deviceId, method, getString(data, false), deviceEventFuncContext.callbackId, deviceEventFuncContext.context);
|
||||||
|
GC.Collect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event function wrapper that will call all registered device change event functions with C#-arguments when
|
||||||
|
/// this device change event function is called from telldus core, with C++-style arguments. This function will
|
||||||
|
/// be registered with telldus core when the first device change event callback function is added.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId">Id of affected device</param>
|
||||||
|
/// <param name="changeEvent">Method that was executed, TELLSTICK_DEVICE_ADDED, TELLSTICK_DEVICE_CHANGED, TELLSTICK_DEVICE_REMOVED, TELLSTICK_DEVICE_STATE_CHANGED</param>
|
||||||
|
/// <param name="changeType">Type of change TELLSTICK_CHANGE_NAME, TELLSTICK_CHANGE_PROTOCOL, TELLSTICK_CHANGE_MODEL</param>
|
||||||
|
/// <param name="callbackId">Callback event id</param>
|
||||||
|
/// <param name="context">Context (optional)</param>
|
||||||
|
/// <returns>0</returns>
|
||||||
|
private unsafe void deviceChangeEventFunction(int deviceId, int changeEvent, int changeType, int callbackId, void* context)
|
||||||
|
{
|
||||||
|
foreach (DeviceChangeEventFunctionContext deviceChangeEventFuncContext in deviceChangeEventList.Values)
|
||||||
|
{
|
||||||
|
deviceChangeEventFuncContext.changeEventCallbackFunc(deviceId, changeEvent, changeType, deviceChangeEventFuncContext.callbackId, deviceChangeEventFuncContext.context);
|
||||||
|
GC.Collect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event function wrapper that will call all registered listening functions with C#-arguments when
|
||||||
|
/// this listening function is called from telldus core, with C++-style arguments. This function will
|
||||||
|
/// be registered with telldus core when the first listening callback function is added.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">Received data</param>
|
||||||
|
/// <param name="controllerId">Id of receiving controller</param>
|
||||||
|
/// <param name="callbackId">Callback event id</param>
|
||||||
|
/// <param name="context">Context (optional)</param>
|
||||||
|
/// <returns>0</returns>
|
||||||
|
private unsafe void rawListeningFunction(char* data, int controllerId, int callbackId, void* context)
|
||||||
|
{
|
||||||
|
foreach (RawEventFunctionContext rawListeningFuncContext in rawListenerList.Values)
|
||||||
|
{
|
||||||
|
rawListeningFuncContext.rawCallbackFunc(getString(data, false), controllerId, rawListeningFuncContext.callbackId, rawListeningFuncContext.context);
|
||||||
|
GC.Collect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
56
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.csproj
Normal file
56
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.csproj
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>9.0.30729</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>TelldusNETWrapper</RootNamespace>
|
||||||
|
<AssemblyName>TelldusNETWrapper</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkSubset>
|
||||||
|
</TargetFrameworkSubset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="TelldusNETWrapper.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="app.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
20
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.sln
Normal file
20
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.sln
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual Studio 2008
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelldusNETWrapper", "TelldusNETWrapper.csproj", "{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
BIN
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.suo
Normal file
BIN
bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.suo
Normal file
Binary file not shown.
3
bindings/dotnet/TelldusNETWrapper/app.config
Normal file
3
bindings/dotnet/TelldusNETWrapper/app.config
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<configuration>
|
||||||
|
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
|
||||||
BIN
bindings/dotnet/example/BasicListDevicesNetExample.zip
Normal file
BIN
bindings/dotnet/example/BasicListDevicesNetExample.zip
Normal file
Binary file not shown.
BIN
bindings/dotnet/example/BasicTurnOnDeviceNetExample.zip
Normal file
BIN
bindings/dotnet/example/BasicTurnOnDeviceNetExample.zip
Normal file
Binary file not shown.
98
bindings/java/example/test.java
Normal file
98
bindings/java/example/test.java
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
class test
|
||||||
|
{
|
||||||
|
tellstick TS = new tellstick();
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
|
||||||
|
int nbrDevices = TS.devGetNumberOfDevices();
|
||||||
|
for (int i = 0; i < nbrDevices; i++) {
|
||||||
|
int id = TS.devGetDeviceId(i);
|
||||||
|
String deviceName = TS.devGetName(id);
|
||||||
|
System.out.println(id + "\t" + deviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.print("Enter a device: ");
|
||||||
|
int device = Integer.parseInt(in.readLine());
|
||||||
|
process(device);
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void process(int device) {
|
||||||
|
try {
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
int methods = TS.devMethods(device);
|
||||||
|
if ((methods & TS.TELLSTICK_TURNON) > 0) {
|
||||||
|
System.out.println(TS.TELLSTICK_TURNON + "\tTurn on");
|
||||||
|
}
|
||||||
|
if ((methods & TS.TELLSTICK_TURNOFF) > 0) {
|
||||||
|
System.out.println(TS.TELLSTICK_TURNOFF + "\tTurn off");
|
||||||
|
}
|
||||||
|
if ((methods & TS.TELLSTICK_BELL) > 0) {
|
||||||
|
System.out.println(TS.TELLSTICK_BELL + "\tBell");
|
||||||
|
}
|
||||||
|
if ((methods & TS.TELLSTICK_DIM) > 0) {
|
||||||
|
System.out.println(TS.TELLSTICK_DIM + "\tDim");
|
||||||
|
}
|
||||||
|
System.out.println("What do you want to do?");
|
||||||
|
int action = Integer.parseInt(in.readLine());
|
||||||
|
if ( (action & methods) == 0 ) {
|
||||||
|
System.out.println("The device doesn't support this method");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((action & TS.TELLSTICK_TURNON) > 0) {
|
||||||
|
turnOn(device);
|
||||||
|
} else if ((action & TS.TELLSTICK_TURNOFF) > 0) {
|
||||||
|
turnOff(device);
|
||||||
|
} else if ((action & TS.TELLSTICK_BELL) > 0) {
|
||||||
|
bell(device);
|
||||||
|
} else if ((action & TS.TELLSTICK_DIM) > 0) {
|
||||||
|
dim(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void turnOn(int device) {
|
||||||
|
System.out.println("Turning on " + TS.devGetName(device));
|
||||||
|
TS.devTurnOn(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void turnOff(int device) {
|
||||||
|
System.out.println("Turning off " + TS.devGetName(device));
|
||||||
|
TS.devTurnOff(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void bell(int device) {
|
||||||
|
System.out.println("Sending bell to " + TS.devGetName(device));
|
||||||
|
TS.devBell(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dim(int device) {
|
||||||
|
try {
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
System.out.print("Select level (0-255): ");
|
||||||
|
int level = Integer.parseInt(in.readLine());
|
||||||
|
if (level >= 256 || level < 0) {
|
||||||
|
System.out.println("Out of range");
|
||||||
|
}
|
||||||
|
System.out.println("Dim " + TS.devGetName(device));
|
||||||
|
TS.devDim(device, level);
|
||||||
|
} catch (IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
test t = new test();
|
||||||
|
t.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
60
bindings/java/tellstick.c
Normal file
60
bindings/java/tellstick.c
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*tellstick.c*/
|
||||||
|
#include "tellstick.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <TellUsbD101.h>
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_tellstick_devTurnOn(JNIEnv *, jobject, jint intDeviceId)
|
||||||
|
{
|
||||||
|
return (jboolean) devTurnOn( (int)intDeviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_tellstick_devTurnOff(JNIEnv *, jobject, jint intDeviceId)
|
||||||
|
{
|
||||||
|
return (jboolean) devTurnOff( (int)intDeviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_tellstick_devBell(JNIEnv *, jobject, jint intDeviceId)
|
||||||
|
{
|
||||||
|
return (jboolean) devBell( (int)intDeviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_tellstick_devDim(JNIEnv *, jobject, jint intDeviceId, jint level)
|
||||||
|
{
|
||||||
|
return (jboolean) devDim( (int)intDeviceId, (unsigned char) level);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_tellstick_devMethods(JNIEnv *, jobject, jint intDeviceId)
|
||||||
|
{
|
||||||
|
return (jint) devMethods( (int)intDeviceId );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_tellstick_devGetNumberOfDevices(JNIEnv *, jobject)
|
||||||
|
{
|
||||||
|
return (jint)devGetNumberOfDevices();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_tellstick_devGetDeviceId(JNIEnv *, jobject, jint intDeviceIndex)
|
||||||
|
{
|
||||||
|
return (jint)devGetDeviceId( (int)intDeviceIndex );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL
|
||||||
|
Java_tellstick_devGetName(JNIEnv *env, jobject, jint intDeviceId)
|
||||||
|
{
|
||||||
|
const char *name = devGetName( (int)intDeviceId );
|
||||||
|
return env->NewStringUTF(name);
|
||||||
|
}
|
||||||
77
bindings/java/tellstick.h
Normal file
77
bindings/java/tellstick.h
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class tellstick */
|
||||||
|
|
||||||
|
#ifndef _Included_tellstick
|
||||||
|
#define _Included_tellstick
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devTurnOn
|
||||||
|
* Signature: (I)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_tellstick_devTurnOn
|
||||||
|
(JNIEnv *, jobject, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devTurnOff
|
||||||
|
* Signature: (I)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_tellstick_devTurnOff
|
||||||
|
(JNIEnv *, jobject, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devBell
|
||||||
|
* Signature: (I)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_tellstick_devBell
|
||||||
|
(JNIEnv *, jobject, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devDim
|
||||||
|
* Signature: (II)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_tellstick_devDim
|
||||||
|
(JNIEnv *, jobject, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devMethods
|
||||||
|
* Signature: (I)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_tellstick_devMethods
|
||||||
|
(JNIEnv *, jobject, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devGetNumberOfDevices
|
||||||
|
* Signature: ()I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_tellstick_devGetNumberOfDevices
|
||||||
|
(JNIEnv *, jobject);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devGetDeviceId
|
||||||
|
* Signature: (I)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_tellstick_devGetDeviceId
|
||||||
|
(JNIEnv *, jobject, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: tellstick
|
||||||
|
* Method: devGetName
|
||||||
|
* Signature: (I)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_tellstick_devGetName
|
||||||
|
(JNIEnv *, jobject, jint);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
27
bindings/java/tellstick.java
Normal file
27
bindings/java/tellstick.java
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
//firstJNI.java
|
||||||
|
|
||||||
|
public class tellstick
|
||||||
|
{
|
||||||
|
public final int TELLSTICK_TURNON = 1;
|
||||||
|
public final int TELLSTICK_TURNOFF = 2;
|
||||||
|
public final int TELLSTICK_BELL = 4;
|
||||||
|
public final int TELLSTICK_DIM = 16;
|
||||||
|
|
||||||
|
public native boolean devTurnOn(int intDeviceId);
|
||||||
|
public native boolean devTurnOff(int intDeviceId);
|
||||||
|
public native boolean devBell(int intDeviceId);
|
||||||
|
public native boolean devDim(int intDeviceId, int level);
|
||||||
|
public native int devMethods(int intDeviceId);
|
||||||
|
|
||||||
|
public native int devGetNumberOfDevices();
|
||||||
|
public native int devGetDeviceId(int intDeviceIndex);
|
||||||
|
|
||||||
|
public native String devGetName(int intDeviceId);
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.loadLibrary("tellstickJNI");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
42
bindings/php/config.m4
Normal file
42
bindings/php/config.m4
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
PHP_ARG_ENABLE(telldus, whether to enable Telldus TellStick support,
|
||||||
|
[ --enable-telldus Enable Telldus TellStick support])
|
||||||
|
|
||||||
|
if test "$PHP_TELLDUS" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_TELLDUS, 1, [Whether you have Telldus TellStick])
|
||||||
|
|
||||||
|
SEARCH_PATH="/usr/local /usr"
|
||||||
|
SEARCH_FOR="/include/telldus-core.h"
|
||||||
|
if test -r $PHP_TELLDUS/; then # path given as parameter
|
||||||
|
TELLDUS_DIR=$PHP_TELLDUS
|
||||||
|
else # search default path list
|
||||||
|
AC_MSG_CHECKING([for telldus files in default path])
|
||||||
|
for i in $SEARCH_PATH ; do
|
||||||
|
if test -r $i/$SEARCH_FOR; then
|
||||||
|
TELLDUS_DIR=$i
|
||||||
|
AC_MSG_RESULT(found in $i)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if test -z "$TELLDUS_DIR"; then
|
||||||
|
AC_MSG_RESULT([not found])
|
||||||
|
AC_MSG_ERROR([Please reinstall the telldus-core distribution])
|
||||||
|
fi
|
||||||
|
# --enable-telldus -> add include path
|
||||||
|
PHP_ADD_INCLUDE($TELLDUS_DIR/include)
|
||||||
|
# --enable-telldus -> check for lib and symbol presence
|
||||||
|
LIBNAME=telldus-core
|
||||||
|
LIBSYMBOL=tdGetNumberOfDevices
|
||||||
|
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
|
||||||
|
[
|
||||||
|
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $TELLDUS_DIR/lib, TELLDUS_SHARED_LIBADD)
|
||||||
|
AC_DEFINE(HAVE_TELLDUSLIB,1,[ ])
|
||||||
|
],[
|
||||||
|
AC_MSG_ERROR([wrong telldus lib version or lib not found])
|
||||||
|
],[
|
||||||
|
-L$TELLDUS_DIR/lib -lm
|
||||||
|
])
|
||||||
|
PHP_SUBST(TELLDUS_SHARED_LIBADD)
|
||||||
|
|
||||||
|
PHP_NEW_EXTENSION(telldus, telldus.c, $ext_shared)
|
||||||
|
fi
|
||||||
|
|
||||||
43
bindings/php/example/example.php
Normal file
43
bindings/php/example/example.php
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
if(!extension_loaded('telldus')) {
|
||||||
|
dl('telldus.' . PHP_SHLIB_SUFFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
$devices = tdGetNumberOfDevices();
|
||||||
|
printf("Devices: %d\n", $devices);
|
||||||
|
|
||||||
|
$allMethods = TELLDUS_TURNON | TELLDUS_TURNOFF | TELLDUS_BELL | TELLDUS_DIM;
|
||||||
|
|
||||||
|
for( $i = 0; $i < $devices; ++$i ) {
|
||||||
|
$id = tdGetDeviceId( $i );
|
||||||
|
$name = utf8_encode(tdGetName( $id ));
|
||||||
|
printf("%s - %s\n", $id, $name);
|
||||||
|
|
||||||
|
$methods = tdMethods( $id, $allMethods );
|
||||||
|
if ($methods & TELLDUS_TURNON) {
|
||||||
|
echo " * TurnOn\n";
|
||||||
|
tdTurnOn( $id );
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
if ($methods & TELLDUS_TURNOFF) {
|
||||||
|
echo " * TurnOff\n";
|
||||||
|
tdTurnOff( $id );
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
if ($methods & TELLDUS_BELL) {
|
||||||
|
echo " * Bell\n";
|
||||||
|
tdBell( $id );
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
if ($methods & TELLDUS_TOGGLE) {
|
||||||
|
echo " * Toggle\n";
|
||||||
|
}
|
||||||
|
if ($methods & TELLDUS_DIM) {
|
||||||
|
echo " * Dim\n";
|
||||||
|
tdDim( $id, 128 );
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
47
bindings/php/php_telldus.h
Normal file
47
bindings/php/php_telldus.h
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
#ifndef PHP_TELLDUS_H
|
||||||
|
#define PHP_TELLDUS_H 1
|
||||||
|
|
||||||
|
#define PHP_TELLDUS_VERSION "2.0.2"
|
||||||
|
#define PHP_TELLDUS_EXTNAME "telldus"
|
||||||
|
|
||||||
|
PHP_MINIT_FUNCTION(telldus);
|
||||||
|
PHP_MSHUTDOWN_FUNCTION(telldus);
|
||||||
|
PHP_RINIT_FUNCTION(telldus);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdInit);
|
||||||
|
PHP_FUNCTION(tdClose);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdTurnOn);
|
||||||
|
PHP_FUNCTION(tdTurnOff);
|
||||||
|
PHP_FUNCTION(tdBell);
|
||||||
|
PHP_FUNCTION(tdDim);
|
||||||
|
PHP_FUNCTION(tdLearn);
|
||||||
|
PHP_FUNCTION(tdMethods);
|
||||||
|
PHP_FUNCTION(tdLastSentCommand);
|
||||||
|
PHP_FUNCTION(tdLastSentValue);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetNumberOfDevices);
|
||||||
|
PHP_FUNCTION(tdGetDeviceId);
|
||||||
|
PHP_FUNCTION(tdGetDeviceType);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetErrorString);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetName);
|
||||||
|
PHP_FUNCTION(tdSetName);
|
||||||
|
PHP_FUNCTION(tdGetProtocol);
|
||||||
|
PHP_FUNCTION(tdSetProtocol);
|
||||||
|
PHP_FUNCTION(tdGetModel);
|
||||||
|
PHP_FUNCTION(tdSetModel);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetDeviceParameter);
|
||||||
|
PHP_FUNCTION(tdSetDeviceParameter);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdAddDevice);
|
||||||
|
PHP_FUNCTION(tdRemoveDevice);
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdSendRawCommand);
|
||||||
|
|
||||||
|
extern zend_module_entry telldus_module_entry;
|
||||||
|
#define phpext_telldus_ptr &telldus_module_entry
|
||||||
|
|
||||||
|
#endif
|
||||||
401
bindings/php/telldus.c
Normal file
401
bindings/php/telldus.c
Normal file
|
|
@ -0,0 +1,401 @@
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "php.h"
|
||||||
|
#include "php_telldus.h"
|
||||||
|
#include <telldus-core.h>
|
||||||
|
|
||||||
|
|
||||||
|
static function_entry telldus_functions[] = {
|
||||||
|
PHP_FE(tdInit, NULL)
|
||||||
|
PHP_FE(tdClose, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdTurnOn, NULL)
|
||||||
|
PHP_FE(tdTurnOff, NULL)
|
||||||
|
PHP_FE(tdBell, NULL)
|
||||||
|
PHP_FE(tdDim, NULL)
|
||||||
|
PHP_FE(tdLearn, NULL)
|
||||||
|
PHP_FE(tdMethods, NULL)
|
||||||
|
PHP_FE(tdLastSentCommand, NULL)
|
||||||
|
PHP_FE(tdLastSentValue, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdGetNumberOfDevices, NULL)
|
||||||
|
PHP_FE(tdGetDeviceId, NULL)
|
||||||
|
PHP_FE(tdGetDeviceType, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdGetErrorString, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdGetName, NULL)
|
||||||
|
PHP_FE(tdSetName, NULL)
|
||||||
|
PHP_FE(tdGetProtocol, NULL)
|
||||||
|
PHP_FE(tdSetProtocol, NULL)
|
||||||
|
PHP_FE(tdGetModel, NULL)
|
||||||
|
PHP_FE(tdSetModel, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdGetDeviceParameter, NULL)
|
||||||
|
PHP_FE(tdSetDeviceParameter, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdAddDevice, NULL)
|
||||||
|
PHP_FE(tdRemoveDevice, NULL)
|
||||||
|
|
||||||
|
PHP_FE(tdSendRawCommand, NULL)
|
||||||
|
|
||||||
|
{NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
zend_module_entry telldus_module_entry = {
|
||||||
|
#if ZEND_MODULE_API_NO >= 20010901
|
||||||
|
STANDARD_MODULE_HEADER,
|
||||||
|
#endif
|
||||||
|
PHP_TELLDUS_EXTNAME,
|
||||||
|
telldus_functions,
|
||||||
|
PHP_MINIT(telldus),
|
||||||
|
PHP_MSHUTDOWN(telldus),
|
||||||
|
PHP_RINIT(telldus),
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
#if ZEND_MODULE_API_NO >= 20010901
|
||||||
|
PHP_TELLDUS_VERSION,
|
||||||
|
#endif
|
||||||
|
STANDARD_MODULE_PROPERTIES
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef COMPILE_DL_TELLDUS
|
||||||
|
ZEND_GET_MODULE(telldus)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
PHP_RINIT_FUNCTION(telldus)
|
||||||
|
{
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_MINIT_FUNCTION(telldus)
|
||||||
|
{
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_TURNON", TELLSTICK_TURNON, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_TURNOFF", TELLSTICK_TURNOFF, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_BELL", TELLSTICK_BELL, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_TOGGLE", TELLSTICK_TOGGLE, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_DIM", TELLSTICK_DIM, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_LEARN", TELLSTICK_LEARN, CONST_CS | CONST_PERSISTENT);
|
||||||
|
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_SUCCESS", TELLSTICK_SUCCESS, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_NOT_FOUND", TELLSTICK_ERROR_NOT_FOUND, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_PERMISSION_DENIED", TELLSTICK_ERROR_PERMISSION_DENIED, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_DEVICE_NOT_FOUND", TELLSTICK_ERROR_DEVICE_NOT_FOUND, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_METHOD_NOT_SUPPORTED", TELLSTICK_ERROR_METHOD_NOT_SUPPORTED, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_COMMUNICATION", TELLSTICK_ERROR_COMMUNICATION, CONST_CS | CONST_PERSISTENT);
|
||||||
|
//REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_CONNECTING_SERVICE", TELLSTICK_ERROR_CONNECTING_SERVICE, CONST_CS | CONST_PERSISTENT);
|
||||||
|
//REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_UNKNOWN_RESPONSE", TELLSTICK_ERROR_UNKNOWN_RESPONSE, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_UNKNOWN", TELLSTICK_ERROR_UNKNOWN, CONST_CS | CONST_PERSISTENT);
|
||||||
|
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_TYPE_DEVICE", TELLSTICK_TYPE_DEVICE, CONST_CS | CONST_PERSISTENT);
|
||||||
|
REGISTER_LONG_CONSTANT("TELLSTICK_TYPE_GROUP", TELLSTICK_TYPE_GROUP, CONST_CS | CONST_PERSISTENT);
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_MSHUTDOWN_FUNCTION(telldus)
|
||||||
|
{
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdInit)
|
||||||
|
{
|
||||||
|
tdInit();
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdClose)
|
||||||
|
{
|
||||||
|
tdClose();
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdTurnOn)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdTurnOn( id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdTurnOff)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdTurnOff( id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdBell)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdBell( id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdDim)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
long level;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &id, &level) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
if (level < 0 || level > 255) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdDim( id, level ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdLearn)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdLearn( id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdMethods)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
long supportedMethods;
|
||||||
|
long methods;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &id, &supportedMethods) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
methods = tdMethods( id, supportedMethods );
|
||||||
|
RETURN_LONG(methods);
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdLastSentCommand)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
long supportedMethods;
|
||||||
|
long command;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &id, &supportedMethods) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
command = tdLastSentCommand( id, supportedMethods );
|
||||||
|
RETURN_LONG(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdLastSentValue)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *value, *retval;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
value = tdLastSentValue( id );
|
||||||
|
retval = estrdup(value);
|
||||||
|
tdReleaseString(value);
|
||||||
|
RETURN_STRING(retval, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetNumberOfDevices)
|
||||||
|
{
|
||||||
|
int nbr = tdGetNumberOfDevices();
|
||||||
|
RETURN_LONG(nbr);
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetDeviceId)
|
||||||
|
{
|
||||||
|
long index;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) {
|
||||||
|
RETURN_LONG(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_LONG( tdGetDeviceId( index ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetDeviceType)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_LONG(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_LONG( tdGetDeviceType( id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetErrorString)
|
||||||
|
{
|
||||||
|
long errorNo;
|
||||||
|
char *errorString, *retval;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &errorNo) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
errorString = tdGetErrorString( errorNo );
|
||||||
|
retval = estrdup(errorString);
|
||||||
|
tdReleaseString(errorString);
|
||||||
|
RETURN_STRING( retval, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetName)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *name, *retval;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
name = tdGetName( id );
|
||||||
|
retval = estrdup(name);
|
||||||
|
tdReleaseString(name);
|
||||||
|
RETURN_STRING( retval, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdSetName)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *name;
|
||||||
|
int nameLen;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &id, &name, &nameLen) == FAILURE) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdSetName( id, name ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetProtocol)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *protocol, *retval;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol = tdGetProtocol( id );
|
||||||
|
retval = estrdup(protocol);
|
||||||
|
tdReleaseString(protocol);
|
||||||
|
RETURN_STRING( retval, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdSetProtocol)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *protocol;
|
||||||
|
int protocolLen;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &id, &protocol, &protocolLen) == FAILURE) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdSetProtocol( id, protocol ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetModel)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *model, *retval;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
model = tdGetModel( id );
|
||||||
|
retval = estrdup(model);
|
||||||
|
tdReleaseString(model);
|
||||||
|
RETURN_STRING( retval, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdSetModel)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *model;
|
||||||
|
int modelLen;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &id, &model, &modelLen) == FAILURE) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdSetModel( id, model ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdGetDeviceParameter)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *param, *name, *defaultValue, *retval;
|
||||||
|
int nameLen, defaultValueLen;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lss", &id, &name, &nameLen, &defaultValue, &defaultValueLen) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
param = tdGetDeviceParameter( id, name, defaultValue );
|
||||||
|
retval = estrdup(param);
|
||||||
|
tdReleaseString(param);
|
||||||
|
RETURN_STRING( retval, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdSetDeviceParameter)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char *name, *value;
|
||||||
|
int nameLen, valueLen;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lss", &id, &name, &nameLen, &value, &valueLen) == FAILURE) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL( tdSetDeviceParameter( id, name, value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdAddDevice)
|
||||||
|
{
|
||||||
|
RETURN_LONG(tdAddDevice());
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdRemoveDevice)
|
||||||
|
{
|
||||||
|
long deviceId;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &deviceId) == FAILURE) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_BOOL(tdRemoveDevice(deviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
PHP_FUNCTION(tdSendRawCommand)
|
||||||
|
{
|
||||||
|
char *command;
|
||||||
|
int commandLen;
|
||||||
|
long reserved = 0;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &command, &commandLen, &reserved) == FAILURE) {
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_LONG(tdSendRawCommand(command, reserved));
|
||||||
|
}
|
||||||
3
bindings/python/native/MANIFEST.in
Normal file
3
bindings/python/native/MANIFEST.in
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
include telldus.c
|
||||||
|
include telldus-core.h
|
||||||
|
recursive-include example/*
|
||||||
0
bindings/python/native/example/__init__.py
Normal file
0
bindings/python/native/example/__init__.py
Normal file
47
bindings/python/native/example/basic.py
Normal file
47
bindings/python/native/example/basic.py
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
|
||||||
|
import telldus
|
||||||
|
import time
|
||||||
|
|
||||||
|
telldus.tdInit()
|
||||||
|
devices = telldus.tdGetNumberOfDevices()
|
||||||
|
print "Devices: %d\n" % devices
|
||||||
|
|
||||||
|
allMethods = telldus.TELLSTICK_TURNON | telldus.TELLSTICK_TURNOFF | telldus.TELLSTICK_BELL | telldus.TELLSTICK_DIM
|
||||||
|
|
||||||
|
for i in xrange(devices):
|
||||||
|
deviceid = telldus.tdGetDeviceId(i)
|
||||||
|
|
||||||
|
if deviceid:
|
||||||
|
name = telldus.tdGetName(deviceid)
|
||||||
|
|
||||||
|
print "%s - %s\n" % (deviceid, name)
|
||||||
|
|
||||||
|
methods = telldus.tdMethods(deviceid, allMethods)
|
||||||
|
|
||||||
|
if methods & telldus.TELLSTICK_TURNON:
|
||||||
|
print " * TurnOn\n"
|
||||||
|
telldus.tdTurnOn(deviceid)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if methods & telldus.TELLSTICK_TURNOFF:
|
||||||
|
print " * TurnOff\n"
|
||||||
|
telldus.tdTurnOff(deviceid)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if methods & telldus.TELLSTICK_BELL:
|
||||||
|
print " * Bell\n"
|
||||||
|
telldus.tdBell(deviceid)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
if methods & telldus.TELLSTICK_TOGGLE:
|
||||||
|
print " * Toggle\n"
|
||||||
|
|
||||||
|
if methods & telldus.TELLSTICK_DIM:
|
||||||
|
print " * Dim\n"
|
||||||
|
telldus.tdDim(deviceid, 128)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
telldus.tdClose()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
38
bindings/python/native/example/callback.py
Normal file
38
bindings/python/native/example/callback.py
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
import threading
|
||||||
|
import telldus
|
||||||
|
import time
|
||||||
|
|
||||||
|
telldus.tdInit()
|
||||||
|
|
||||||
|
def turnOn():
|
||||||
|
print "turning on"
|
||||||
|
telldus.tdTurnOn(1)
|
||||||
|
|
||||||
|
def turnOff():
|
||||||
|
print "turning off"
|
||||||
|
telldus.tdTurnOff(1)
|
||||||
|
|
||||||
|
def callback(deviceId, method, value, callbackId):
|
||||||
|
print "callback"
|
||||||
|
print "DeviceId: %i Method: %i Value: %s" % (deviceId, method, value)
|
||||||
|
return True
|
||||||
|
|
||||||
|
#function to be called when device event occurs, even for unregistered devices
|
||||||
|
def rawcallback(data, controllerId, callbackId):
|
||||||
|
print "raw callback"
|
||||||
|
print "Data: %s ControllerId: %i" % (data, controllerId)
|
||||||
|
return True
|
||||||
|
|
||||||
|
callbackid = telldus.tdRegisterDeviceEvent(callback)
|
||||||
|
rawcallbackid = telldus.tdRegisterRawDeviceEvent(rawcallback)
|
||||||
|
|
||||||
|
print callbackid, rawcallbackid
|
||||||
|
|
||||||
|
try:
|
||||||
|
while(1):
|
||||||
|
time.sleep(0.5) #don't exit
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print "Exiting"
|
||||||
|
telldus.tdUnregisterCallback(callbackid)
|
||||||
|
telldus.tdUnregisterCallback(rawcallbackid)
|
||||||
|
telldus.tdClose()
|
||||||
28
bindings/python/native/example/poll.py
Normal file
28
bindings/python/native/example/poll.py
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
import telldus
|
||||||
|
|
||||||
|
telldus.tdInit()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
result = telldus.tdSensor()
|
||||||
|
if not isinstance(result, tuple):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
protocol, model, sensorId, dataTypes = result
|
||||||
|
print "Protocol: %s,\tModel: %s,\tSensorId: %i\nDataTypes: %i" % (protocol, model, sensorId, dataTypes)
|
||||||
|
|
||||||
|
# Retrieve the values the sensor supports
|
||||||
|
if dataTypes & telldus.TELLSTICK_TEMPERATURE:
|
||||||
|
result = telldus.tdSensorValue(protocol, model, sensorId, telldus.TELLSTICK_TEMPERATURE)
|
||||||
|
if isinstance(result, tuple):
|
||||||
|
value, timestamp = result
|
||||||
|
print "Temperature:\t%sC\t(%s)\n" % (value, str(timestamp))
|
||||||
|
|
||||||
|
if dataTypes & telldus.TELLSTICK_HUMIDITY:
|
||||||
|
result = telldus.tdSensorValue(protocol, model, sensorId, telldus.TELLSTICK_HUMIDITY)
|
||||||
|
if isinstance(result, tuple):
|
||||||
|
value, timestamp = result
|
||||||
|
print "Humidity:\t%s\t(%s)\n" % (value, str(timestamp))
|
||||||
|
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
telldus.tdClose()
|
||||||
345
bindings/python/native/setup.py
Normal file
345
bindings/python/native/setup.py
Normal file
|
|
@ -0,0 +1,345 @@
|
||||||
|
import sys
|
||||||
|
from distutils.core import setup, Extension
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
PLATFORM_IS_WINDOWS = sys.platform.lower().startswith('win')
|
||||||
|
|
||||||
|
if PLATFORM_IS_WINDOWS:
|
||||||
|
|
||||||
|
__doc__="""This is a distutils setup-script for the telldus extension
|
||||||
|
|
||||||
|
To build the telldus extensions, simply execute:
|
||||||
|
python setup.py -q build
|
||||||
|
or
|
||||||
|
python setup.py -q install
|
||||||
|
to build and install into your current Python installation.
|
||||||
|
|
||||||
|
These extensions require a number of libraries to build, some of which may
|
||||||
|
require you to install special SDKs or toolkits. This script will attempt
|
||||||
|
to build as many as it can, and at the end of the build will report any
|
||||||
|
extension modules that could not be built and why.
|
||||||
|
|
||||||
|
This has got complicated due to the various different versions of
|
||||||
|
Visual Studio used - some VS versions are not compatible with some SDK
|
||||||
|
versions. Below are the Windows SDK versions required (and the URL - although
|
||||||
|
these are subject to being changed by MS at any time:)
|
||||||
|
|
||||||
|
Python 2.6+:
|
||||||
|
|
||||||
|
Build using Microsoft Visual Studio 2008 Express Edition:
|
||||||
|
http://www.microsoft.com/en-us/download/details.aspx?id=6506
|
||||||
|
http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/
|
||||||
|
http://www.cppblog.com/Files/xcpp/VCE64BIT_WIN7SDK.zip
|
||||||
|
|
||||||
|
For 32bit build:
|
||||||
|
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5
|
||||||
|
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b
|
||||||
|
Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars32.bat to
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat
|
||||||
|
|
||||||
|
For 64bit build:
|
||||||
|
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 (ISO) GRMSDKX_EN_DVD.iso
|
||||||
|
http://www.microsoft.com/en-us/download/details.aspx?id=18950
|
||||||
|
Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars64.bat to
|
||||||
|
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat
|
||||||
|
|
||||||
|
Python 2.3->2.5:
|
||||||
|
|
||||||
|
Microsoft Windows Software Development Kit Update for Windows Vista (version 6.0)
|
||||||
|
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4377f86d-c913-4b5c-b87e-ef72e5b4e065
|
||||||
|
** If you want to build Python 2.3, be sure to install the SDK compilers
|
||||||
|
too - although we don't use them, this setup option installs some .lib
|
||||||
|
files we do need.
|
||||||
|
**
|
||||||
|
|
||||||
|
If you multiple SDK versions on a single machine, set the MSSDK environment
|
||||||
|
variable to point at the one you want to use. Note that using the SDK for
|
||||||
|
a particular platform (eg, Windows 7) doesn't force you to use that OS as your
|
||||||
|
build environment. If the links above don't work, use google to find them.
|
||||||
|
|
||||||
|
Building:
|
||||||
|
---------
|
||||||
|
|
||||||
|
To install the telldus extension, execute:
|
||||||
|
python setup.py -q install
|
||||||
|
|
||||||
|
This will install the built extensions into your site-packages directory,
|
||||||
|
create an appropriate .pth file, and should leave everything ready to use.
|
||||||
|
There is no need to modify the registry.
|
||||||
|
|
||||||
|
To build or install debug (_d) versions of these extensions, ensure you have
|
||||||
|
built or installed a debug version of Python itself, then pass the "--debug"
|
||||||
|
flag to the build command - eg:
|
||||||
|
python setup.py -q build --debug
|
||||||
|
or to build and install a debug version:
|
||||||
|
python setup.py -q build --debug install
|
||||||
|
|
||||||
|
To build 64bit versions of this:
|
||||||
|
|
||||||
|
* py2.5 and earlier - sorry, I've given up in disgust. Using VS2003 with
|
||||||
|
the Vista SDK is just too painful to make work, and VS2005 is not used for
|
||||||
|
any released versions of Python. See revision 1.69 of this file for the
|
||||||
|
last version that attempted to support and document this process.
|
||||||
|
|
||||||
|
* 2.6 and later: On a 64bit OS, just build as you would on a 32bit platform.
|
||||||
|
On a 32bit platform (ie, to cross-compile), you must use VS2008 to
|
||||||
|
cross-compile Python itself. Note that by default, the 64bit tools are not
|
||||||
|
installed with VS2008, so you may need to adjust your VS2008 setup (see "For 64bit build"). Then
|
||||||
|
use:
|
||||||
|
vcs
|
||||||
|
setup.py build --plat-name=win-amd64
|
||||||
|
|
||||||
|
see the distutils cross-compilation documentation for more details.
|
||||||
|
"""
|
||||||
|
# Originally by Thomas Heller, started in 2000 or so.
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
is_py3k = sys.version_info > (3,) # get this out of the way early on...
|
||||||
|
# We have special handling for _winreg so our setup3.py script can avoid
|
||||||
|
# using the 'imports' fixer and therefore start much faster...
|
||||||
|
if is_py3k:
|
||||||
|
import winreg as _winreg
|
||||||
|
else:
|
||||||
|
import _winreg
|
||||||
|
|
||||||
|
try:
|
||||||
|
from distutils import log
|
||||||
|
except ImportError:
|
||||||
|
class Log:
|
||||||
|
def debug(self, msg, *args):
|
||||||
|
print msg % args
|
||||||
|
def info(self, msg, *args):
|
||||||
|
print msg % args
|
||||||
|
log = Log()
|
||||||
|
|
||||||
|
try:
|
||||||
|
this_file = __file__
|
||||||
|
except NameError:
|
||||||
|
this_file = sys.argv[0]
|
||||||
|
|
||||||
|
this_file = os.path.abspath(this_file)
|
||||||
|
# We get upset if the cwd is not our source dir, but it is a PITA to
|
||||||
|
# insist people manually CD there first!
|
||||||
|
if os.path.dirname(this_file):
|
||||||
|
os.chdir(os.path.dirname(this_file))
|
||||||
|
|
||||||
|
|
||||||
|
# We need to know the platform SDK dir before we can list the extensions.
|
||||||
|
def find_platform_sdk_dir():
|
||||||
|
# Finding the Platform SDK install dir is a treat. There can be some
|
||||||
|
# dead ends so we only consider the job done if we find the "windows.h"
|
||||||
|
# landmark.
|
||||||
|
landmark = "include\\windows.h"
|
||||||
|
# 1. The use might have their current environment setup for the
|
||||||
|
# SDK, in which case the "MSSdk" env var is set.
|
||||||
|
sdkdir = os.environ.get("MSSdk")
|
||||||
|
if sdkdir:
|
||||||
|
if DEBUG:
|
||||||
|
print "PSDK: try %%MSSdk%%: '%s'" % sdkdir
|
||||||
|
if os.path.isfile(os.path.join(sdkdir, landmark)):
|
||||||
|
return sdkdir
|
||||||
|
# 2. The "Install Dir" value in the
|
||||||
|
# HKLM\Software\Microsoft\MicrosoftSDK\Directories registry key
|
||||||
|
# sometimes points to the right thing. However, after upgrading to
|
||||||
|
# the "Platform SDK for Windows Server 2003 SP1" this is dead end.
|
||||||
|
try:
|
||||||
|
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
|
||||||
|
r"Software\Microsoft\MicrosoftSDK\Directories")
|
||||||
|
sdkdir, ignore = _winreg.QueryValueEx(key, "Install Dir")
|
||||||
|
except EnvironmentError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if DEBUG:
|
||||||
|
print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\
|
||||||
|
"\Directories\Install Dir': '%s'" % sdkdir
|
||||||
|
if os.path.isfile(os.path.join(sdkdir, landmark)):
|
||||||
|
return sdkdir
|
||||||
|
# 3. Each installed SDK (not just the platform SDK) seems to have GUID
|
||||||
|
# subkey of HKLM\Software\Microsoft\MicrosoftSDK\InstalledSDKs and
|
||||||
|
# it *looks* like the latest installed Platform SDK will be the
|
||||||
|
# only one with an "Install Dir" sub-value.
|
||||||
|
try:
|
||||||
|
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
|
||||||
|
r"Software\Microsoft\MicrosoftSDK\InstalledSDKs")
|
||||||
|
i = 0
|
||||||
|
while True:
|
||||||
|
guid = _winreg.EnumKey(key, i)
|
||||||
|
guidkey = _winreg.OpenKey(key, guid)
|
||||||
|
try:
|
||||||
|
sdkdir, ignore = _winreg.QueryValueEx(guidkey, "Install Dir")
|
||||||
|
except EnvironmentError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if DEBUG:
|
||||||
|
print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\
|
||||||
|
"\InstallSDKs\%s\Install Dir': '%s'"\
|
||||||
|
% (guid, sdkdir)
|
||||||
|
if os.path.isfile(os.path.join(sdkdir, landmark)):
|
||||||
|
return sdkdir
|
||||||
|
i += 1
|
||||||
|
except EnvironmentError:
|
||||||
|
pass
|
||||||
|
# 4. Vista's SDK
|
||||||
|
try:
|
||||||
|
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,
|
||||||
|
r"Software\Microsoft\Microsoft SDKs\Windows")
|
||||||
|
sdkdir, ignore = _winreg.QueryValueEx(key, "CurrentInstallFolder")
|
||||||
|
except EnvironmentError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if DEBUG:
|
||||||
|
print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDKs"\
|
||||||
|
"\Windows\CurrentInstallFolder': '%s'" % sdkdir
|
||||||
|
if os.path.isfile(os.path.join(sdkdir, landmark)):
|
||||||
|
return sdkdir
|
||||||
|
|
||||||
|
# 5. Failing this just try a few well-known default install locations.
|
||||||
|
progfiles = os.environ.get("ProgramFiles", r"C:\Program Files")
|
||||||
|
defaultlocs = [
|
||||||
|
os.path.join(progfiles, "Microsoft Platform SDK"),
|
||||||
|
os.path.join(progfiles, "Microsoft SDK"),
|
||||||
|
]
|
||||||
|
for sdkdir in defaultlocs:
|
||||||
|
if DEBUG:
|
||||||
|
print "PSDK: try default location: '%s'" % sdkdir
|
||||||
|
if os.path.isfile(os.path.join(sdkdir, landmark)):
|
||||||
|
return sdkdir
|
||||||
|
|
||||||
|
|
||||||
|
# Some nasty hacks to prevent most of our extensions using a manifest, as
|
||||||
|
# the manifest - even without a reference to the CRT assembly - is enough
|
||||||
|
# to prevent the extension from loading. For more details, see
|
||||||
|
# http://bugs.python.org/issue7833 - that issue has a patch, but it is
|
||||||
|
# languishing and will probably never be fixed for Python 2.6...
|
||||||
|
if sys.version_info > (2,6):
|
||||||
|
from distutils.spawn import spawn
|
||||||
|
from distutils.msvc9compiler import MSVCCompiler
|
||||||
|
MSVCCompiler._orig_spawn = MSVCCompiler.spawn
|
||||||
|
MSVCCompiler._orig_link = MSVCCompiler.link
|
||||||
|
|
||||||
|
# We need to override this method for versions where issue7833 *has* landed
|
||||||
|
# (ie, 2.7 and 3.2+)
|
||||||
|
def manifest_get_embed_info(self, target_desc, ld_args):
|
||||||
|
_want_assembly_kept = getattr(self, '_want_assembly_kept', False)
|
||||||
|
if not _want_assembly_kept:
|
||||||
|
return None
|
||||||
|
for arg in ld_args:
|
||||||
|
if arg.startswith("/MANIFESTFILE:"):
|
||||||
|
orig_manifest = arg.split(":", 1)[1]
|
||||||
|
if target_desc==self.EXECUTABLE:
|
||||||
|
rid = 1
|
||||||
|
else:
|
||||||
|
rid = 2
|
||||||
|
return orig_manifest, rid
|
||||||
|
return None
|
||||||
|
# always monkeypatch it in even though it will only be called in 2.7
|
||||||
|
# and 3.2+.
|
||||||
|
MSVCCompiler.manifest_get_embed_info = manifest_get_embed_info
|
||||||
|
|
||||||
|
def monkeypatched_spawn(self, cmd):
|
||||||
|
is_link = cmd[0].endswith("link.exe") or cmd[0].endswith('"link.exe"')
|
||||||
|
is_mt = cmd[0].endswith("mt.exe") or cmd[0].endswith('"mt.exe"')
|
||||||
|
_want_assembly_kept = getattr(self, '_want_assembly_kept', False)
|
||||||
|
if not _want_assembly_kept and is_mt:
|
||||||
|
# We don't want mt.exe run...
|
||||||
|
return
|
||||||
|
if not _want_assembly_kept and is_link:
|
||||||
|
# remove /MANIFESTFILE:... and add MANIFEST:NO
|
||||||
|
# (but note that for winxpgui, which specifies a manifest via a
|
||||||
|
# .rc file, this is ignored by the linker - the manifest specified
|
||||||
|
# in the .rc file is still added)
|
||||||
|
for i in range(len(cmd)):
|
||||||
|
if cmd[i].startswith("/MANIFESTFILE:"):
|
||||||
|
cmd[i] = "/MANIFEST:NO"
|
||||||
|
break
|
||||||
|
if _want_assembly_kept and is_mt:
|
||||||
|
# We want mt.exe run with the original manifest
|
||||||
|
for i in range(len(cmd)):
|
||||||
|
if cmd[i] == "-manifest":
|
||||||
|
cmd[i+1] = cmd[i+1] + ".orig"
|
||||||
|
break
|
||||||
|
self._orig_spawn(cmd)
|
||||||
|
if _want_assembly_kept and is_link:
|
||||||
|
# We want a copy of the original manifest so we can use it later.
|
||||||
|
for i in range(len(cmd)):
|
||||||
|
if cmd[i].startswith("/MANIFESTFILE:"):
|
||||||
|
mfname = cmd[i][14:]
|
||||||
|
shutil.copyfile(mfname, mfname + ".orig")
|
||||||
|
break
|
||||||
|
|
||||||
|
def monkeypatched_link(self, target_desc, objects, output_filename, *args, **kw):
|
||||||
|
# no manifests for 3.3+
|
||||||
|
self._want_assembly_kept = sys.version_info < (3,3) and \
|
||||||
|
(os.path.basename(output_filename).startswith("PyISAPI_loader.dll") or \
|
||||||
|
os.path.basename(output_filename).startswith("perfmondata.dll") or \
|
||||||
|
os.path.basename(output_filename).startswith("win32ui.pyd") or \
|
||||||
|
target_desc==self.EXECUTABLE)
|
||||||
|
try:
|
||||||
|
return self._orig_link(target_desc, objects, output_filename, *args, **kw)
|
||||||
|
finally:
|
||||||
|
delattr(self, '_want_assembly_kept')
|
||||||
|
MSVCCompiler.spawn = monkeypatched_spawn
|
||||||
|
MSVCCompiler.link = monkeypatched_link
|
||||||
|
|
||||||
|
def find_telldus_dev_dir():
|
||||||
|
landmark = "telldus-core.h"
|
||||||
|
dev_dir = os.environ.get("TELLDUS_DEVDIR")
|
||||||
|
if dev_dir:
|
||||||
|
if DEBUG:
|
||||||
|
print "Telldus dev dir:" % dev_dir
|
||||||
|
if os.path.isfile(os.path.join(dev_dir, landmark)):
|
||||||
|
return dev_dir
|
||||||
|
|
||||||
|
progfiles = os.environ.get("ProgramFiles", r"C:\Program Files")
|
||||||
|
defaultlocs = [
|
||||||
|
os.path.join(progfiles + ' (x86)', "Telldus", "Development"),
|
||||||
|
os.path.join(progfiles, "Telldus", "Development"),
|
||||||
|
]
|
||||||
|
for dev_dir in defaultlocs:
|
||||||
|
if DEBUG:
|
||||||
|
print "Telldus dev dir: '%s'" % dev_dir
|
||||||
|
if os.path.isfile(os.path.join(dev_dir, landmark)):
|
||||||
|
return dev_dir
|
||||||
|
if DEBUG:
|
||||||
|
print "Telldus dev dir not found, make sure dev code is installed. Or set TELLDUS_DEVDIR."
|
||||||
|
|
||||||
|
sdk_dir = find_platform_sdk_dir()
|
||||||
|
sdk_include_dir = os.path.join(sdk_dir, 'Include')
|
||||||
|
|
||||||
|
telldus_dev_dir = find_telldus_dev_dir()
|
||||||
|
telldus_platform = os.environ.get("TELLDUS_PLATFORM", 'x86_64')
|
||||||
|
telldus_library_dir = os.path.join(telldus_dev_dir, telldus_platform)
|
||||||
|
|
||||||
|
include_dirs = [sdk_include_dir, telldus_dev_dir]
|
||||||
|
library_dirs = [telldus_library_dir]
|
||||||
|
libraries = ['python%i%i' % (sys.version_info[0], sys.version_info[1]) , 'TelldusCore']
|
||||||
|
define_macros = [('_WINDOWS', 1)]
|
||||||
|
|
||||||
|
else:
|
||||||
|
include_dirs = ['/usr/include', '/usr/local/include']
|
||||||
|
library_dirs = ['/usr/lib', '/usr/local/lib']
|
||||||
|
libraries = ['telldus-core']
|
||||||
|
define_macros = []
|
||||||
|
|
||||||
|
define_macros.extend([('DATA_LENGTH', 20), ('CALLBACK_LENGTH', 20)])
|
||||||
|
|
||||||
|
telldus = Extension(
|
||||||
|
'telldus',
|
||||||
|
include_dirs = include_dirs,
|
||||||
|
libraries = libraries,
|
||||||
|
library_dirs = library_dirs,
|
||||||
|
define_macros = define_macros,
|
||||||
|
sources = ['telldus.c']
|
||||||
|
)
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name = 'telldus',
|
||||||
|
version = '1.0',
|
||||||
|
description = 'Python bindings for telldus',
|
||||||
|
author='Oyvind Saltvik',
|
||||||
|
author_email='oyvind.saltvik@gmail.com',
|
||||||
|
url='http://github.com/fivethreeo/telldus/',
|
||||||
|
ext_modules = [telldus]
|
||||||
|
)
|
||||||
843
bindings/python/native/telldus.c
Normal file
843
bindings/python/native/telldus.c
Normal file
|
|
@ -0,0 +1,843 @@
|
||||||
|
#include "Python.h"
|
||||||
|
#include "datetime.h"
|
||||||
|
#include <telldus-core.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* estrdup.c -- duplicate a string, die if error
|
||||||
|
*
|
||||||
|
* char *string;
|
||||||
|
* char *newstring;
|
||||||
|
* newstring = estrdup(string);
|
||||||
|
*
|
||||||
|
* estrdup returns a copy of its argument, located in memory
|
||||||
|
* allocated from the heap. If it is unable to allocate the
|
||||||
|
* necessary memory, estrdup executes PyErr_NoMemory();
|
||||||
|
* (Generally, the routine error is not expected to return,
|
||||||
|
* but if it does, estrdup will return NULL.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
int callbackLen = 0;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject *func;
|
||||||
|
int callbackId;
|
||||||
|
} callbackInfo;
|
||||||
|
|
||||||
|
static callbackInfo callbackList[CALLBACK_LENGTH];
|
||||||
|
|
||||||
|
void
|
||||||
|
addCallback(PyObject *func, int callbackId)
|
||||||
|
{
|
||||||
|
if (callbackLen < CALLBACK_LENGTH) {
|
||||||
|
callbackList[callbackLen].func = func;
|
||||||
|
callbackList[callbackLen].callbackId = callbackId;
|
||||||
|
callbackLen++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
removeCallback(int callbackId)
|
||||||
|
{
|
||||||
|
int index = -1;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (i = 0; i < callbackLen; i++)
|
||||||
|
{
|
||||||
|
if (callbackList[i].callbackId == callbackId)
|
||||||
|
{
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(index == -1)) {
|
||||||
|
for (j = index; j < callbackLen - 1; j++)
|
||||||
|
{
|
||||||
|
callbackList[j] = callbackList[j+1];
|
||||||
|
}
|
||||||
|
callbackLen--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
hasCallback(int callbackId)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < callbackLen; i++)
|
||||||
|
{
|
||||||
|
if (callbackList[i].callbackId == callbackId)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
getCallback(int callbackId)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < callbackLen; i++)
|
||||||
|
{
|
||||||
|
if (callbackList[i].callbackId == callbackId)
|
||||||
|
{
|
||||||
|
return callbackList[i].func;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
estrdup(char *s)
|
||||||
|
{
|
||||||
|
register char *t;
|
||||||
|
|
||||||
|
if (NULL == (t = malloc(strlen(s)+1))) {
|
||||||
|
PyErr_NoMemory();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(t, s);
|
||||||
|
return(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdInit(PyObject *self)
|
||||||
|
{
|
||||||
|
tdInit();
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdClose(PyObject *self)
|
||||||
|
{
|
||||||
|
tdClose();
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdTurnOn(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdTurnOn(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdTurnOff(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdTurnOff(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdBell(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdBell(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdDim(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
unsigned char level;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "lb", &id, &level))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (level < 0 || level > 255)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdDim(id, level));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdLearn(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdLearn(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdMethods(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
long supportedmethods;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdMethods(id, supportedmethods));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdLastSentCommand(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
long supportedmethods;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdLastSentCommand(id, supportedmethods));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdLastSentValue(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* value;
|
||||||
|
char* retval;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
value = tdLastSentValue(id);
|
||||||
|
retval = estrdup(value);
|
||||||
|
tdReleaseString(value);
|
||||||
|
return PyString_FromString(retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetNumberOfDevices(PyObject *self)
|
||||||
|
{
|
||||||
|
return PyLong_FromLong((long) tdGetNumberOfDevices());
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetDeviceId(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long index;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &index))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdGetDeviceId(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetDeviceType(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdGetDeviceType(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetErrorString(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long errorno;
|
||||||
|
char* errorString;
|
||||||
|
char* retval;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &errorno))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
errorString = tdGetErrorString(errorno);
|
||||||
|
retval = estrdup(errorString);
|
||||||
|
tdReleaseString(errorString);
|
||||||
|
return PyString_FromString(retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetName(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* name;
|
||||||
|
char* retval;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
name = tdGetName(id);
|
||||||
|
retval = estrdup(name);
|
||||||
|
tdReleaseString(name);
|
||||||
|
return PyString_FromString(retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSetName(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* name;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "ls", &id, &name))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdSetName(id, name));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetProtocol(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* protocol;
|
||||||
|
char* retval;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
protocol = tdGetProtocol(id);
|
||||||
|
retval = estrdup(protocol);
|
||||||
|
tdReleaseString(protocol);
|
||||||
|
return PyString_FromString(retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSetProtocol(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* protocol;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "ls", &id, &protocol))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdSetProtocol(id, protocol));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetModel(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* model;
|
||||||
|
char* retval;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
model = tdGetModel(id);
|
||||||
|
retval = estrdup(model);
|
||||||
|
tdReleaseString(model);
|
||||||
|
return PyString_FromString(retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSetModel(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* model;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "ls", &id, &model))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdSetProtocol(id, model));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdGetDeviceParameter(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* name;
|
||||||
|
char* defaultValue;
|
||||||
|
char* param;
|
||||||
|
char* retval;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "lss", &id, &name, &defaultValue))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
param = tdGetDeviceParameter(id, name, defaultValue);
|
||||||
|
retval = estrdup(param);
|
||||||
|
tdReleaseString(param);
|
||||||
|
return PyString_FromString(retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSetDeviceParameter(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
char* name;
|
||||||
|
char* value;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "lss", &id, &name, &value))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdSetDeviceParameter(id, name, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdAddDevice(PyObject *self)
|
||||||
|
{
|
||||||
|
return PyLong_FromLong((long) tdAddDevice());
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdRemoveDevice(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdRemoveDevice(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSendRawCommand(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
char *command;
|
||||||
|
long reserved = 0;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "s|l", &command, &reserved));
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdSendRawCommand(command, reserved));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *DeviceEventCallback = NULL;
|
||||||
|
|
||||||
|
void
|
||||||
|
telldus_deviceEventCallback(int deviceId, int method, const char *data, int callbackId, int context)
|
||||||
|
{
|
||||||
|
|
||||||
|
PyObject * result;
|
||||||
|
PyGILState_STATE gstate = PyGILState_Ensure();
|
||||||
|
|
||||||
|
// now call the Python callback function
|
||||||
|
result = PyObject_CallFunction(DeviceEventCallback, "llsl", deviceId, method, data, callbackId);
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
// something went wrong so print to stderr
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
|
||||||
|
// take care of reference handling
|
||||||
|
Py_XDECREF(result);
|
||||||
|
|
||||||
|
PyGILState_Release(gstate);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdRegisterDeviceEvent(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
|
||||||
|
int result;
|
||||||
|
PyObject *func;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "O:tdRegisterDeviceEvent", &func)) {
|
||||||
|
PyErr_SetString(PyExc_StandardError, "Parse error!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PyCallable_Check(func)) {
|
||||||
|
// Error
|
||||||
|
PyErr_SetString(PyExc_StandardError, "The object should be callable!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(DeviceEventCallback);
|
||||||
|
// stick around till we need you
|
||||||
|
Py_XINCREF(func);
|
||||||
|
|
||||||
|
DeviceEventCallback = func;
|
||||||
|
|
||||||
|
result = tdRegisterDeviceEvent((TDDeviceEvent) &telldus_deviceEventCallback, 0);
|
||||||
|
|
||||||
|
addCallback(func, result);
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *DeviceChangeEventCallback = NULL;
|
||||||
|
|
||||||
|
void
|
||||||
|
telldus_deviceChangeEventCallback(int deviceId, int changeEvent, int changeType, int callbackId, int context)
|
||||||
|
{
|
||||||
|
PyObject * result;
|
||||||
|
PyGILState_STATE gstate = PyGILState_Ensure();
|
||||||
|
|
||||||
|
// now call the Python callback function
|
||||||
|
result = PyObject_CallFunction(DeviceChangeEventCallback, "llll", deviceId, changeEvent, changeType, callbackId);
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
// something went wrong so print to stderr
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
|
||||||
|
// take care of reference handling
|
||||||
|
Py_XDECREF(result);
|
||||||
|
|
||||||
|
PyGILState_Release(gstate);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdRegisterDeviceChangeEvent(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
PyObject *func;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "O", &func)) {
|
||||||
|
PyErr_SetString(PyExc_StandardError, "Parse error!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PyCallable_Check(func)) {
|
||||||
|
// Error
|
||||||
|
PyErr_SetString(PyExc_StandardError, "The object should be callable!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(DeviceChangeEventCallback);
|
||||||
|
// stick around till we need you
|
||||||
|
Py_XINCREF(func);
|
||||||
|
|
||||||
|
DeviceChangeEventCallback = func;
|
||||||
|
|
||||||
|
result = tdRegisterDeviceChangeEvent((TDDeviceChangeEvent) &telldus_deviceChangeEventCallback, 0);
|
||||||
|
|
||||||
|
addCallback(func, result);
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *RawDeviceEventCallback = NULL;
|
||||||
|
|
||||||
|
void
|
||||||
|
telldus_rawDeviceEventCallback(const char *data, int controllerId, int callbackId, int context)
|
||||||
|
{
|
||||||
|
PyObject * result;
|
||||||
|
PyGILState_STATE gstate = PyGILState_Ensure();
|
||||||
|
|
||||||
|
// now call the Python callback function
|
||||||
|
result = PyObject_CallFunction(RawDeviceEventCallback, "sll", data, controllerId, callbackId);
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
// something went wrong so print to stderr
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
|
||||||
|
// take care of reference handling
|
||||||
|
Py_XDECREF(result);
|
||||||
|
|
||||||
|
PyGILState_Release(gstate);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdRegisterRawDeviceEvent(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
PyObject *func;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "O", &func)) {
|
||||||
|
PyErr_SetString(PyExc_StandardError, "Parse error!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PyCallable_Check(func)) {
|
||||||
|
// Error
|
||||||
|
PyErr_SetString(PyExc_StandardError, "The object should be callable!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(RawDeviceEventCallback);
|
||||||
|
// stick around till we need you
|
||||||
|
Py_XINCREF(func);
|
||||||
|
|
||||||
|
RawDeviceEventCallback = func;
|
||||||
|
|
||||||
|
result = tdRegisterRawDeviceEvent((TDRawDeviceEvent) &telldus_rawDeviceEventCallback, 0);
|
||||||
|
|
||||||
|
addCallback(func, result);
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *SensorEventCallback = NULL;
|
||||||
|
|
||||||
|
void
|
||||||
|
telldus_sensorEventCallback(const char *protocol, const char *model, int id, int dataType, const char *value, int timestamp, int callbackId, int context)
|
||||||
|
{
|
||||||
|
PyObject * result;
|
||||||
|
PyGILState_STATE gstate = PyGILState_Ensure();
|
||||||
|
|
||||||
|
// now call the Python callback function
|
||||||
|
result = PyObject_CallFunction(SensorEventCallback, "ssllsll", protocol, model, id, dataType, value, timestamp, callbackId);
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
// something went wrong so print to stderr
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
|
||||||
|
// take care of reference handling
|
||||||
|
Py_XDECREF(result);
|
||||||
|
|
||||||
|
PyGILState_Release(gstate);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdRegisterSensorEvent(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
PyObject *func;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "O", &func)) {
|
||||||
|
PyErr_SetString(PyExc_StandardError, "Parse error!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PyCallable_Check(func)) {
|
||||||
|
// Error
|
||||||
|
PyErr_SetString(PyExc_StandardError, "The object should be callable!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(SensorEventCallback);
|
||||||
|
// stick around till we need you
|
||||||
|
Py_XINCREF(func);
|
||||||
|
|
||||||
|
SensorEventCallback = func;
|
||||||
|
|
||||||
|
result = tdRegisterSensorEvent((TDSensorEvent) &telldus_sensorEventCallback, 0);
|
||||||
|
|
||||||
|
addCallback(func, result);
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdUnregisterCallback(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
long id;
|
||||||
|
PyObject *callback;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "l", &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (hasCallback(id) == 1) {
|
||||||
|
callback = getCallback(id);
|
||||||
|
Py_DECREF(callback);
|
||||||
|
removeCallback(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PyLong_FromLong((long) tdUnregisterCallback(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSensor(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
char protocol[DATA_LENGTH];
|
||||||
|
char model[DATA_LENGTH];
|
||||||
|
long sensorId = 0;
|
||||||
|
long dataTypes = 0;
|
||||||
|
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes);
|
||||||
|
|
||||||
|
if (result == TELLSTICK_SUCCESS)
|
||||||
|
{
|
||||||
|
return Py_BuildValue("ssll", protocol, model, sensorId, dataTypes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PyLong_FromLong(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
telldus_tdSensorValue(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
char protocol[DATA_LENGTH];
|
||||||
|
char model[DATA_LENGTH];
|
||||||
|
long sensorId = 0;
|
||||||
|
long dataType = 0;
|
||||||
|
char value[DATA_LENGTH];
|
||||||
|
long timestamp = 0;
|
||||||
|
long result;
|
||||||
|
|
||||||
|
PyObject *floatObj = NULL;
|
||||||
|
PyObject *timeTuple = NULL;
|
||||||
|
PyObject *dateTime = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "ssll", &protocol, &model, &sensorId, &dataType))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
result = tdSensorValue(protocol, model, sensorId, dataType, value, DATA_LENGTH, ×tamp);
|
||||||
|
|
||||||
|
if (result == TELLSTICK_SUCCESS)
|
||||||
|
{
|
||||||
|
|
||||||
|
floatObj = PyFloat_FromDouble((double) timestamp);
|
||||||
|
timeTuple = Py_BuildValue("(O)", floatObj);
|
||||||
|
dateTime = PyDateTime_FromTimestamp(timeTuple);
|
||||||
|
|
||||||
|
Py_DECREF(floatObj);
|
||||||
|
Py_DECREF(timeTuple);
|
||||||
|
|
||||||
|
return Py_BuildValue("sO", value, dateTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PyLong_FromLong(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyMethodDef telldus_methods[] = {
|
||||||
|
{"tdInit", (PyCFunction) telldus_tdInit, METH_NOARGS, "Initiate telldus."},
|
||||||
|
{"tdClose", (PyCFunction) telldus_tdClose, METH_NOARGS, "Close telldus."},
|
||||||
|
{"tdTurnOn", (PyCFunction) telldus_tdTurnOn, METH_VARARGS, "Turn on device."},
|
||||||
|
{"tdTurnOff", (PyCFunction) telldus_tdTurnOff, METH_VARARGS, "Turn off device."},
|
||||||
|
{"tdBell", (PyCFunction) telldus_tdBell, METH_VARARGS, "Bell device."},
|
||||||
|
{"tdDim", (PyCFunction) telldus_tdDim, METH_VARARGS, "Dim device."},
|
||||||
|
{"tdLearn", (PyCFunction) telldus_tdLearn, METH_VARARGS, "Learn device."},
|
||||||
|
{"tdMethods", (PyCFunction) telldus_tdMethods, METH_VARARGS, "Methods comment."},
|
||||||
|
{"tdLastSentCommand", (PyCFunction) telldus_tdLastSentCommand, METH_VARARGS, "LastSentCommand comment."},
|
||||||
|
{"tdLastSentValue", (PyCFunction) telldus_tdLastSentValue, METH_VARARGS, "LastSentValue comment."},
|
||||||
|
{"tdGetNumberOfDevices", (PyCFunction) telldus_tdGetNumberOfDevices, METH_VARARGS, "GetNumberOfDevices comment."},
|
||||||
|
{"tdGetDeviceId", (PyCFunction) telldus_tdGetDeviceId, METH_VARARGS, "GetDeviceId comment."},
|
||||||
|
{"tdGetDeviceType", (PyCFunction) telldus_tdGetDeviceType, METH_VARARGS, "GetDeviceType comment."},
|
||||||
|
{"tdGetErrorString", (PyCFunction) telldus_tdGetErrorString, METH_VARARGS, "GetErrorString comment."},
|
||||||
|
{"tdGetName", (PyCFunction) telldus_tdGetName, METH_VARARGS, "GetName comment."},
|
||||||
|
{"tdSetName", (PyCFunction) telldus_tdSetName, METH_VARARGS, "SetName comment."},
|
||||||
|
{"tdGetProtocol", (PyCFunction) telldus_tdGetProtocol, METH_VARARGS, "GetProtocol comment."},
|
||||||
|
{"tdSetProtocol", (PyCFunction) telldus_tdSetProtocol, METH_VARARGS, "SetProtocol comment."},
|
||||||
|
{"tdGetModel", (PyCFunction) telldus_tdGetModel, METH_VARARGS, "GetModel comment."},
|
||||||
|
{"tdSetModel", (PyCFunction) telldus_tdSetModel, METH_VARARGS, "SetModel comment."},
|
||||||
|
{"tdGetDeviceParameter", (PyCFunction) telldus_tdGetDeviceParameter, METH_VARARGS, "GetDeviceParameter comment."},
|
||||||
|
{"tdSetDeviceParameter", (PyCFunction) telldus_tdSetDeviceParameter, METH_VARARGS, "SetDeviceParameter comment."},
|
||||||
|
{"tdAddDevice", (PyCFunction) telldus_tdAddDevice, METH_NOARGS, "AddDevice comment."},
|
||||||
|
{"tdRemoveDevice", (PyCFunction) telldus_tdRemoveDevice, METH_VARARGS, "RemoveDevice comment."},
|
||||||
|
{"tdSendRawCommand", (PyCFunction) telldus_tdSendRawCommand, METH_VARARGS, "SendRawCommand comment."},
|
||||||
|
|
||||||
|
{"tdRegisterDeviceEvent", (PyCFunction) telldus_tdRegisterDeviceEvent, METH_VARARGS, "RegisterDeviceEvent comment."},
|
||||||
|
{"tdRegisterDeviceChangeEvent", (PyCFunction) telldus_tdRegisterDeviceChangeEvent, METH_VARARGS, "RegisterDeviceChangeEvent comment."},
|
||||||
|
{"tdRegisterRawDeviceEvent", (PyCFunction) telldus_tdRegisterRawDeviceEvent, METH_VARARGS, "RegisterRawDeviceEvent comment."},
|
||||||
|
{"tdRegisterSensorEvent", (PyCFunction) telldus_tdRegisterSensorEvent, METH_VARARGS, "RegisterSensorEvent comment."},
|
||||||
|
{"tdUnregisterCallback", (PyCFunction) telldus_tdUnregisterCallback, METH_VARARGS, "UnregisterCallback comment."},
|
||||||
|
{"tdSensor", (PyCFunction) telldus_tdSensor, METH_NOARGS, "Sensor comment."},
|
||||||
|
{"tdSensorValue", (PyCFunction) telldus_tdSensorValue, METH_VARARGS, "SensorValue comment."},
|
||||||
|
|
||||||
|
{NULL, NULL, 0, NULL} /* sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
inittelldus(void)
|
||||||
|
{
|
||||||
|
PyObject *module;
|
||||||
|
|
||||||
|
PyObject *TELLSTICK_TURNON_GLUE;
|
||||||
|
PyObject *TELLSTICK_TURNOFF_GLUE;
|
||||||
|
PyObject *TELLSTICK_BELL_GLUE;
|
||||||
|
PyObject *TELLSTICK_TOGGLE_GLUE;
|
||||||
|
PyObject *TELLSTICK_DIM_GLUE;
|
||||||
|
PyObject *TELLSTICK_LEARN_GLUE;
|
||||||
|
PyObject *TELLSTICK_SUCCESS_GLUE;
|
||||||
|
PyObject *TELLSTICK_ERROR_NOT_FOUND_GLUE;
|
||||||
|
PyObject *TELLSTICK_ERROR_PERMISSION_DENIED_GLUE;
|
||||||
|
PyObject *TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE;
|
||||||
|
PyObject *TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE;
|
||||||
|
PyObject *TELLSTICK_ERROR_COMMUNICATION_GLUE;
|
||||||
|
PyObject *TELLSTICK_ERROR_UNKNOWN_GLUE;
|
||||||
|
PyObject *TELLSTICK_TYPE_DEVICE_GLUE;
|
||||||
|
PyObject *TELLSTICK_TYPE_GROUP_GLUE;
|
||||||
|
PyObject *TELLSTICK_TEMPERATURE_GLUE;
|
||||||
|
PyObject *TELLSTICK_HUMIDITY_GLUE;
|
||||||
|
|
||||||
|
/* Create the module and add the functions */
|
||||||
|
|
||||||
|
module = Py_InitModule("telldus", telldus_methods);
|
||||||
|
|
||||||
|
TELLSTICK_TURNON_GLUE = PyLong_FromLong((long) TELLSTICK_TURNON);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_TURNON", TELLSTICK_TURNON_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_TURNON_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_TURNOFF_GLUE = PyLong_FromLong((long) TELLSTICK_TURNOFF);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_TURNOFF", TELLSTICK_TURNOFF_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_TURNOFF_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_BELL_GLUE = PyLong_FromLong((long) TELLSTICK_BELL);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_BELL", TELLSTICK_BELL_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_BELL_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_TOGGLE_GLUE = PyLong_FromLong((long) TELLSTICK_TOGGLE);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_TOGGLE", TELLSTICK_TOGGLE_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_TOGGLE_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_DIM_GLUE = PyLong_FromLong((long) TELLSTICK_DIM);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_DIM", TELLSTICK_DIM_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_DIM_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_LEARN_GLUE = PyLong_FromLong((long) TELLSTICK_LEARN);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_LEARN", TELLSTICK_LEARN_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_LEARN_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_SUCCESS_GLUE = PyLong_FromLong((long) TELLSTICK_SUCCESS);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_SUCCESS", TELLSTICK_SUCCESS_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_SUCCESS_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_ERROR_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_NOT_FOUND);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_ERROR_NOT_FOUND", TELLSTICK_ERROR_NOT_FOUND_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_ERROR_NOT_FOUND_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_ERROR_PERMISSION_DENIED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_PERMISSION_DENIED);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_ERROR_PERMISSION_DENIED", TELLSTICK_ERROR_PERMISSION_DENIED_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_ERROR_PERMISSION_DENIED_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_DEVICE_NOT_FOUND);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_ERROR_DEVICE_NOT_FOUND", TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_METHOD_NOT_SUPPORTED);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_ERROR_METHOD_NOT_SUPPORTED", TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_ERROR_COMMUNICATION_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_COMMUNICATION);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_ERROR_COMMUNICATION", TELLSTICK_ERROR_COMMUNICATION_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_ERROR_COMMUNICATION_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_ERROR_UNKNOWN_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_UNKNOWN);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_ERROR_UNKNOWN", TELLSTICK_ERROR_UNKNOWN_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_ERROR_UNKNOWN_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_TYPE_DEVICE_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_DEVICE);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_TYPE_DEVICE", TELLSTICK_TYPE_DEVICE_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_TYPE_DEVICE_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_TYPE_GROUP_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_GROUP);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_TYPE_GROUP", TELLSTICK_TYPE_GROUP_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_TYPE_GROUP_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_TEMPERATURE_GLUE = PyLong_FromLong((long) TELLSTICK_TEMPERATURE);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_TEMPERATURE", TELLSTICK_TEMPERATURE_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_TEMPERATURE_GLUE);
|
||||||
|
|
||||||
|
TELLSTICK_HUMIDITY_GLUE = PyLong_FromLong((long) TELLSTICK_HUMIDITY);
|
||||||
|
PyObject_SetAttrString(module, "TELLSTICK_HUMIDITY", TELLSTICK_HUMIDITY_GLUE);
|
||||||
|
Py_DECREF(TELLSTICK_HUMIDITY_GLUE);
|
||||||
|
|
||||||
|
}
|
||||||
6
bindings/swig/tellduscore.i
Normal file
6
bindings/swig/tellduscore.i
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
%module tellduscore
|
||||||
|
%{
|
||||||
|
#include "../../telldus-core/driver/libtelldus-core/telldus-core.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%include "../../telldus-core/driver/libtelldus-core/telldus-core.h"
|
||||||
17
bindings/visual-basic/TellStick.bas
Normal file
17
bindings/visual-basic/TellStick.bas
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
Attribute VB_Name = "TellStickModule"
|
||||||
|
Public Declare Function devTurnOn Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Boolean
|
||||||
|
Public Declare Function devTurnOff Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Boolean
|
||||||
|
Public Declare Function devBell Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Boolean
|
||||||
|
Public Declare Function devDim Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long, ByVal level As Byte) As Boolean
|
||||||
|
Public Declare Function devMethods Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Long
|
||||||
|
|
||||||
|
Public Declare Function devGetDeviceId Lib "TellUsbD101.dll" (ByVal a As Long) As Long
|
||||||
|
Public Declare Function devGetName Lib "TellUsbD101.dll" (ByVal i As Long) As String
|
||||||
|
Public Declare Function devGetNumberOfDevices Lib "TellUsbD101.dll" () As Long
|
||||||
|
|
||||||
|
Public Const TELLSTICK_TURNON = 1
|
||||||
|
Public Const TELLSTICK_TURNOFF = 2
|
||||||
|
Public Const TELLSTICK_BELL = 4
|
||||||
|
Public Const TELLSTICK_TOGGLE = 8
|
||||||
|
Public Const TELLSTICK_DIM = 16
|
||||||
|
|
||||||
212
bindings/visual-basic/example/TellStick VB-example - simple.frm
Normal file
212
bindings/visual-basic/example/TellStick VB-example - simple.frm
Normal file
|
|
@ -0,0 +1,212 @@
|
||||||
|
VERSION 5.00
|
||||||
|
Begin VB.Form frmMain
|
||||||
|
BorderStyle = 4 'Fixed ToolWindow
|
||||||
|
Caption = "TellStick VB-example - simple"
|
||||||
|
ClientHeight = 4680
|
||||||
|
ClientLeft = 2040
|
||||||
|
ClientTop = 3600
|
||||||
|
ClientWidth = 3990
|
||||||
|
Icon = "TellStick VB-example - simple.frx":0000
|
||||||
|
LinkTopic = "Form1"
|
||||||
|
MaxButton = 0 'False
|
||||||
|
MinButton = 0 'False
|
||||||
|
ScaleHeight = 4680
|
||||||
|
ScaleWidth = 3990
|
||||||
|
ShowInTaskbar = 0 'False
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "90%"
|
||||||
|
Height = 465
|
||||||
|
Index = 8
|
||||||
|
Left = 3480
|
||||||
|
TabIndex = 12
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "80%"
|
||||||
|
Height = 465
|
||||||
|
Index = 7
|
||||||
|
Left = 3060
|
||||||
|
TabIndex = 11
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "70%"
|
||||||
|
Height = 465
|
||||||
|
Index = 6
|
||||||
|
Left = 2640
|
||||||
|
TabIndex = 10
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "60%"
|
||||||
|
Height = 465
|
||||||
|
Index = 5
|
||||||
|
Left = 2220
|
||||||
|
TabIndex = 9
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "50%"
|
||||||
|
Height = 465
|
||||||
|
Index = 4
|
||||||
|
Left = 1800
|
||||||
|
TabIndex = 8
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "40%"
|
||||||
|
Height = 465
|
||||||
|
Index = 3
|
||||||
|
Left = 1380
|
||||||
|
TabIndex = 7
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "30%"
|
||||||
|
Height = 465
|
||||||
|
Index = 2
|
||||||
|
Left = 960
|
||||||
|
TabIndex = 6
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "20%"
|
||||||
|
Height = 465
|
||||||
|
Index = 1
|
||||||
|
Left = 540
|
||||||
|
TabIndex = 5
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdDim
|
||||||
|
Caption = "10%"
|
||||||
|
Height = 465
|
||||||
|
Index = 0
|
||||||
|
Left = 120
|
||||||
|
TabIndex = 4
|
||||||
|
Top = 4110
|
||||||
|
Width = 420
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdBell
|
||||||
|
Caption = "Bell"
|
||||||
|
Height = 735
|
||||||
|
Left = 1500
|
||||||
|
Picture = "TellStick VB-example - simple.frx":0ECA
|
||||||
|
Style = 1 'Graphical
|
||||||
|
TabIndex = 3
|
||||||
|
Top = 3285
|
||||||
|
Width = 1000
|
||||||
|
End
|
||||||
|
Begin VB.ListBox deviceList
|
||||||
|
Height = 3180
|
||||||
|
Left = 60
|
||||||
|
TabIndex = 2
|
||||||
|
Top = 60
|
||||||
|
Width = 3810
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdOff
|
||||||
|
Caption = "Off"
|
||||||
|
Height = 735
|
||||||
|
Left = 120
|
||||||
|
Picture = "TellStick VB-example - simple.frx":1794
|
||||||
|
Style = 1 'Graphical
|
||||||
|
TabIndex = 1
|
||||||
|
Top = 3285
|
||||||
|
Width = 1000
|
||||||
|
End
|
||||||
|
Begin VB.CommandButton cmdOn
|
||||||
|
Caption = "On"
|
||||||
|
Height = 735
|
||||||
|
Left = 2900
|
||||||
|
Picture = "TellStick VB-example - simple.frx":205E
|
||||||
|
Style = 1 'Graphical
|
||||||
|
TabIndex = 0
|
||||||
|
Top = 3285
|
||||||
|
Width = 1000
|
||||||
|
End
|
||||||
|
End
|
||||||
|
Attribute VB_Name = "frmMain"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = True
|
||||||
|
Attribute VB_Exposed = False
|
||||||
|
Private Sub cmdBell_Click()
|
||||||
|
Dim blnBell As Boolean
|
||||||
|
blnBell = devBell(deviceList.ItemData(deviceList.ListIndex))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub cmdDim_Click(Index As Integer)
|
||||||
|
Dim blnDim As Boolean
|
||||||
|
Dim level As Byte
|
||||||
|
Select Case Index
|
||||||
|
Case "8"
|
||||||
|
level = 230
|
||||||
|
Case "7"
|
||||||
|
level = 204
|
||||||
|
Case "6"
|
||||||
|
level = 179
|
||||||
|
Case "5"
|
||||||
|
level = 153
|
||||||
|
Case "4"
|
||||||
|
level = 128
|
||||||
|
Case "3"
|
||||||
|
level = 102
|
||||||
|
Case "2"
|
||||||
|
level = 77
|
||||||
|
Case "1"
|
||||||
|
level = 51
|
||||||
|
Case "0"
|
||||||
|
level = 25
|
||||||
|
End Select
|
||||||
|
blnDim = devDim(deviceList.ItemData(deviceList.ListIndex), level)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub cmdOff_Click()
|
||||||
|
Dim blnOff As Boolean
|
||||||
|
blnOff = devTurnOff(deviceList.ItemData(deviceList.ListIndex))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub cmdOn_Click()
|
||||||
|
Dim blnOn As Boolean
|
||||||
|
blnOn = devTurnOn(deviceList.ItemData(deviceList.ListIndex))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub deviceList_Click()
|
||||||
|
Dim intMethods As Integer
|
||||||
|
|
||||||
|
intMethods = devMethods(deviceList.ItemData(deviceList.ListIndex))
|
||||||
|
cmdOn.Enabled = (intMethods And TELLSTICK_TURNON)
|
||||||
|
cmdOff.Enabled = (intMethods And TELLSTICK_TURNOFF)
|
||||||
|
cmdBell.Enabled = (intMethods And TELLSTICK_BELL)
|
||||||
|
|
||||||
|
For a = 0 To 8
|
||||||
|
cmdDim(a).Enabled = (intMethods And TELLSTICK_DIM)
|
||||||
|
Next
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub Form_Load()
|
||||||
|
|
||||||
|
Dim numDevices As Integer, i As Integer
|
||||||
|
numDevices = devGetNumberOfDevices()
|
||||||
|
|
||||||
|
For i = 0 To numDevices - 1
|
||||||
|
Dim strName As String
|
||||||
|
Dim intId As Integer
|
||||||
|
|
||||||
|
intId = devGetDeviceId(i)
|
||||||
|
strName = devGetName(intId)
|
||||||
|
deviceList.AddItem strName
|
||||||
|
deviceList.ItemData(i) = intId
|
||||||
|
Next
|
||||||
|
|
||||||
|
deviceList.ListIndex = 0
|
||||||
|
|
||||||
|
End Sub
|
||||||
BIN
bindings/visual-basic/example/TellStick VB-example - simple.frx
Normal file
BIN
bindings/visual-basic/example/TellStick VB-example - simple.frx
Normal file
Binary file not shown.
|
|
@ -0,0 +1,36 @@
|
||||||
|
Type=Exe
|
||||||
|
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\WINDOWS\system32\STDOLE2.TLB#OLE Automation
|
||||||
|
Form=TellStick VB-example - simple.frm
|
||||||
|
Module=TellStickModule; ..\TellStick.bas
|
||||||
|
Startup="frmMain"
|
||||||
|
HelpFile=""
|
||||||
|
ExeName32="TellStick VB-example - simple.exe"
|
||||||
|
Command32=""
|
||||||
|
Name="TellStickExample"
|
||||||
|
HelpContextID="0"
|
||||||
|
CompatibleMode="0"
|
||||||
|
MajorVer=1
|
||||||
|
MinorVer=0
|
||||||
|
RevisionVer=0
|
||||||
|
AutoIncrementVer=0
|
||||||
|
ServerSupportFiles=0
|
||||||
|
VersionCompanyName="Telldus Technologies"
|
||||||
|
CompilationType=0
|
||||||
|
OptimizationType=0
|
||||||
|
FavorPentiumPro(tm)=0
|
||||||
|
CodeViewDebugInfo=0
|
||||||
|
NoAliasing=0
|
||||||
|
BoundsCheck=0
|
||||||
|
OverflowCheck=0
|
||||||
|
FlPointCheck=0
|
||||||
|
FDIVCheck=0
|
||||||
|
UnroundedFP=0
|
||||||
|
StartMode=0
|
||||||
|
Unattended=0
|
||||||
|
Retained=0
|
||||||
|
ThreadPerObject=0
|
||||||
|
MaxNumberOfThreads=1
|
||||||
|
DebugStartupOption=0
|
||||||
|
|
||||||
|
[MS Transaction Server]
|
||||||
|
AutoRefresh=1
|
||||||
351
docs/01-telldus-core.dox
Normal file
351
docs/01-telldus-core.dox
Normal file
|
|
@ -0,0 +1,351 @@
|
||||||
|
/**
|
||||||
|
* @mainpage Telldus Core API
|
||||||
|
*
|
||||||
|
* \section Introduction
|
||||||
|
*
|
||||||
|
* This is the guide to Telldus TellStick SDK. Even though all examples are
|
||||||
|
* written in C/C++ most of the code has a direct eqvivalent function in the
|
||||||
|
* other languages. See \ref sec_other_languages how to use the library in one
|
||||||
|
* of the supported languages by Telldus.
|
||||||
|
*
|
||||||
|
* \section Idea
|
||||||
|
*
|
||||||
|
* All of the devices used by TellStick must be predefined before they can be
|
||||||
|
* used in any software. Under all platforms this can be done with the
|
||||||
|
* software TelldusCenter but under Linux this can also be done by editing the
|
||||||
|
* file <tt>/etc/tellstick.conf</tt> with your favorite text editor.
|
||||||
|
*
|
||||||
|
* Having the devices preconfigured is an advantage to both the developer and
|
||||||
|
* the end user.
|
||||||
|
*
|
||||||
|
* \li The end user might use more then one program for controlling his/her
|
||||||
|
* TellStick. By having the devices preconfigured he/she does not have to
|
||||||
|
* reconfigure the same devices twice. If some settings change in one of the
|
||||||
|
* devices, this change will affect all softwares using Telldus TellStick SDK.
|
||||||
|
* \li Telldus continuously adds support for new devices. If a software
|
||||||
|
* defines it's own devices, the developer will have to keep the software
|
||||||
|
* up to date with new devices and settings implemented by Telldus. By querying
|
||||||
|
* Telldus Tellstick SDK all the new devices will be available automaticly to
|
||||||
|
* the end user.
|
||||||
|
*
|
||||||
|
* \section sec_basic_usage Basic usage (telldus-core)
|
||||||
|
*
|
||||||
|
* Telldus provides a non-gui library to list, query and control the devices
|
||||||
|
* called telldus-core.
|
||||||
|
* To initiate the library a call to tdInit() must be made. This call will
|
||||||
|
* open up all controllers (e.g. a TellStick) and start listening for events from
|
||||||
|
* them.
|
||||||
|
* When you are done with telldus-core, call tdClose() to allow the library to
|
||||||
|
* clean up after itself.
|
||||||
|
*
|
||||||
|
* \subsection sec_bu_listing Listing devices
|
||||||
|
*
|
||||||
|
* To list all of the configured devices, look at the following example:
|
||||||
|
* \code
|
||||||
|
* int intNumberOfDevices = tdGetNumberOfDevices();
|
||||||
|
* for (int i = 0; i < intNumberOfDevices; i++) {
|
||||||
|
* int id = tdGetDeviceId( i );
|
||||||
|
* char *name = tdGetName( id );
|
||||||
|
* printf("%d\t%s\n", id, name);
|
||||||
|
* tdReleaseString(name);
|
||||||
|
* }
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* First, we call tdGetNumberOfDevices(). This returnes the total number of
|
||||||
|
* devices configured. We then iterate over all of the devices with the index
|
||||||
|
* in the variable \c i.
|
||||||
|
* Since the devices could change between runs of the program we can not be
|
||||||
|
* sure that the index points to the same device between two runs of the
|
||||||
|
* program. That is why every device has it's own unique id that is safe to
|
||||||
|
* store in a configuration file. Two different devices can never share the
|
||||||
|
* same device id.
|
||||||
|
*
|
||||||
|
* The call to tdGetDeviceId() returns the id for a specific index. This
|
||||||
|
* function should only be called in a loop iterating over all of the devices.
|
||||||
|
* After we have found the id for a device it is safe to store this or use it
|
||||||
|
* in the rest of the program.
|
||||||
|
*
|
||||||
|
* The next two lines of code queries the device for it's name with a call to
|
||||||
|
* tdGetName() and then displays it to stdout. Finally we must release the
|
||||||
|
* resource after we are done with it by calling tdReleaseString() on any
|
||||||
|
* \c char pointer returned by telldus-core.
|
||||||
|
*
|
||||||
|
* \subsection sec_bu_sending Sending commands to TellStick
|
||||||
|
*
|
||||||
|
* \subsubsection sec_bu_sending_features Device features
|
||||||
|
*
|
||||||
|
* TellStick can control many different types of devices that
|
||||||
|
* support different features. For example, a bell does not support turning
|
||||||
|
* the on-signal and not all lamp switches support dimming.
|
||||||
|
* Call tdMethods() to find out what a specific device supports:
|
||||||
|
* \code
|
||||||
|
* function checkFeatures( int id ) {
|
||||||
|
* int supportedMethods = TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL;
|
||||||
|
* int methods = tdMethods( id, supportedMethods );
|
||||||
|
* if ( methods & TELLSTICK_TURNON ) {
|
||||||
|
* printf( "The device %d support tdTurnOn()\n", id );
|
||||||
|
* }
|
||||||
|
* if ( methods & TELLSTICK_TURNOFF ) {
|
||||||
|
* printf( "The device %d support tdTurnOff()\n", id );
|
||||||
|
* }
|
||||||
|
* if ( methods & TELLSTICK_BELL ) {
|
||||||
|
* printf( "The device %d support tdBell()\n", id );
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* By supplying the methods your application supports, the library can return
|
||||||
|
* customized methods for your application, even if your application doesn't
|
||||||
|
* support the same methods as the device accepts. One example is if your
|
||||||
|
* application only supports ON and OFF, you can control a device that needs UP
|
||||||
|
* and DOWN anyway by using just ON and OFF.
|
||||||
|
* Let's say that the client application only supports turning on and
|
||||||
|
* off. The call to query a device for it's methods should be:
|
||||||
|
* \code
|
||||||
|
* int methods = tdMethods( id, TELLSTICK_TURNON | TELLSTICK_TURNOFF );
|
||||||
|
* \endcode
|
||||||
|
* If the device in the above example is a device only supporing TELLSTICK_BELL,
|
||||||
|
* the library will instead return TELLSTICK_TURNON, making the client application
|
||||||
|
* still able to control the device.
|
||||||
|
* When you know which features a device supports it is safe to call the
|
||||||
|
* controlling functions described in \ref sec_bu_controlling_functions.
|
||||||
|
*
|
||||||
|
* When calling tdMethods() all of the supported methods should be passed in one
|
||||||
|
* call. Do not call tdMethods() for each of the supported methods. Look at the
|
||||||
|
* following example:
|
||||||
|
* \code
|
||||||
|
* //Correct
|
||||||
|
* int methods = tdMethods( id, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL );
|
||||||
|
*
|
||||||
|
* //Wrong
|
||||||
|
* int turnOn = tdMethods( id, TELLSTICK_TURNON );
|
||||||
|
* int turnOff = tdMethods( id, TELLSTICK_TURNOFF );
|
||||||
|
* int bell = tdMethods( id, TELLSTICK_BELL );
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* Another thing to note is if you are developing a library intended for
|
||||||
|
* thirdparty use. You should not hardcode which methods are supported by the
|
||||||
|
* library. It is always up to the application implementing the methods to
|
||||||
|
* supply the methods it supports.
|
||||||
|
*
|
||||||
|
* \subsubsection sec_bu_controlling_functions Controlling functions
|
||||||
|
*
|
||||||
|
* TellStick has a couple of functions for controlling devices. Each of
|
||||||
|
* them should only be called if the device support the feature.
|
||||||
|
*
|
||||||
|
* These functions all return zero if the call was successful and non-zero
|
||||||
|
* otherwise.
|
||||||
|
*
|
||||||
|
* \paragraph tdTurnOn tdTurnOn()
|
||||||
|
* Devices supporting \c TELLSTICK_TURNON. Most of the normal switches (for lamp
|
||||||
|
* etc.) support this.
|
||||||
|
* \paragraph tdTurnOff tdTurnOff()
|
||||||
|
* Devices supporting \c TELLSTICK_TURNOFF. Almost all of the devices supporting
|
||||||
|
* \c TELLSTICK_TURNON also support this.
|
||||||
|
* \paragraph tdDim tdDim()
|
||||||
|
* Devices supporting \c TELLSTICK_DIM. This is a quite unusual feature for
|
||||||
|
* dimmers. Many dimmers on the market that are dimmable have no way for sending
|
||||||
|
* a specific level which means it does not support this feature.
|
||||||
|
* \paragraph tdBell tdBell()
|
||||||
|
* Devices supporting \c TELLSTICK_BELL. This is mostly wireless doorbells.
|
||||||
|
*
|
||||||
|
* \subsubsection sec_bu_error_codes Error codes
|
||||||
|
*
|
||||||
|
* If any of the calls in \ref sec_bu_controlling_functions fails it returns
|
||||||
|
* a non-zero error code. This values is one of the \c TELLSTICK_ERROR_* defines.
|
||||||
|
* To translate the error code to a human readable string call the function
|
||||||
|
* tdGetErrorString(). Example:
|
||||||
|
* \code
|
||||||
|
* printf("Error: %s\n", tdGetErrorString( TELLSTICK_METHOD_NOT_SUPPORTED ) );
|
||||||
|
* //Error: The method you tried to use is not supported by the device
|
||||||
|
*
|
||||||
|
* int retval = tdTurnOn( deviceID );
|
||||||
|
* if (retval != TELLSTICK_SUCCESS ) {
|
||||||
|
* char *errorString = tdGetErrorString( retval );
|
||||||
|
* printf("Error: %s\n", errorString );
|
||||||
|
* tdReleaseString(errorString);
|
||||||
|
* }
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* \subsection sec_bu_device_state Device states
|
||||||
|
*
|
||||||
|
* Since controllable devices only have a receiver and not a transmitter the communication is
|
||||||
|
* one-way. This means that telldus-core will never know for sure which
|
||||||
|
* state a reciever has. Instead, the library remembers which command was last
|
||||||
|
* sent. Either sent from the TellStick itself, or sent from another controller (e.g. a remote control)
|
||||||
|
* captured by the Tellstick Duo. In this way it "emulates" a two-way communication.
|
||||||
|
*
|
||||||
|
* To query the device state, use the function tdLastSentCommand()
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* \code
|
||||||
|
* char *name = tdGetName( id );
|
||||||
|
* int state = tdLastSentCommand( id );
|
||||||
|
* if (state == TELLSTICK_TURNON) {
|
||||||
|
* printf("%s is on\n", name);
|
||||||
|
* } else if (state == TELLSTICK_TURNOFF) {
|
||||||
|
* printf("%s is off\n", name);
|
||||||
|
* } else {
|
||||||
|
* printf("%s is in an unknown state\n", name);
|
||||||
|
* }
|
||||||
|
* tdReleaseString(name);
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* \subsection sec_bu_sensors Sensors
|
||||||
|
*
|
||||||
|
* Retrieving sensor values can be done in two ways. Either by a polling
|
||||||
|
* interface or by callbacks. The client application can implement one or both
|
||||||
|
* of these interfaces. For callbacks, read more under \ref sec_events.
|
||||||
|
*
|
||||||
|
* Each of the sensors can have one or several value types. Currently only
|
||||||
|
* temperature and humidity are implemented.
|
||||||
|
*
|
||||||
|
* There is no API to add, remove or edit sensors. Each sensor that
|
||||||
|
* TellStick Duo has got any data from is added to an internal list. It is up to
|
||||||
|
* the client application to filter and only show the sensors your are
|
||||||
|
* interested in.
|
||||||
|
*
|
||||||
|
* To iterate over the list of sensors, call tdSensor() repeatedly as long as it
|
||||||
|
* returns \c TELLSTICK_SUCCESS. The parameters \c protocol, \c model,
|
||||||
|
* \c sensorId, and \c dataTypes are sent by reference and will be filled with
|
||||||
|
* the values.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* \code
|
||||||
|
* char protocol[DATA_LENGTH], model[DATA_LENGTH];
|
||||||
|
* int sensorId = 0, dataTypes = 0;
|
||||||
|
* while(tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes) == TELLSTICK_SUCCESS) {
|
||||||
|
* //Print the sensor
|
||||||
|
* printf("%s,\t%s,\t%i\n", protocol, model, sensorId);
|
||||||
|
* }
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* The type of sensor values the sensor supports are stored as flags in the
|
||||||
|
* parameter \c sensorId. Call tdSensorValue() for each type.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* \code
|
||||||
|
* char value[DATA_LENGTH];
|
||||||
|
* char timeBuf[80];
|
||||||
|
* time_t timestamp = 0;
|
||||||
|
* if (dataTypes & TELLSTICK_TEMPERATURE) {
|
||||||
|
* tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, value, DATA_LENGTH, (int *)×tamp);
|
||||||
|
* strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
|
||||||
|
* printf("Temperature:\t%sº\t(%s)\n", value, timeBuf);
|
||||||
|
* }
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* \section sec_events Events
|
||||||
|
*
|
||||||
|
* To get events from either a TellStick Duo, another software changes the
|
||||||
|
* status of a device, or new sensors values you have to register for a callback.
|
||||||
|
*
|
||||||
|
* \subsection sec_events_registering Registering for callbacks
|
||||||
|
*
|
||||||
|
* For each callback there is a corresponding register function:
|
||||||
|
* \li tdRegisterDeviceEvent()
|
||||||
|
* \li tdRegisterDeviceChangeEvent()
|
||||||
|
* \li tdRegisterRawDeviceEvent()
|
||||||
|
* \li tdRegisterSensorEvent()
|
||||||
|
*
|
||||||
|
* These all work in the same way. The first parameter is a function-pointer to
|
||||||
|
* the callback function. The second parameter is an optional void pointer. This
|
||||||
|
* can be anything and is dependent on the implementation. This object will be
|
||||||
|
* sent back to each call to the callback function. The functions return an
|
||||||
|
* integer which is an id to the specific callback. This is is sent as a
|
||||||
|
* parameter in each call and should also be used for unregister the callback.
|
||||||
|
*
|
||||||
|
* Please note that the callback will be called by another thread than the
|
||||||
|
* thread used by the application and some measures must be taken to synchronize
|
||||||
|
* it with the main thread.
|
||||||
|
*
|
||||||
|
* Many devices (for example motion detectors) resends their messages many times
|
||||||
|
* to ensure that they are received correctly. If a deviceeventcallback or
|
||||||
|
* rawdeviceeventcallback in turn is calling a controlling function, for example
|
||||||
|
* tdTurnOn, it may be neccessary to implement some solution to wait for the
|
||||||
|
* device to finish its resending, before executing the controlling function.
|
||||||
|
* See how this can be done in the python example.
|
||||||
|
*
|
||||||
|
* \subsection sec_events_callbacks Callbacks
|
||||||
|
*
|
||||||
|
* telldus-core currently implements four different callback function for
|
||||||
|
* different purposes.
|
||||||
|
*
|
||||||
|
* \subsubsection sec_events_callbacks_deviceevent DeviceEvent
|
||||||
|
*
|
||||||
|
* This event is fired when the state of a device changes. This can either
|
||||||
|
* occur via a remote control, but can as well occur via another software on the
|
||||||
|
* computer.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - int deviceId - The device id of the device that changed.
|
||||||
|
* - int method - The new state. Can be TELLSTICK_TURNON, TELLSTICK_TURNOFF
|
||||||
|
* etc.
|
||||||
|
* - const char *data - For some methods this contains data. For TELLSTICK_DIM
|
||||||
|
* this hold the current value.
|
||||||
|
* - int callbackId - id of callback
|
||||||
|
* - void *context - see \ref sec_events_registering for description
|
||||||
|
*
|
||||||
|
* \subsubsection sec_events_callbacks_devicechangeevent DeviceChangeEvent
|
||||||
|
*
|
||||||
|
* This event is fired when the data around a device is changed. It can only be
|
||||||
|
* triggered by another software. Use this callback to keep your list of devices
|
||||||
|
* in sync.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - int deviceId - The device id of the device that changed.
|
||||||
|
* - int changeEvent - What was changed. This can be:
|
||||||
|
* - TELLSTICK_DEVICE_ADDED - A new device was added. The parameter deviceId
|
||||||
|
* holds the id of the new device.
|
||||||
|
* - TELLSTICK_DEVICE_REMOVED - A device was removed, the parameter deviceId
|
||||||
|
* holds the id of the removed device.
|
||||||
|
* - TELLSTICK_DEVICE_CHANGED - The settings of a device changed. The next
|
||||||
|
* parameter holds what was changed.
|
||||||
|
* - int changeType - If changeEvent is TELLSTICK_DEVICE_CHANGED this parameter
|
||||||
|
* holds what was changed. It can be one of the following:
|
||||||
|
* - TELLSTICK_CHANGE_NAME - Use tdGetName() to read the new name.
|
||||||
|
* - TELLSTICK_CHANGE_PROTOCOL - Use tdGetProtocol() to read the new value.
|
||||||
|
* - TELLSTICK_CHANGE_MODEL - Use tdGetModel() to read the new value.
|
||||||
|
* - int callbackId - id of callback
|
||||||
|
* - void *context - see \ref sec_events_registering for description
|
||||||
|
*
|
||||||
|
* \subsubsection sec_events_callbacks_rawdeviceevent RawDeviceEvent
|
||||||
|
*
|
||||||
|
* Use this callback with caution. It outputs everything from a TellStick Duo
|
||||||
|
* without any preprocessing. This can be used to get events from devices not
|
||||||
|
* already configured.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - const char *data - raw device data
|
||||||
|
* - int controllerId - id of receiving controller, can identify the TellStick if several exists in the system
|
||||||
|
* - int callbackId - id of callback
|
||||||
|
* - void *context - see \ref sec_events_registering for description
|
||||||
|
*
|
||||||
|
* \subsubsection sec_events_callbacks_sensorevent SensorEvent
|
||||||
|
*
|
||||||
|
* This event is fired when a new sensor value is retrieved.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* - const char *protocol - The sensors protocol
|
||||||
|
* - const char *model - The model of the sensor
|
||||||
|
* - int id - The unique id for the sensor.
|
||||||
|
* - int dataType - Flags for which types of data the sensor supports
|
||||||
|
* - const char *value - A human readable string of the data
|
||||||
|
* - int timestamp - The timestamp when the latest value was received
|
||||||
|
* - int callbackId - id of callback
|
||||||
|
* - void *context - See \ref sec_events_registering for description
|
||||||
|
*
|
||||||
|
* \subsection sec_events_example Example
|
||||||
|
*
|
||||||
|
* \section sec_other_languages Notes using other languages than C/C++
|
||||||
|
*
|
||||||
|
* \subsection sec_ol_pyhon Python
|
||||||
|
*
|
||||||
|
* To use telldus-core in Python,
|
||||||
|
* please have look at the <tt>ctypes</tt> library. It contains <tt>cdll</tt> and
|
||||||
|
* <tt>windll</tt> to load any dynamic link libraries.
|
||||||
|
*
|
||||||
|
* There is also a third party library available:
|
||||||
|
* https://github.com/erijo/tellcore-py
|
||||||
|
*
|
||||||
|
*/
|
||||||
122
docs/02-tellstick-protocol.dox
Normal file
122
docs/02-tellstick-protocol.dox
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
/**
|
||||||
|
* @page TellStick TellStick protocol
|
||||||
|
*
|
||||||
|
* \section Introduction
|
||||||
|
*
|
||||||
|
* Telldus TellStick protocol looks like:<br>
|
||||||
|
* <tt>[prefix[prefix parameters]][command][parameter 1]..[parameter n]['+']</tt>
|
||||||
|
*
|
||||||
|
* Each value in <tt>[</tt> and <tt>]</tt> is representing one byte.
|
||||||
|
*
|
||||||
|
* Command is one ascii character. Not all commands have parameters which
|
||||||
|
* makes it optional. Prefix is always optional.
|
||||||
|
* Note: Due to memory limitations, the parameters is limited in length to 79
|
||||||
|
* bytes.
|
||||||
|
*
|
||||||
|
* An example command to turn on a ArcTech codeswitch A1 may look like:
|
||||||
|
* <tt>S$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$}+</tt>
|
||||||
|
*
|
||||||
|
* TellStick returns to a known command like this:<br>
|
||||||
|
* <tt>['+'][command][parameters][13][10]</tt>
|
||||||
|
*
|
||||||
|
* <tt>[13]</tt> and <tt>[10]</tt> are the ascii characters 10 and 13.
|
||||||
|
*
|
||||||
|
* An example to query a TellStick on its firmware version:<br>
|
||||||
|
* Command:<br>
|
||||||
|
* <tt>V+</tt><br>
|
||||||
|
* Response:<br>
|
||||||
|
* <tt>+V2</tt><br>
|
||||||
|
* The TellStick in the example has the firmware version 2.
|
||||||
|
*
|
||||||
|
* \section Commands
|
||||||
|
*
|
||||||
|
* \subsection sec_send S - Send command
|
||||||
|
* This command tells TellStick to send a command. The parameters to this
|
||||||
|
* command is the data-packet to send.
|
||||||
|
*
|
||||||
|
* Each of the characters in the parameters makes the antenna alternate
|
||||||
|
* high/low/high etc. The time before the alternation is 10 us timer the ASCII
|
||||||
|
* value. For example, $ has the ascii-value 36 and k has 107. The command:
|
||||||
|
* <tt>['S']['$']['k']['$']['k']['$']['+']</tt> makes the following wavepattern on the antenna:
|
||||||
|
* <pre>
|
||||||
|
* _____ _____ _____
|
||||||
|
* | | | | | |
|
||||||
|
* | | | | | |
|
||||||
|
* | |_______________| |_______________| |
|
||||||
|
*
|
||||||
|
* |<===>|<=============>|<===>|<=============>|<===>|
|
||||||
|
* 360us 1070us 360us 1070us 360us
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \subsection sec_send_extended T - Send command, extended
|
||||||
|
*
|
||||||
|
* The extended command was developed to overcome the limitations och the
|
||||||
|
* length of the data to 79 bytes.
|
||||||
|
* The idea is to have four fixed times on the pulses so the information about
|
||||||
|
* what to send only needs 2 bits instead of 8 in the command <tt>S</tt>
|
||||||
|
*
|
||||||
|
* The parameters to the command is:<br>
|
||||||
|
* <tt>[t0][t1][t2][t3][length][d1]..[dn]</tt>
|
||||||
|
*
|
||||||
|
* <tt>t0-t3</tt>: Times 1 to 4. The times are in the same form as <tt>S</tt>.
|
||||||
|
* Each time is multiplied with the factor of 10.
|
||||||
|
*
|
||||||
|
* <tt>length</tt>: How many pulses to send. Since the data sent to TellStick
|
||||||
|
* is sent in groups of four pulses (one byte) and the actual data might not
|
||||||
|
* have pulses even divided with four.
|
||||||
|
*
|
||||||
|
* <tt>d1..dn</tt>: Each byte is the description for four pulses.
|
||||||
|
*
|
||||||
|
* Example:<br>
|
||||||
|
* <tt>['T'][127][255][24][1][6][98][80]['+']</tt>
|
||||||
|
*
|
||||||
|
* <tt>T</tt>: Send extended.
|
||||||
|
*
|
||||||
|
* <tt>127,255,24,1</tt>: Times 1270 us, 2550 us, 24 us and 10 us
|
||||||
|
*
|
||||||
|
* <tt>6</tt>: Six pulses to send.
|
||||||
|
*
|
||||||
|
* <tt>98,80</tt>: The data in binary is <tt>10011000</tt>,<tt>10000000</tt>. If
|
||||||
|
* we group it in groups of two bits we get <tt>10 01 10 00 10 00 00 00</tt>.
|
||||||
|
* Since the length is only six pulses the last two pulses is discarded, giving:
|
||||||
|
* <tt>10 01 10 00 10 00</tt>.
|
||||||
|
*
|
||||||
|
* Matching those bits to the times gives the following times:<br>
|
||||||
|
* <tt>10 => 2 => t2 => 240 us</tt><br>
|
||||||
|
* <tt>01 => 1 => t1 => 2550 us</tt><br>
|
||||||
|
* <tt>10 => 2 => t2 => 240 us</tt><br>
|
||||||
|
* <tt>00 => 0 => t0 => 1270 us</tt><br>
|
||||||
|
* <tt>10 => 2 => t2 => 240 us</tt><br>
|
||||||
|
* <tt>00 => 0 => t0 => 1270 us</tt><br>
|
||||||
|
*
|
||||||
|
* This is equal if you used <tt>S</tt>:<br>
|
||||||
|
* <tt>['S'][24][255][24][127][24][127]['+']</tt>
|
||||||
|
*
|
||||||
|
* \subsection sec_version V - Firmware version
|
||||||
|
* This command queries the TellStick on its firmware version.
|
||||||
|
*
|
||||||
|
* Example:<br>
|
||||||
|
* <tt>» V+</tt><br>
|
||||||
|
* <tt>« +V2</tt><br>
|
||||||
|
* \section Prefixes
|
||||||
|
* The prefixes are commands that can be prepended before some of the commands
|
||||||
|
* and cannot be used standalone. They are used to alter the behavior of the
|
||||||
|
* command.
|
||||||
|
*
|
||||||
|
* \subsection sec_debug D - Debug
|
||||||
|
* \subsection sec_pause P - Pause
|
||||||
|
* The pause is how low TellStick will wait between two packets. The value is
|
||||||
|
* in ms.
|
||||||
|
*
|
||||||
|
* Example, % has the ascii-value 37. The following packet will be sent with a
|
||||||
|
* pause of 37 ms between the packets:<br>
|
||||||
|
* <tt>» P\%S$k$k$+</tt>
|
||||||
|
*
|
||||||
|
* \subsection sec_repeat R - Repeat
|
||||||
|
* This tells TellStick how many times to send the packet.
|
||||||
|
*
|
||||||
|
* Example, ! has the ascii-value 33. The following packet will be sent 33
|
||||||
|
* times:<br>
|
||||||
|
* <tt>» R!S$k$k$+</tt>
|
||||||
|
*/
|
||||||
94
docs/03-tellstick-net-protocol.dox
Normal file
94
docs/03-tellstick-net-protocol.dox
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
/**
|
||||||
|
* @page TellStickNet TellStick Net protocol
|
||||||
|
*
|
||||||
|
* \section Introduction
|
||||||
|
*
|
||||||
|
* TellStick Net will eventually support local access through the LAN. This is
|
||||||
|
* unsupported by Telldus Technologies but can be useful in some cases. For
|
||||||
|
* instance in mobile devices or when the internet is not available. Using
|
||||||
|
* TellStick Net through Telldus Live! is still the prefered and supported
|
||||||
|
* method.
|
||||||
|
*
|
||||||
|
* <em>This interface is still under development and is not ready for
|
||||||
|
* production.</em>
|
||||||
|
*
|
||||||
|
* \section autodiscovery Auto discovery
|
||||||
|
*
|
||||||
|
* The TellStick Net can be auto discovered on the LAN using UDP broadcast.
|
||||||
|
* Sending a package to the broadcast address 255.255.255.255 port 30303 will
|
||||||
|
* be responded by any TellStick Net on the network. The packet should only
|
||||||
|
* contain the single character 'D' (ascii number 68).
|
||||||
|
*
|
||||||
|
* The response from the device will be sent back to the same host and port as
|
||||||
|
* the originated packet. So any dynamically port can be assigned by the host
|
||||||
|
* implementing the auto discovery.
|
||||||
|
* The returning packet is constructed in the following way:
|
||||||
|
* <tt>product:mac address:activation code:firmware</tt>
|
||||||
|
*
|
||||||
|
* Example:<br>
|
||||||
|
* <tt>TellStickNet:ABCDEFGHIJKL:ABDCEFGHIJ:2</tt><br>
|
||||||
|
* Product: <tt>TellStick Net (TSNET)</tt><br>
|
||||||
|
* Mac address: <tt>AB:CD:EF:GH:IJ:KL</tt><br>
|
||||||
|
* Code for activation: <tt>ABCDEFGHIJ</tt><br>
|
||||||
|
* Firmware version: <tt>2</tt>
|
||||||
|
*
|
||||||
|
* Use the source ip-address to determine the address to the device.
|
||||||
|
*
|
||||||
|
* \section messageformat Message format
|
||||||
|
*
|
||||||
|
* The message format used to communicate with TellStick Net is designed to be
|
||||||
|
* easily parsed but still be flexible. It can be converted to and from json
|
||||||
|
* without losing information.
|
||||||
|
*
|
||||||
|
* There exists four datatypes; string, integer, list and dictionary:
|
||||||
|
*
|
||||||
|
* - Strings are length-prefixed base sixteen (upper case) followed by a colon
|
||||||
|
* and the string. For example 6:FooBar corresponds to 'FooBar'.
|
||||||
|
*
|
||||||
|
* - Integers are represented by an 'i' followed by the number in base 16
|
||||||
|
* followed by an 's'. For example i3s corresponds to 3 and i-3s corresponds
|
||||||
|
* to -3. Integers have no size limitation. i-0s is invalid. All encodings
|
||||||
|
* with a leading zero, such as i03s, are invalid, other than i0s, which of
|
||||||
|
* course corresponds to 0.
|
||||||
|
*
|
||||||
|
* - Lists are encoded as an 'l' followed by their elements (also encoded)
|
||||||
|
* followed by an 's'. For example l3:foo3:bars corresponds to ['foo', 'bar'].
|
||||||
|
*
|
||||||
|
* - Dictionaries are encoded as a 'h' followed by a list of alternating keys and
|
||||||
|
* their corresponding values followed by an 's'. For example,
|
||||||
|
* h3:foo3:bar5:hello5:worlds corresponds to {'foo': 'bar', 'hello': 'world'}
|
||||||
|
* and h3:fool3:bar3:bazss corresponds to {'foo': ['bar', 'baz']}. Keys must
|
||||||
|
* be strings.
|
||||||
|
*
|
||||||
|
* Communication with TellStick Net is done over UDP on port 42314.
|
||||||
|
* The first string sent contains the command to execute. The following python
|
||||||
|
* example sends a disconnection command to a TellStick Net. This will reboot
|
||||||
|
* the device.
|
||||||
|
* \code
|
||||||
|
* from socket import *
|
||||||
|
* UDPSock = socket(AF_INET,SOCK_DGRAM)
|
||||||
|
* UDPSock.sendto("A:disconnect", ("192.168.0.155",42314))
|
||||||
|
* \endcode
|
||||||
|
* \section tellstick_net_command_send Send command
|
||||||
|
*
|
||||||
|
* For readability the examples will be displayed in json format in this
|
||||||
|
* documentation. They must be encoded using the TellStick Net message format
|
||||||
|
* before sending to an actual TellStick Net.
|
||||||
|
*
|
||||||
|
* Sending RF-data uses the same encoding as TellStick \ref sec_send with the
|
||||||
|
* difference that prefixes should be sent as a parameter and not in the
|
||||||
|
* RF-data.
|
||||||
|
*
|
||||||
|
* The parameters are sent encoded in a dictionary, with the RF-data in the key
|
||||||
|
* 'S'. Example sending Arctech Code switch A1 ON:<br>
|
||||||
|
* <tt>{'S': '$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$k'}</tt>
|
||||||
|
* The string sent will be encoded like this:<br>
|
||||||
|
* <tt>4:sendh1:S32:$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$k$k$ks</tt>
|
||||||
|
*
|
||||||
|
* The same example as above but with a 20 ms pause between the 15 packages:<br>
|
||||||
|
* <tt>{'S': '$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$k',
|
||||||
|
* 'P': 20, 'R': 15}</tt>
|
||||||
|
*
|
||||||
|
* The command \ref sec_send_extended "\"Send extended\" (T)" is not implemented
|
||||||
|
* since a TellStick Net can handle packages over 255 pulses.
|
||||||
|
*/
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
PROJECT( tellstick )
|
|
||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED( VERSION 2.4.0 )
|
|
||||||
|
|
||||||
ADD_SUBDIRECTORY(TellUsbD101)
|
|
||||||
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
|
||||||
# Visual C++ Express 2005
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TellUsbD101", "TellUsbD101\TellUsbD101.vcproj", "{2A868E40-88D9-4800-A83F-21D0F8DCB611}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{2A868E40-88D9-4800-A83F-21D0F8DCB611}.Debug|Win32.ActiveCfg = Release|Win32
|
|
||||||
{2A868E40-88D9-4800-A83F-21D0F8DCB611}.Debug|Win32.Build.0 = Release|Win32
|
|
||||||
{2A868E40-88D9-4800-A83F-21D0F8DCB611}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{2A868E40-88D9-4800-A83F-21D0F8DCB611}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
|
|
||||||
SET( tellusbd101_SRCS
|
|
||||||
Device.cpp
|
|
||||||
linux/Device.cpp
|
|
||||||
DeviceIkea.cpp
|
|
||||||
DeviceNexa.cpp
|
|
||||||
DeviceSartano.cpp
|
|
||||||
DeviceWaveman.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
ADD_DEFINITIONS(
|
|
||||||
-DOS_LINUX
|
|
||||||
)
|
|
||||||
|
|
||||||
ADD_LIBRARY(tellusbd101 SHARED
|
|
||||||
${tellusbd101_SRCS}
|
|
||||||
${tellusbd101_MOC_SRCS}
|
|
||||||
)
|
|
||||||
|
|
||||||
# TARGET_LINK_LIBRARIES(tellusbd101
|
|
||||||
# ${MIDAS_LIBRARY}
|
|
||||||
# )
|
|
||||||
|
|
||||||
INSTALL(TARGETS tellusbd101 LIBRARY
|
|
||||||
DESTINATION lib
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
#include "Device.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
Device::Device(int intDongleIndex)
|
|
||||||
{
|
|
||||||
this->intDongleIndex = intDongleIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
Device::~Device(void)
|
|
||||||
{
|
|
||||||
intDongleIndex = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn on, virtual
|
|
||||||
*/
|
|
||||||
void Device::turnOn(void){
|
|
||||||
//do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off, virtual
|
|
||||||
*/
|
|
||||||
void Device::turnOff(void){
|
|
||||||
//do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bell, virtual
|
|
||||||
*/
|
|
||||||
void Device::bell(void){
|
|
||||||
//do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dim, virtual
|
|
||||||
*/
|
|
||||||
void Device::dim(unsigned char level){
|
|
||||||
//do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Methods, virtual
|
|
||||||
*/
|
|
||||||
int Device::methods(char* strModel){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "TellUsbD101.h"
|
|
||||||
|
|
||||||
class Device
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int intDongleIndex;
|
|
||||||
protected:
|
|
||||||
void send(char* strMessage);
|
|
||||||
public:
|
|
||||||
Device(int intDeviceIndex);
|
|
||||||
virtual void turnOn(void);
|
|
||||||
virtual void turnOff(void);
|
|
||||||
virtual void bell(void);
|
|
||||||
virtual void dim(unsigned char level);
|
|
||||||
virtual int methods(char* strModel);
|
|
||||||
static int getDongleIndex();
|
|
||||||
|
|
||||||
static void debugLog(char* debugstring);
|
|
||||||
|
|
||||||
public:
|
|
||||||
~Device(void);
|
|
||||||
};
|
|
||||||
|
|
@ -1,175 +0,0 @@
|
||||||
// #include "StdAfx.h" //Needed?
|
|
||||||
#include "DeviceIkea.h"
|
|
||||||
#include <string>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <bitset>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
DeviceIkea::DeviceIkea(int intNewSystem, int intNewUnits, int intNewFadeStyle, int intDeviceIndex):Device(intDeviceIndex){
|
|
||||||
intSystem = intNewSystem;
|
|
||||||
intUnits = intNewUnits;
|
|
||||||
intFadeStyle = intNewFadeStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
DeviceIkea::~DeviceIkea(void)
|
|
||||||
{
|
|
||||||
intSystem = -1;
|
|
||||||
intUnits = -1;
|
|
||||||
intFadeStyle = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn on this device
|
|
||||||
*/
|
|
||||||
void DeviceIkea::turnOn(void){
|
|
||||||
try{
|
|
||||||
string strCode = getStringCode(255);
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off this device
|
|
||||||
*/
|
|
||||||
void DeviceIkea::turnOff(void){
|
|
||||||
try{
|
|
||||||
string strCode = getStringCode(0);
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off this device
|
|
||||||
*/
|
|
||||||
void DeviceIkea::dim(unsigned char level){
|
|
||||||
try{
|
|
||||||
string strCode = getStringCode(level);
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert an integer to byte string where 0 is represented by ª and 1 by TT
|
|
||||||
*/
|
|
||||||
string DeviceIkea::getStringCode(unsigned char level){
|
|
||||||
|
|
||||||
string strReturn = "STTTTTTª"; //Startcode, always like this;
|
|
||||||
|
|
||||||
try{
|
|
||||||
string strChannels = "";
|
|
||||||
int intCode = (intSystem << 10) | intUnits;
|
|
||||||
int checksum1 = 0;
|
|
||||||
int checksum2 = 0;
|
|
||||||
for (int i = 13; i >= 0; --i) {
|
|
||||||
if ((intCode>>i) & 1) {
|
|
||||||
strChannels.append("TT");
|
|
||||||
if (i % 2 == 0)
|
|
||||||
checksum2++;
|
|
||||||
else
|
|
||||||
checksum1++;
|
|
||||||
} else {
|
|
||||||
strChannels.append("ª");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strReturn.append(strChannels); //System + Units
|
|
||||||
|
|
||||||
strReturn.append(checksum1 %2 == 0 ? "TT" : "ª"); //1st checksum
|
|
||||||
strReturn.append(checksum2 %2 == 0 ? "TT" : "ª"); //2nd checksum
|
|
||||||
|
|
||||||
int intLevel = 0;
|
|
||||||
if (level <= 12) {
|
|
||||||
intLevel = 10; // Level 10 is actually off
|
|
||||||
} else if (level <= 37) {
|
|
||||||
intLevel = 1;
|
|
||||||
} else if (level <= 62) {
|
|
||||||
intLevel = 2;
|
|
||||||
} else if (level <= 87) {
|
|
||||||
intLevel = 3;
|
|
||||||
} else if (level <= 112) {
|
|
||||||
intLevel = 4;
|
|
||||||
} else if (level <= 137) {
|
|
||||||
intLevel = 5;
|
|
||||||
} else if (level <= 162) {
|
|
||||||
intLevel = 6;
|
|
||||||
} else if (level <= 187) {
|
|
||||||
intLevel = 7;
|
|
||||||
} else if (level <= 212) {
|
|
||||||
intLevel = 8;
|
|
||||||
} else if (level <= 237) {
|
|
||||||
intLevel = 9;
|
|
||||||
} else {
|
|
||||||
intLevel = 0; // Level 0 is actually full on
|
|
||||||
}
|
|
||||||
|
|
||||||
int intFade = 0;
|
|
||||||
if (intFadeStyle == 1) {
|
|
||||||
intFade = 11 << 4; //Smooth
|
|
||||||
} else {
|
|
||||||
intFade = 1 << 4; //Instant
|
|
||||||
}
|
|
||||||
|
|
||||||
intCode = intLevel | intFade; //Concat level and fade
|
|
||||||
|
|
||||||
checksum1 = 0;
|
|
||||||
checksum2 = 0;
|
|
||||||
for (int i = 0; i < 6; ++i) {
|
|
||||||
if ((intCode>>i) & 1) {
|
|
||||||
strReturn.append("TT");
|
|
||||||
if (i % 2 == 0)
|
|
||||||
checksum1++;
|
|
||||||
else
|
|
||||||
checksum2++;
|
|
||||||
} else {
|
|
||||||
strReturn.append("ª");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strReturn.append(checksum1 %2 == 0 ? "TT" : "ª"); //1st checksum
|
|
||||||
strReturn.append(checksum2 %2 == 0 ? "TT" : "ª"); //2nd checksum
|
|
||||||
|
|
||||||
strReturn.append("+");
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Has the device got the method?
|
|
||||||
*/
|
|
||||||
int DeviceIkea::methods(char* strModel){
|
|
||||||
|
|
||||||
if(strcmp(strModel, TELLSTICK_DEVICE_KOPPLA) == 0) {
|
|
||||||
return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "Device.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class DeviceIkea : public Device
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeviceIkea(int intSystem, int intUnits, int fadeStyle, int intDeviceIndex);
|
|
||||||
virtual void turnOn(void);
|
|
||||||
virtual void turnOff(void);
|
|
||||||
virtual void dim(unsigned char level);
|
|
||||||
virtual int methods(char* strModel);
|
|
||||||
|
|
||||||
public:
|
|
||||||
~DeviceIkea(void);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int intSystem;
|
|
||||||
int intUnits;
|
|
||||||
int intFadeStyle;
|
|
||||||
std::string getStringCode(unsigned char);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
@ -1,168 +0,0 @@
|
||||||
// #include "StdAfx.h"
|
|
||||||
#include "DeviceNexa.h"
|
|
||||||
#include <string>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <bitset>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
DeviceNexa::DeviceNexa(int intNewHouse, int intNewCode, int intDeviceIndex):Device(intDeviceIndex){
|
|
||||||
intHouse = intNewHouse;
|
|
||||||
intCode = intNewCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
DeviceNexa::~DeviceNexa(void)
|
|
||||||
{
|
|
||||||
intHouse = -1;
|
|
||||||
intCode = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn on this device
|
|
||||||
*/
|
|
||||||
void DeviceNexa::turnOn(void){
|
|
||||||
|
|
||||||
try{
|
|
||||||
//char* model = getModel(intDeviceId);
|
|
||||||
string strCode = getStringCode(intCode);
|
|
||||||
string strHouse = getStringCode(intHouse);
|
|
||||||
strCode.append(strHouse);
|
|
||||||
|
|
||||||
strCode.insert(0, "S");
|
|
||||||
strCode.append("$k$k$kk$$kk$$kk$$k+"); //the "turn on"-code, keeps it like this, doesn't have to be regenerated each time
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off this device
|
|
||||||
*/
|
|
||||||
void DeviceNexa::turnOff(void){
|
|
||||||
|
|
||||||
try{
|
|
||||||
string strCode = getStringCode(intCode);
|
|
||||||
string strHouse = getStringCode(intHouse);
|
|
||||||
|
|
||||||
strCode.append(strHouse);
|
|
||||||
strCode.insert(0, "S");
|
|
||||||
strCode.append("$k$k$kk$$kk$$k$k$k+"); //the "turn off"-code, keeps it like this, doesn't have to be regenerated each time
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send a bell
|
|
||||||
*/
|
|
||||||
void DeviceNexa::bell(void){
|
|
||||||
|
|
||||||
try{
|
|
||||||
string strCode = getStringCode(intCode);
|
|
||||||
|
|
||||||
strCode.append("$kk$$kk$$kk$$k$k"); //the unit-code is always 7, doesn't have to be regenerated each time
|
|
||||||
strCode.insert(0, "S");
|
|
||||||
strCode.append("$kk$$kk$$kk$$kk$$k+"); //the "bell"-code, keeps it like this, doesn't have to be regenerated each time
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert an integer to byte string where 0 is represented by $k and 1 by k$, reversed and padded with 0's as needed
|
|
||||||
*/
|
|
||||||
string DeviceNexa::getStringCode(int intToConvert){
|
|
||||||
|
|
||||||
string strReturn = "";
|
|
||||||
|
|
||||||
try{
|
|
||||||
bitset<4> bs ((long)intToConvert);
|
|
||||||
|
|
||||||
strReturn = bs.to_string();
|
|
||||||
reverse(strReturn.begin(), strReturn.end());
|
|
||||||
|
|
||||||
int intPos = (int)strReturn.find("0");
|
|
||||||
while (intPos < string::npos){
|
|
||||||
strReturn.replace(intPos, 1, "$k");
|
|
||||||
intPos = (int)strReturn.find("0", intPos + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
intPos = (int)strReturn.find("1");
|
|
||||||
while (intPos < string::npos){
|
|
||||||
strReturn.replace(intPos, 1, "k$");
|
|
||||||
intPos = (int)strReturn.find("1", intPos + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
intPos = 0;
|
|
||||||
while (intPos < (int)strReturn.length()){
|
|
||||||
strReturn.insert(intPos, "$k");
|
|
||||||
intPos = intPos + 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Has the device got the method?
|
|
||||||
*/
|
|
||||||
int DeviceNexa::methods(char* strModel){
|
|
||||||
|
|
||||||
if( strcmp(strModel, TELLSTICK_DEVICE_YCR3500) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_YCR300D) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_WSR1000) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_CMR1000) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_CMR300) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_PA33300) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2000) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2005) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2006) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_SYCR3500) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_SYCR300) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_HDR105) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2004) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2016) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2010) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_LYCR1000) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_LYCR300) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_LCMR1000) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_LCMR300) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2023) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2024) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2021) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2017) == 0 ||
|
|
||||||
strcmp(strModel, TELLSTICK_DEVICE_EL2019) == 0
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return (TELLSTICK_TURNON | TELLSTICK_TURNOFF);
|
|
||||||
} else if ( strcmp(strModel, TELLSTICK_DEVICE_ML7100) == 0 ) {
|
|
||||||
return TELLSTICK_BELL;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "Device.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class DeviceNexa : public Device
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeviceNexa(int intHouse, int intCode, int intDeviceIndex);
|
|
||||||
virtual void turnOn(void);
|
|
||||||
virtual void turnOff(void);
|
|
||||||
virtual void bell(void);
|
|
||||||
virtual int methods(char* strModel);
|
|
||||||
|
|
||||||
public:
|
|
||||||
~DeviceNexa(void);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int intHouse;
|
|
||||||
int intCode;
|
|
||||||
std::string getStringCode(int);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
#include "DeviceSartano.h"
|
|
||||||
#include "DeviceNexa.h"
|
|
||||||
#include <string>
|
|
||||||
#include <bitset>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
DeviceSartano::DeviceSartano(int intNewSystem, int intNewCode, int intDeviceIndex)
|
|
||||||
:Device(intDeviceIndex)
|
|
||||||
{
|
|
||||||
intSystem = intNewSystem;
|
|
||||||
intCode = intNewCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DeviceSartano::~DeviceSartano(void)
|
|
||||||
{
|
|
||||||
intSystem = -1;
|
|
||||||
intCode = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn on this device
|
|
||||||
*/
|
|
||||||
void DeviceSartano::turnOn(void){
|
|
||||||
|
|
||||||
try{
|
|
||||||
string strSystem = getStringCode(intSystem);
|
|
||||||
string strCode = getStringCode(intCode);
|
|
||||||
strSystem.append(strCode);
|
|
||||||
|
|
||||||
strSystem.insert(0, "S");
|
|
||||||
strSystem.append("$k$k$kk$$k+"); //the "turn on"-code, keeps it like this, doesn't have to be regenerated each time
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strSystem.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off this device
|
|
||||||
*/
|
|
||||||
void DeviceSartano::turnOff(void){
|
|
||||||
|
|
||||||
try{
|
|
||||||
string strSystem = getStringCode(intSystem);
|
|
||||||
string strCode = getStringCode(intCode);
|
|
||||||
strSystem.append(strCode);
|
|
||||||
|
|
||||||
strSystem.insert(0, "S");
|
|
||||||
strSystem.append("$kk$$k$k$k+"); //the "turn off"-code, keeps it like this, doesn't have to be regenerated each time
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strSystem.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Has the device got the method?
|
|
||||||
*/
|
|
||||||
int DeviceSartano::methods(char* strModel){
|
|
||||||
return (TELLSTICK_TURNON | TELLSTICK_TURNOFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert an integer to byte string where 0 is represented by $k and 1 by k$, reversed and padded with 0's as needed
|
|
||||||
*/
|
|
||||||
string DeviceSartano::getStringCode(int intToConvert){
|
|
||||||
|
|
||||||
string strReturn = "";
|
|
||||||
|
|
||||||
try{
|
|
||||||
bitset<5> bs ((long)intToConvert);
|
|
||||||
|
|
||||||
strReturn = bs.to_string();
|
|
||||||
|
|
||||||
int intPos = (int)strReturn.find("0");
|
|
||||||
while (intPos < string::npos){
|
|
||||||
strReturn.replace(intPos, 1, "$k");
|
|
||||||
intPos = (int)strReturn.find("0", intPos + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
intPos = (int)strReturn.find("1");
|
|
||||||
while (intPos < string::npos){
|
|
||||||
strReturn.replace(intPos, 1, "k$");
|
|
||||||
intPos = (int)strReturn.find("1", intPos + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
intPos = 0;
|
|
||||||
while (intPos < (int)strReturn.length()){
|
|
||||||
strReturn.insert(intPos, "$k");
|
|
||||||
intPos = intPos + 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "Device.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
|
|
||||||
class DeviceSartano : public Device
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeviceSartano(int intSystem, int intCode, int intDeviceIndex);
|
|
||||||
virtual void turnOn(void);
|
|
||||||
virtual void turnOff(void);
|
|
||||||
virtual int methods(char* strModel);
|
|
||||||
|
|
||||||
~DeviceSartano(void);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::string getStringCode(int);
|
|
||||||
|
|
||||||
int intSystem;
|
|
||||||
int intCode;
|
|
||||||
};
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
// #include "StdAfx.h"
|
|
||||||
#include "DeviceWaveman.h"
|
|
||||||
#include <string>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <bitset>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
DeviceWaveman::DeviceWaveman(int intNewHouse, int intNewCode, int intDeviceIndex)
|
|
||||||
:DeviceNexa(intNewHouse, intNewCode, intDeviceIndex){
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off this device
|
|
||||||
*/
|
|
||||||
void DeviceWaveman::turnOff(void){
|
|
||||||
|
|
||||||
try{
|
|
||||||
string strCode = getStringCode(intCode);
|
|
||||||
string strHouse = getStringCode(intHouse);
|
|
||||||
|
|
||||||
strCode.append(strHouse);
|
|
||||||
strCode.insert(0, "S");
|
|
||||||
strCode.append("$k$k$k$k$k$k$k$k$k+"); //the "turn off"-code, keeps it like this, doesn't have to be regenerated each time
|
|
||||||
|
|
||||||
char* strMessage = const_cast<char*>(strCode.c_str());
|
|
||||||
|
|
||||||
Device::send(strMessage);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Has the device got the method?
|
|
||||||
*/
|
|
||||||
int DeviceWaveman::methods(char* strModel){
|
|
||||||
return (TELLSTICK_TURNON | TELLSTICK_TURNOFF);
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "DeviceNexa.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class DeviceWaveman : public DeviceNexa
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeviceWaveman(int intHouse, int intCode, int intDeviceIndex);
|
|
||||||
virtual void turnOff(void);
|
|
||||||
virtual int methods(char* strModel);
|
|
||||||
};
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
//{{NO_DEPENDENCIES}}
|
|
||||||
// Microsoft Visual C++ generated include file.
|
|
||||||
// Used by testruntelldus3.rc
|
|
||||||
//
|
|
||||||
|
|
||||||
#define IDS_APP_TITLE 103
|
|
||||||
|
|
||||||
#define IDR_MAINFRAME 128
|
|
||||||
#define IDD_TESTRUNTELLDUS3_DIALOG 102
|
|
||||||
#define IDD_ABOUTBOX 103
|
|
||||||
#define IDM_ABOUT 104
|
|
||||||
#define IDM_EXIT 105
|
|
||||||
#define IDI_TESTRUNTELLDUS3 107
|
|
||||||
#define IDI_SMALL 108
|
|
||||||
#define IDC_TESTRUNTELLDUS3 109
|
|
||||||
#define IDC_MYICON 2
|
|
||||||
#ifndef IDC_STATIC
|
|
||||||
#define IDC_STATIC -1
|
|
||||||
#endif
|
|
||||||
// Next default values for new objects
|
|
||||||
//
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
|
|
||||||
#define _APS_NO_MFC 130
|
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 129
|
|
||||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
|
||||||
#define _APS_NEXT_SYMED_VALUE 110
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,326 +0,0 @@
|
||||||
//DLL entry point
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
|
||||||
#include "TellUsbD101.h"
|
|
||||||
#include "TelldusSettings.h"
|
|
||||||
#include "Device.h"
|
|
||||||
#include <vector>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
#include <ole2.h>
|
|
||||||
|
|
||||||
void handleException(std::exception e);
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_LOADSTRING 100
|
|
||||||
|
|
||||||
//TODO:
|
|
||||||
//delete on created objects
|
|
||||||
//comment (just copy from the called methods)
|
|
||||||
|
|
||||||
bool __stdcall devTurnOn(int intDeviceId){
|
|
||||||
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
Device* dev = ts.getDevice(intDeviceId);
|
|
||||||
if(dev != NULL){
|
|
||||||
dev->turnOn();
|
|
||||||
|
|
||||||
delete(dev);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devTurnOff(int intDeviceId){
|
|
||||||
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
Device* dev = ts.getDevice(intDeviceId);
|
|
||||||
if(dev != NULL){
|
|
||||||
dev->turnOff();
|
|
||||||
|
|
||||||
delete(dev);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devBell(int intDeviceId){
|
|
||||||
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
Device* dev = ts.getDevice(intDeviceId);
|
|
||||||
if(dev != NULL){
|
|
||||||
dev->bell();
|
|
||||||
|
|
||||||
delete(dev);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devDim(int intDeviceId, unsigned char level){
|
|
||||||
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
Device* dev = ts.getDevice(intDeviceId);
|
|
||||||
if(dev != NULL){
|
|
||||||
if (level == 0) {
|
|
||||||
dev->turnOff();
|
|
||||||
} else if (level == 255) {
|
|
||||||
dev->turnOn();
|
|
||||||
} else {
|
|
||||||
dev->dim(level);
|
|
||||||
}
|
|
||||||
delete(dev);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall devGetNumberOfDevices(void){
|
|
||||||
int intReturn = -1;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
intReturn = ts.getNumberOfDevices();
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
intReturn = -1;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall devGetDeviceId(int intDeviceIndex){
|
|
||||||
int intReturn = -1;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
intReturn = ts.getDeviceId(intDeviceIndex);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
intReturn = -1;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
//general settings:
|
|
||||||
char * __stdcall devGetName(int intDeviceId){
|
|
||||||
char* strReturn;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
strReturn = ts.getName(intDeviceId);
|
|
||||||
strReturn = (char *)SysAllocStringByteLen (strReturn, lstrlen(strReturn));
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
strReturn = "";
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devSetName(int intDeviceId, char* strNewName){
|
|
||||||
bool blnSuccess = false;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
blnSuccess = ts.setName(intDeviceId, strNewName);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
blnSuccess = false;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* __stdcall devGetVendor(int intDeviceId){
|
|
||||||
char* strReturn = "";
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
strReturn = ts.getVendor(intDeviceId);
|
|
||||||
strReturn = (char *)SysAllocStringByteLen (strReturn, lstrlen(strReturn));
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
strReturn = "";
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devSetVendor(int intDeviceId, char* strVendor){
|
|
||||||
bool blnSuccess = false;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
blnSuccess = ts.setVendor(intDeviceId, strVendor);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
blnSuccess = false;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* __stdcall devGetModel(int intDeviceId){
|
|
||||||
char* strReturn = "";
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
strReturn = ts.getModel(intDeviceId);
|
|
||||||
strReturn = (char *)SysAllocStringByteLen (strReturn, lstrlen(strReturn));
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
strReturn = "";
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devSetModel(int intDeviceId, char* strNewModel){
|
|
||||||
bool blnSuccess = false;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
blnSuccess = ts.setModel(intDeviceId, strNewModel);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
blnSuccess = false;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devSetArguments(int intDeviceId, char* strArguments){
|
|
||||||
|
|
||||||
vector <int> vArguments;
|
|
||||||
//int intArguments[] = new int[]; //bort?
|
|
||||||
try{
|
|
||||||
char* strTemp = strtok(strArguments, ",");
|
|
||||||
|
|
||||||
while(strTemp != NULL){
|
|
||||||
vArguments.push_back(atoi(strTemp));
|
|
||||||
strTemp = strtok(NULL, ",");
|
|
||||||
}
|
|
||||||
TelldusSettings ts;
|
|
||||||
return ts.setArguments(intDeviceId, vArguments);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall devGetArgument(int intDeviceId, int intArgumentIndex){
|
|
||||||
int intReturn;
|
|
||||||
try{
|
|
||||||
if(intArgumentIndex != -1){
|
|
||||||
TelldusSettings ts;
|
|
||||||
int* intArguments = ts.getArguments(intDeviceId);
|
|
||||||
intReturn = intArguments[intArgumentIndex];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall devGetNumberOfArguments(int intDeviceId){
|
|
||||||
int intReturn;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
intReturn = ts.getNumberOfArguments(intDeviceId);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall devAddDevice(){
|
|
||||||
int intNewDeviceId = -1;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
intNewDeviceId = ts.addDevice();
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
intNewDeviceId = -1;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return intNewDeviceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool __stdcall devRemoveDevice(int intDeviceId){
|
|
||||||
bool blnSuccess = false;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
blnSuccess = ts.removeDevice(intDeviceId);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
blnSuccess = false;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __stdcall devMethods(int id){
|
|
||||||
|
|
||||||
int intMethods = 0;
|
|
||||||
try{
|
|
||||||
TelldusSettings ts;
|
|
||||||
char* strModel = ts.getModel(id);
|
|
||||||
Device* dev = ts.getDevice(id, -1); //We send dongleIndex=-1 sice we wouldn't send any data!
|
|
||||||
if (dev != NULL) {
|
|
||||||
intMethods = dev->methods(strModel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
intMethods = 0;
|
|
||||||
handleException(e);
|
|
||||||
}
|
|
||||||
return intMethods;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//********
|
|
||||||
//* Error management, set strLogName to "" to turn off
|
|
||||||
//*
|
|
||||||
void handleException(exception e){
|
|
||||||
|
|
||||||
char* strLogName = "c:\\errorlog.txt";
|
|
||||||
//char* strLogName = "";
|
|
||||||
|
|
||||||
if(strlen(strLogName) > 0){
|
|
||||||
ofstream errorfile(strLogName, ios::app);
|
|
||||||
if(errorfile){
|
|
||||||
errorfile << e.what() << endl;
|
|
||||||
errorfile.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
LIBRARY TellUsbD101
|
|
||||||
EXPORTS
|
|
||||||
devGetNumberOfDevices @1
|
|
||||||
devGetDeviceId @2
|
|
||||||
|
|
||||||
devGetName @3
|
|
||||||
devGetVendor @4
|
|
||||||
devGetModel @5
|
|
||||||
devGetNumberOfArguments @6
|
|
||||||
devGetArgument @7
|
|
||||||
|
|
||||||
devSetName @8
|
|
||||||
devSetVendor @9
|
|
||||||
devSetModel @10
|
|
||||||
devSetArguments @11
|
|
||||||
|
|
||||||
devAddDevice @12
|
|
||||||
devRemoveDevice @13
|
|
||||||
|
|
||||||
devMethods @14
|
|
||||||
devTurnOn @16
|
|
||||||
devTurnOff @17
|
|
||||||
devBell @18
|
|
||||||
devDim @19
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
#ifndef TELLUSBD101_H
|
|
||||||
#define TELLUSBD101_H
|
|
||||||
|
|
||||||
// The following ifdef block is the standard way of creating macros
|
|
||||||
// which make exporting from a DLL simpler. All files within this DLL
|
|
||||||
// are compiled with the TellUsbD101_EXPORTS symbol defined on the command line.
|
|
||||||
// This symbol should not be defined on any project that uses this DLL.
|
|
||||||
// This way any other project whose source files include this file see
|
|
||||||
// TELLSTICK_API functions as being imported from a DLL, whereas this DLL
|
|
||||||
// sees symbols defined with this macro as being exported.
|
|
||||||
|
|
||||||
#ifdef TellUsbD101_EXPORTS
|
|
||||||
#define TELLSTICK_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define TELLSTICK_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
#ifdef _WINDOWS
|
|
||||||
#define WINAPI __stdcall
|
|
||||||
#else
|
|
||||||
#define WINAPI
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
TELLSTICK_API bool WINAPI devTurnOn(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devTurnOff(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devBell(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devDim(int intDeviceId, unsigned char level);
|
|
||||||
TELLSTICK_API int WINAPI devGetNumberOfDevices();
|
|
||||||
TELLSTICK_API char * WINAPI devGetName(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devSetName(int intDeviceId, const char* chNewName);
|
|
||||||
TELLSTICK_API char* WINAPI devGetVendor(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devSetVendor(int intDeviceId, const char* chNewName);
|
|
||||||
TELLSTICK_API char* WINAPI devGetModel(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devSetModel(int intDeviceId, const char* chNewName);
|
|
||||||
TELLSTICK_API int WINAPI devGetArgument(int intDeviceId, int intArgumentIndex);
|
|
||||||
TELLSTICK_API int WINAPI devGetNumberOfArguments(int intDeviceId);
|
|
||||||
TELLSTICK_API bool WINAPI devSetArguments(int intDeviceId, const char* strArguments);
|
|
||||||
TELLSTICK_API int WINAPI devAddDevice();
|
|
||||||
TELLSTICK_API int WINAPI devAddDeviceWithArguments(char* strVendor, int* intArguments[], int intNumberOfArguments);
|
|
||||||
TELLSTICK_API bool WINAPI devRemoveDevice(int intDeviceId);
|
|
||||||
TELLSTICK_API int WINAPI devGetDeviceId(int intDeviceIndex);
|
|
||||||
TELLSTICK_API int WINAPI devMethods(int id);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TELLSTICK_TURNON 1
|
|
||||||
#define TELLSTICK_TURNOFF 2
|
|
||||||
#define TELLSTICK_BELL 4
|
|
||||||
#define TELLSTICK_TOGGLE 8
|
|
||||||
#define TELLSTICK_DIM 16
|
|
||||||
|
|
||||||
//Protocol Nexa
|
|
||||||
#define TELLSTICK_DEVICE_YCR3500 "1"
|
|
||||||
#define TELLSTICK_DEVICE_YCR300D "2"
|
|
||||||
#define TELLSTICK_DEVICE_WSR1000 "3"
|
|
||||||
#define TELLSTICK_DEVICE_CMR1000 "4"
|
|
||||||
#define TELLSTICK_DEVICE_CMR300 "5"
|
|
||||||
#define TELLSTICK_DEVICE_PA33300 "6"
|
|
||||||
#define TELLSTICK_DEVICE_EL2000 "8"
|
|
||||||
#define TELLSTICK_DEVICE_EL2005 "9"
|
|
||||||
#define TELLSTICK_DEVICE_EL2006 "10"
|
|
||||||
#define TELLSTICK_DEVICE_SYCR3500 "12"
|
|
||||||
#define TELLSTICK_DEVICE_SYCR300 "13"
|
|
||||||
#define TELLSTICK_DEVICE_HDR105 "14"
|
|
||||||
#define TELLSTICK_DEVICE_ML7100 "15"
|
|
||||||
#define TELLSTICK_DEVICE_EL2004 "16"
|
|
||||||
#define TELLSTICK_DEVICE_EL2016 "17"
|
|
||||||
#define TELLSTICK_DEVICE_EL2010 "18"
|
|
||||||
#define TELLSTICK_DEVICE_LYCR1000 "20"
|
|
||||||
#define TELLSTICK_DEVICE_LYCR300 "21"
|
|
||||||
#define TELLSTICK_DEVICE_LCMR1000 "22"
|
|
||||||
#define TELLSTICK_DEVICE_LCMR300 "23"
|
|
||||||
#define TELLSTICK_DEVICE_EL2023 "24"
|
|
||||||
#define TELLSTICK_DEVICE_EL2024 "25"
|
|
||||||
#define TELLSTICK_DEVICE_EL2021 "26"
|
|
||||||
#define TELLSTICK_DEVICE_EL2017 "27"
|
|
||||||
#define TELLSTICK_DEVICE_EL2019 "28"
|
|
||||||
|
|
||||||
//Protocol Ikea
|
|
||||||
#define TELLSTICK_DEVICE_KOPPLA "19"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,308 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8,00"
|
|
||||||
Name="TellUsbD101"
|
|
||||||
ProjectGUID="{2A868E40-88D9-4800-A83F-21D0F8DCB611}"
|
|
||||||
RootNamespace="TellUsbD101"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;TELLTEST3_EXPORTS"
|
|
||||||
GeneratePreprocessedFile="0"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
ModuleDefinitionFile="$(SolutionDir)\tellTest3\tellTest3.def"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TellUsbD101_EXPORTS"
|
|
||||||
GeneratePreprocessedFile="0"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="advapi32.lib oleaut32.lib"
|
|
||||||
LinkIncremental="1"
|
|
||||||
ModuleDefinitionFile="TellUsbD101.def"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Device.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\win\Device.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
ObjectFile="$(IntDir)\$(InputName)1.obj"
|
|
||||||
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
ObjectFile="$(IntDir)\$(InputName)1.obj"
|
|
||||||
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceIkea.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceNexa.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceSartano.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceWaveman.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\TelldusSettings.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\TellUsbD101.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Device.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceIkea.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceNexa.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceSartano.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\DeviceWaveman.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\win\FTD2XX.H"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Resource.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\TelldusSettings.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\TellUsbD101.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\TellUsbD101.def"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath=".\FTD2XX.dll"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\FTD2XX.lib"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\ReadMe.txt"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
||||||
|
|
@ -1,669 +0,0 @@
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "TelldusSettings.h"
|
|
||||||
#include "Device.h"
|
|
||||||
#include "DeviceNexa.h"
|
|
||||||
#include "DeviceWaveman.h"
|
|
||||||
#include "DeviceSartano.h"
|
|
||||||
#include "DeviceIkea.h"
|
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
bool storeGlobal();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
TelldusSettings::TelldusSettings(void)
|
|
||||||
{
|
|
||||||
strRegPathDevice = "SOFTWARE\\Telldus\\Devices\\";
|
|
||||||
strRegPath = "SOFTWARE\\Telldus\\";
|
|
||||||
intMaxRegValueLength = 1000;
|
|
||||||
if (storeGlobal()) {
|
|
||||||
rootKey = HKEY_LOCAL_MACHINE;
|
|
||||||
} else {
|
|
||||||
rootKey = HKEY_CURRENT_USER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
TelldusSettings::~TelldusSettings(void)
|
|
||||||
{
|
|
||||||
//RegCloseKey(hk); //close all, if still open //TODO: Need some way to know if open or closed
|
|
||||||
strRegPath = "";
|
|
||||||
strRegPathDevice = "";
|
|
||||||
intMaxRegValueLength = -1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the number of stored devices
|
|
||||||
*/
|
|
||||||
int TelldusSettings::getNumberOfDevices(void){
|
|
||||||
|
|
||||||
int intNumberOfDevices = 0;
|
|
||||||
|
|
||||||
try{
|
|
||||||
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strRegPathDevice.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
|
|
||||||
string strNumSubKeys;
|
|
||||||
DWORD dNumSubKeys;
|
|
||||||
RegQueryInfoKey(hk, NULL, NULL, NULL, &dNumSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
intNumberOfDevices = (int)dNumSubKeys;
|
|
||||||
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
intNumberOfDevices = -1;
|
|
||||||
}
|
|
||||||
return intNumberOfDevices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the requested device
|
|
||||||
*/
|
|
||||||
Device* TelldusSettings::getDevice(int intDeviceId){
|
|
||||||
|
|
||||||
try{
|
|
||||||
int intDongleIndex = Device::getDongleIndex();
|
|
||||||
if(intDongleIndex != -1){
|
|
||||||
return getDevice(intDeviceId, intDongleIndex);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the requested device, when the index of the USB dongle is known
|
|
||||||
* Note that the returned Device should be deleted when not in use anymore
|
|
||||||
*/
|
|
||||||
Device* TelldusSettings::getDevice(int intDeviceId, int intDongleIndex){
|
|
||||||
|
|
||||||
Device* dev = 0;
|
|
||||||
|
|
||||||
try{
|
|
||||||
char* vendor = getVendor(intDeviceId);
|
|
||||||
|
|
||||||
int* args = getArguments(intDeviceId);
|
|
||||||
|
|
||||||
//each new brand must be added here
|
|
||||||
if (strcmp(vendor, "Nexa") == 0){
|
|
||||||
dev = new DeviceNexa((int)args[0], (int)args[1], intDongleIndex);
|
|
||||||
} else if (strcmp(vendor, "Waveman") == 0) {
|
|
||||||
dev = new DeviceWaveman((int)args[0], (int)args[1], intDongleIndex);
|
|
||||||
} else if (strcmp(vendor, "Sartano") == 0) {
|
|
||||||
dev = new DeviceSartano((int)args[0], (int)args[1], intDongleIndex);
|
|
||||||
} else if (strcmp(vendor, "Ikea") == 0) {
|
|
||||||
dev = new DeviceIkea((int)args[0], (int)args[1], (int)args[2], intDongleIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
return dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the name of the device
|
|
||||||
*/
|
|
||||||
char* TelldusSettings::getName(int intDeviceId){
|
|
||||||
|
|
||||||
char* strReturn = "";
|
|
||||||
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
DWORD dwLength;
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
|
|
||||||
long lngStatus = RegQueryValueEx(hk, "Name", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
if(lngStatus == ERROR_MORE_DATA){
|
|
||||||
Buff = new char[dwLength];
|
|
||||||
lngStatus = RegQueryValueEx(hk, "Name", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
}
|
|
||||||
strReturn = Buff;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
strReturn = "";
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the name of the device
|
|
||||||
*/
|
|
||||||
bool TelldusSettings::setName(int intDeviceId, char* strNewName){
|
|
||||||
|
|
||||||
bool blnSuccess = true;
|
|
||||||
try{
|
|
||||||
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
intMaxRegValueLength = (int)strlen(strNewName);
|
|
||||||
RegSetValueEx(hk, "Name", 0, REG_SZ, (LPBYTE)strNewName, intMaxRegValueLength);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the device vendor
|
|
||||||
*/
|
|
||||||
char* TelldusSettings::getVendor(int intDeviceId){
|
|
||||||
|
|
||||||
char* strReturn = "";
|
|
||||||
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, (LPCSTR)strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
DWORD dwLength;
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
|
|
||||||
long lngStatus = RegQueryValueEx(hk, (LPCSTR)"Vendor", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
if(lngStatus == ERROR_MORE_DATA){
|
|
||||||
Buff = new char[dwLength];
|
|
||||||
lngStatus = RegQueryValueEx(hk, (LPCSTR)"Vendor", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
strReturn = Buff;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(exception e){
|
|
||||||
strReturn = "";
|
|
||||||
ofstream errorfile("c:\\errorlog.txt", ios::app);
|
|
||||||
if(errorfile){
|
|
||||||
errorfile << e.what() << endl;
|
|
||||||
errorfile.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the device vendor
|
|
||||||
*/
|
|
||||||
bool TelldusSettings::setVendor(int intDeviceId, char* strVendor){
|
|
||||||
|
|
||||||
bool blnSuccess = true;
|
|
||||||
try{
|
|
||||||
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
intMaxRegValueLength = (int)strlen(strVendor);
|
|
||||||
RegSetValueEx(hk, "Vendor", 0, REG_SZ, (LPBYTE)strVendor, intMaxRegValueLength);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the device model
|
|
||||||
*/
|
|
||||||
char* TelldusSettings::getModel(int intDeviceId){
|
|
||||||
|
|
||||||
char* strReturn = "";
|
|
||||||
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
DWORD dwLength;
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
|
|
||||||
long lngStatus = RegQueryValueEx(hk, "Model", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
if(lngStatus == ERROR_MORE_DATA){
|
|
||||||
|
|
||||||
Buff = new char[dwLength];
|
|
||||||
lngStatus = RegQueryValueEx(hk, "Model", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
}
|
|
||||||
strReturn = Buff;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
strReturn = "";
|
|
||||||
}
|
|
||||||
return strReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the device model
|
|
||||||
*/
|
|
||||||
bool TelldusSettings::setModel(int intDeviceId, char* strVendor){
|
|
||||||
|
|
||||||
bool blnSuccess = true;
|
|
||||||
try{
|
|
||||||
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
intMaxRegValueLength = (int)strlen(strVendor);
|
|
||||||
RegSetValueEx(hk, "Model", 0, REG_SZ, (LPBYTE)strVendor, intMaxRegValueLength);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TelldusSettings::getDeviceId(int intDeviceIndex){
|
|
||||||
int intReturn = -1;
|
|
||||||
|
|
||||||
try{
|
|
||||||
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strRegPathDevice.c_str(), 0, KEY_READ, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
DWORD size;
|
|
||||||
if (RegEnumKeyEx(hk, intDeviceIndex, (LPSTR)Buff, &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
|
|
||||||
intReturn = (int)_atoi64(Buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete Buff;
|
|
||||||
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
intReturn = -1;
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get number of device arguments
|
|
||||||
*/
|
|
||||||
int TelldusSettings::getNumberOfArguments(int intDeviceId){
|
|
||||||
int intReturn = -1;
|
|
||||||
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
DWORD dNumValues;
|
|
||||||
RegQueryInfoKey(hk, NULL, NULL, NULL, NULL, NULL, NULL, &dNumValues, NULL, NULL, NULL, NULL);
|
|
||||||
intReturn = (int)dNumValues - 3; //total number of values - model, name and vendor
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
//error management
|
|
||||||
}
|
|
||||||
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get device arguments
|
|
||||||
*/
|
|
||||||
int* TelldusSettings::getArguments(int intDeviceId){
|
|
||||||
vector <int> vReturn;
|
|
||||||
int* intReturn = new int[];
|
|
||||||
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
DWORD dNumValues;
|
|
||||||
RegQueryInfoKey(hk, NULL, NULL, NULL, NULL, NULL, NULL, &dNumValues, NULL, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
int intNumberOfArguments = (int)dNumValues - 3; //total number of values - model, name and vendor
|
|
||||||
DWORD dwLength;
|
|
||||||
char chConvertBuffer[20];
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while(i < intNumberOfArguments){
|
|
||||||
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
|
|
||||||
_itoa(i, chConvertBuffer, 10);
|
|
||||||
long lngStatus = RegQueryValueEx(hk, chConvertBuffer, NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
if(lngStatus == ERROR_MORE_DATA){
|
|
||||||
lngStatus = RegQueryValueEx(hk, chConvertBuffer, NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
}
|
|
||||||
int intReturn = (int)_atoi64(Buff);
|
|
||||||
vReturn.push_back(intReturn);
|
|
||||||
|
|
||||||
i++;
|
|
||||||
delete Buff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
|
|
||||||
intReturn = new int[vReturn.size()];
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
while(i < (int)vReturn.size()){
|
|
||||||
intReturn[i] = vReturn.at(i);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
//error management
|
|
||||||
}
|
|
||||||
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set device arguments
|
|
||||||
*/
|
|
||||||
bool TelldusSettings::setArguments(int intDeviceId, int* intArguments[], int intNumberOfArguments){
|
|
||||||
|
|
||||||
bool blnSuccess = true;
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
char chConvertBuffer [20];
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
int i = 0;
|
|
||||||
while(i < intNumberOfArguments){
|
|
||||||
_itoa(i, chConvertBuffer, 10);
|
|
||||||
RegSetValueEx(hk, chConvertBuffer, 0, REG_SZ, (LPBYTE)intArguments[i], intMaxRegValueLength);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set device arguments
|
|
||||||
*/
|
|
||||||
bool TelldusSettings::setArguments(int intDeviceId, vector <int> vArguments){
|
|
||||||
|
|
||||||
bool blnSuccess = true;
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
char chConvertBuffer [20];
|
|
||||||
char chConvertBufferValue [20];
|
|
||||||
long lnExists = RegOpenKeyEx(rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
int i = 0;
|
|
||||||
while(i < vArguments.size()){
|
|
||||||
_itoa(i, chConvertBuffer, 10);
|
|
||||||
_itoa(vArguments.at(i), chConvertBufferValue, 10);
|
|
||||||
intMaxRegValueLength = (int)strlen(chConvertBufferValue);
|
|
||||||
RegSetValueEx(hk, chConvertBuffer, 0, REG_SZ, (LPBYTE)chConvertBufferValue, intMaxRegValueLength);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw exception(); //couldn't open reg key
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add a new device
|
|
||||||
*/
|
|
||||||
int TelldusSettings::addDevice(){
|
|
||||||
|
|
||||||
int intDeviceId = -1;
|
|
||||||
try{
|
|
||||||
|
|
||||||
DWORD dwDisp;
|
|
||||||
intDeviceId = getNextDeviceId();
|
|
||||||
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
|
|
||||||
if(RegCreateKeyEx(rootKey,
|
|
||||||
strCompleteRegPath.c_str(),
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
REG_OPTION_NON_VOLATILE,
|
|
||||||
KEY_ALL_ACCESS,
|
|
||||||
NULL,
|
|
||||||
&hk,
|
|
||||||
&dwDisp)){
|
|
||||||
//fail
|
|
||||||
throw exception("Create Key failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
RegCloseKey(hk);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
intDeviceId = -1;
|
|
||||||
}
|
|
||||||
return intDeviceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get next available device id
|
|
||||||
*/
|
|
||||||
int TelldusSettings::getNextDeviceId(){
|
|
||||||
|
|
||||||
int intReturn = -1;
|
|
||||||
try{
|
|
||||||
DWORD dwDisp;
|
|
||||||
long lnExists = RegCreateKeyEx(rootKey, strRegPathDevice.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE,
|
|
||||||
KEY_ALL_ACCESS,
|
|
||||||
NULL,
|
|
||||||
&hk,
|
|
||||||
&dwDisp); //create or open if already created
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
|
|
||||||
DWORD dwLength;
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
|
|
||||||
long lngStatus = RegQueryValueEx(hk, "LastUsedId", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
|
|
||||||
if(lngStatus == ERROR_MORE_DATA){
|
|
||||||
|
|
||||||
|
|
||||||
Buff = new char[dwLength];
|
|
||||||
lngStatus = RegQueryValueEx(hk, "LastUsedId", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lngStatus == ERROR_SUCCESS){
|
|
||||||
|
|
||||||
int intLast = (int)Buff[0];
|
|
||||||
intReturn = intLast + 1;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
intReturn = 1;
|
|
||||||
}
|
|
||||||
delete Buff;
|
|
||||||
|
|
||||||
DWORD dwVal = intReturn;
|
|
||||||
|
|
||||||
RegSetValueEx (hk, "LastUsedId", 0L, REG_DWORD, (CONST BYTE*) &dwVal, sizeof(DWORD));
|
|
||||||
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
intReturn = -1;
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove a device
|
|
||||||
*/
|
|
||||||
bool TelldusSettings::removeDevice(int intDeviceId){
|
|
||||||
|
|
||||||
bool blnSuccess = true;
|
|
||||||
try{
|
|
||||||
std::ostringstream ssRegPath;
|
|
||||||
ssRegPath << strRegPathDevice << intDeviceId;
|
|
||||||
string strCompleteRegPath = ssRegPath.str();
|
|
||||||
|
|
||||||
long lngSuccess = RegDeleteKey(rootKey, strCompleteRegPath.c_str());
|
|
||||||
if(lngSuccess != ERROR_SUCCESS){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
blnSuccess = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return blnSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
//only for debug reasons
|
|
||||||
void TelldusSettings::debugLog(char* debugstring){
|
|
||||||
ofstream debugfile("c:\\telldusdebug.txt", ios::app);
|
|
||||||
if(debugfile){
|
|
||||||
debugfile << debugstring << endl;
|
|
||||||
debugfile.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//only for debug reasons
|
|
||||||
void TelldusSettings::debugLog(int debugint){
|
|
||||||
ofstream debugfile("c:\\telldusdebug.txt", ios::app);
|
|
||||||
if(debugfile){
|
|
||||||
debugfile << debugint << endl;
|
|
||||||
debugfile.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TelldusSettings::storeGlobal() {
|
|
||||||
bool blnReturn = false;
|
|
||||||
try{
|
|
||||||
long lnExists = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strRegPathDevice.c_str(), 0, KEY_QUERY_VALUE, &hk);
|
|
||||||
|
|
||||||
if(lnExists == ERROR_SUCCESS){
|
|
||||||
|
|
||||||
DWORD dwLength;
|
|
||||||
char* Buff = new char[intMaxRegValueLength];
|
|
||||||
|
|
||||||
long lngStatus = RegQueryValueEx(hk, "SharedDevices", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
|
|
||||||
if(lngStatus == ERROR_MORE_DATA){
|
|
||||||
|
|
||||||
|
|
||||||
Buff = new char[dwLength];
|
|
||||||
lngStatus = RegQueryValueEx(hk, "SharedDevices", NULL, NULL, (LPBYTE)Buff, &dwLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lngStatus == ERROR_SUCCESS){
|
|
||||||
|
|
||||||
int intValue = (int)Buff[0];
|
|
||||||
blnReturn = (intValue == 1);
|
|
||||||
}
|
|
||||||
delete Buff;
|
|
||||||
}
|
|
||||||
RegCloseKey(hk);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
}
|
|
||||||
return blnReturn;
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "device.h"
|
|
||||||
#include "devicenexa.h"
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class TelldusSettings
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TelldusSettings(void);
|
|
||||||
int getNumberOfDevices(void);
|
|
||||||
Device* getDevice(int intDeviceId);
|
|
||||||
Device* getDevice(int intDeviceId, int intDongleIndex);
|
|
||||||
char* getName(int intDeviceId);
|
|
||||||
bool setName(int intDeviceId, char* strNewName);
|
|
||||||
char* getVendor(int intDeviceId);
|
|
||||||
bool setVendor(int intDeviceId, char* strVendor);
|
|
||||||
char* getModel(int intDeviceId);
|
|
||||||
bool setModel(int intDeviceId, char* strModel);
|
|
||||||
int* getArguments(int intDeviceId);
|
|
||||||
bool setArguments(int intDeviceId, int* intArguments[], int intNumberOfArguments);
|
|
||||||
bool setArguments(int intDeviceId, vector <int> vArguments);
|
|
||||||
int addDevice();
|
|
||||||
int getDeviceId(int intDeviceIndex);
|
|
||||||
bool removeDevice(int intDeviceId);
|
|
||||||
void debugLog(char* debugstring);
|
|
||||||
void debugLog(int debugint);
|
|
||||||
int getNumberOfArguments(int intDeviceId);
|
|
||||||
|
|
||||||
~TelldusSettings(void);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int getNextDeviceId();
|
|
||||||
bool storeGlobal();
|
|
||||||
|
|
||||||
//variables
|
|
||||||
HKEY hk;
|
|
||||||
HKEY rootKey;
|
|
||||||
std::string strRegPathDevice;
|
|
||||||
std::string strRegPath;
|
|
||||||
int intMaxRegValueLength;
|
|
||||||
};
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
#include "../Device.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <termios.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send message to the USB dongle
|
|
||||||
*/
|
|
||||||
void Device::send(char* strMessage) {
|
|
||||||
int fd = -1;
|
|
||||||
struct termios tio;
|
|
||||||
|
|
||||||
debugLog(strMessage);
|
|
||||||
|
|
||||||
if( 0 > ( fd = open( "/dev/tellstick", O_RDWR ) ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* adjust serial port parameters */
|
|
||||||
bzero(&tio, sizeof(tio)); /* clear struct for new port settings */
|
|
||||||
tio.c_cflag = B4800 | CS8 | CLOCAL | CREAD; /* CREAD not used yet */
|
|
||||||
tio.c_iflag = IGNPAR;
|
|
||||||
tio.c_oflag = 0;
|
|
||||||
tcflush(fd, TCIFLUSH);
|
|
||||||
tcsetattr(fd,TCSANOW,&tio);
|
|
||||||
|
|
||||||
write(fd, strMessage, strlen(strMessage));
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the device index of the Telldus dongle (the first one if many are connected)
|
|
||||||
* -1 if no such device exists
|
|
||||||
*/
|
|
||||||
int Device::getDongleIndex(){
|
|
||||||
int intReturn = -1;
|
|
||||||
/* FT_HANDLE fthHandle = 0;
|
|
||||||
FT_STATUS ftStatus = FT_OK;
|
|
||||||
|
|
||||||
try{
|
|
||||||
DWORD dwNumberOfDevices = 0;
|
|
||||||
|
|
||||||
ftStatus = FT_CreateDeviceInfoList(&dwNumberOfDevices);
|
|
||||||
if (ftStatus == FT_OK) {
|
|
||||||
for (int i = 0; i < (int)dwNumberOfDevices; i++) {
|
|
||||||
|
|
||||||
FT_PROGRAM_DATA pData;
|
|
||||||
char ManufacturerBuf[32];
|
|
||||||
char ManufacturerIdBuf[16];
|
|
||||||
char DescriptionBuf[64];
|
|
||||||
char SerialNumberBuf[16];
|
|
||||||
|
|
||||||
pData.Signature1 = 0x00000000;
|
|
||||||
pData.Signature2 = 0xffffffff;
|
|
||||||
pData.Version = 0x00000002; // EEPROM structure with FT232R extensions
|
|
||||||
pData.Manufacturer = ManufacturerBuf;
|
|
||||||
pData.ManufacturerId = ManufacturerIdBuf;
|
|
||||||
pData.Description = DescriptionBuf;
|
|
||||||
pData.SerialNumber = SerialNumberBuf;
|
|
||||||
|
|
||||||
ftStatus = FT_Open(i, &fthHandle);
|
|
||||||
ftStatus = FT_EE_Read(fthHandle, &pData);
|
|
||||||
if(ftStatus == FT_OK){
|
|
||||||
if(pData.VendorId == 6017 && pData.ProductId == 3120){
|
|
||||||
intReturn = i;
|
|
||||||
ftStatus = FT_Close(fthHandle);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ftStatus = FT_Close(fthHandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}*/
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
//only for debugging purpose
|
|
||||||
void Device::debugLog(char* debugstring){
|
|
||||||
std::cout << debugstring << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
// stdafx.cpp : source file that includes just the standard includes
|
|
||||||
// testruntelldus3.pch will be the pre-compiled header
|
|
||||||
// stdafx.obj will contain the pre-compiled type information
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
// TODO: reference any additional headers you need in STDAFX.H
|
|
||||||
// and not in this file
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
// stdafx.h : include file for standard system include files,
|
|
||||||
// or project specific include files that are used frequently, but
|
|
||||||
// are changed infrequently
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
// Modify the following defines if you have to target a platform prior to the ones specified below.
|
|
||||||
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
|
||||||
#ifndef WINVER // Allow use of features specific to Windows XP or later.
|
|
||||||
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
|
|
||||||
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
|
|
||||||
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
|
|
||||||
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
||||||
// Windows Header Files:
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
// C RunTime Header Files
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <memory.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: reference additional headers your program requires here
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
#include "..\Device.h"
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <vector>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
#include "..\StdAfx.h"
|
|
||||||
#include "FTD2XX.H"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send message to the USB dongle
|
|
||||||
*/
|
|
||||||
void Device::send(char* strMessage){
|
|
||||||
|
|
||||||
try{
|
|
||||||
FT_STATUS ftStatus = FT_OK;
|
|
||||||
FT_HANDLE fthHandle = 0;
|
|
||||||
|
|
||||||
ftStatus = FT_Open(this->intDongleIndex, &fthHandle);
|
|
||||||
int intBaudRate = 4800; //always 4800
|
|
||||||
ftStatus = FT_SetBaudRate(fthHandle, intBaudRate);
|
|
||||||
ULONG bytesWritten;
|
|
||||||
|
|
||||||
int intLen = (int)strlen(strMessage);
|
|
||||||
ftStatus = FT_Write(fthHandle, strMessage, intLen, &bytesWritten);
|
|
||||||
|
|
||||||
ftStatus = FT_Close(fthHandle);
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the device index of the Telldus dongle (the first one if many are connected)
|
|
||||||
* -1 if no such device exists
|
|
||||||
*/
|
|
||||||
int Device::getDongleIndex(){
|
|
||||||
int intReturn = -1;
|
|
||||||
FT_HANDLE fthHandle = 0;
|
|
||||||
FT_STATUS ftStatus = FT_OK;
|
|
||||||
|
|
||||||
try{
|
|
||||||
DWORD dwNumberOfDevices = 0;
|
|
||||||
|
|
||||||
ftStatus = FT_CreateDeviceInfoList(&dwNumberOfDevices);
|
|
||||||
if (ftStatus == FT_OK) {
|
|
||||||
for (int i = 0; i < (int)dwNumberOfDevices; i++) {
|
|
||||||
|
|
||||||
FT_PROGRAM_DATA pData;
|
|
||||||
char ManufacturerBuf[32];
|
|
||||||
char ManufacturerIdBuf[16];
|
|
||||||
char DescriptionBuf[64];
|
|
||||||
char SerialNumberBuf[16];
|
|
||||||
|
|
||||||
pData.Signature1 = 0x00000000;
|
|
||||||
pData.Signature2 = 0xffffffff;
|
|
||||||
pData.Version = 0x00000002; // EEPROM structure with FT232R extensions
|
|
||||||
pData.Manufacturer = ManufacturerBuf;
|
|
||||||
pData.ManufacturerId = ManufacturerIdBuf;
|
|
||||||
pData.Description = DescriptionBuf;
|
|
||||||
pData.SerialNumber = SerialNumberBuf;
|
|
||||||
|
|
||||||
ftStatus = FT_Open(i, &fthHandle);
|
|
||||||
ftStatus = FT_EE_Read(fthHandle, &pData);
|
|
||||||
if(ftStatus == FT_OK){
|
|
||||||
if(pData.VendorId == 6017 && pData.ProductId == 3120){
|
|
||||||
intReturn = i;
|
|
||||||
ftStatus = FT_Close(fthHandle);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ftStatus = FT_Close(fthHandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(...){
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
return intReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
//only for debugging purpose
|
|
||||||
void Device::debugLog(char* debugstring){
|
|
||||||
std::ofstream debugfile("c:\\telldusdebug.txt", std::ios::app);
|
|
||||||
if(debugfile){
|
|
||||||
debugfile << debugstring << std::endl;
|
|
||||||
debugfile.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
13
examples/c/sensors/callback/Makefile
Normal file
13
examples/c/sensors/callback/Makefile
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
CC=gcc
|
||||||
|
CFLAGS=-Wall -ltelldus-core
|
||||||
|
|
||||||
|
OBJS = main.o
|
||||||
|
|
||||||
|
all: ${OBJS}
|
||||||
|
${CC} -o sensor ${CFLAGS} ${OBJS}
|
||||||
|
|
||||||
|
main.c:
|
||||||
|
${CC} ${CFLAGS} -c main.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f sensor main.o
|
||||||
43
examples/c/sensors/callback/main.c
Normal file
43
examples/c/sensors/callback/main.c
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
#include <telldus-core.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
void WINAPI sensorEvent(const char *protocol, const char *model, int sensorId, int dataType, const char *value, int ts, int callbackId, void *context) {
|
||||||
|
char timeBuf[80];
|
||||||
|
time_t timestamp = ts;
|
||||||
|
|
||||||
|
//Print the sensor
|
||||||
|
printf("%s,\t%s,\t%i\n", protocol, model, sensorId);
|
||||||
|
|
||||||
|
//Retrieve the values the sensor supports
|
||||||
|
if (dataType == TELLSTICK_TEMPERATURE) {
|
||||||
|
strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
|
||||||
|
printf("Temperature:\t%sº\t(%s)\n", value, timeBuf);
|
||||||
|
|
||||||
|
} else if (dataType == TELLSTICK_HUMIDITY) {
|
||||||
|
strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
|
||||||
|
printf("Humidity:\t%s%%\t(%s)\n", value, timeBuf);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int callbackId = 0;
|
||||||
|
|
||||||
|
tdInit();
|
||||||
|
|
||||||
|
//Register for callback
|
||||||
|
callbackId = tdRegisterSensorEvent( (TDSensorEvent)&sensorEvent, 0 );
|
||||||
|
|
||||||
|
//Our own simple eventloop
|
||||||
|
while(1) {
|
||||||
|
sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Cleanup
|
||||||
|
tdUnregisterCallback( callbackId );
|
||||||
|
tdClose();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
13
examples/c/sensors/polling/Makefile
Normal file
13
examples/c/sensors/polling/Makefile
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
CC=gcc
|
||||||
|
CFLAGS=-Wall -ltelldus-core
|
||||||
|
|
||||||
|
OBJS = main.o
|
||||||
|
|
||||||
|
all: ${OBJS}
|
||||||
|
${CC} -o sensor ${CFLAGS} ${OBJS}
|
||||||
|
|
||||||
|
main.c:
|
||||||
|
${CC} ${CFLAGS} -c main.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f sensor main.o
|
||||||
38
examples/c/sensors/polling/main.c
Normal file
38
examples/c/sensors/polling/main.c
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#include <telldus-core.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
const int DATA_LENGTH = 20;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
char protocol[DATA_LENGTH], model[DATA_LENGTH];
|
||||||
|
int sensorId = 0, dataTypes = 0;
|
||||||
|
char value[DATA_LENGTH];
|
||||||
|
char timeBuf[80];
|
||||||
|
time_t timestamp = 0;
|
||||||
|
|
||||||
|
|
||||||
|
tdInit();
|
||||||
|
|
||||||
|
while(tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes) == TELLSTICK_SUCCESS) {
|
||||||
|
//Print the sensor
|
||||||
|
printf("%s,\t%s,\t%i\n", protocol, model, sensorId);
|
||||||
|
|
||||||
|
//Retrieve the values the sensor supports
|
||||||
|
if (dataTypes & TELLSTICK_TEMPERATURE) {
|
||||||
|
tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, value, DATA_LENGTH, (int *)×tamp);
|
||||||
|
strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
|
||||||
|
printf("Temperature:\t%sº\t(%s)\n", value, timeBuf);
|
||||||
|
}
|
||||||
|
if (dataTypes & TELLSTICK_HUMIDITY) {
|
||||||
|
tdSensorValue(protocol, model, sensorId, TELLSTICK_HUMIDITY, value, DATA_LENGTH, (int *)×tamp);
|
||||||
|
strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
|
||||||
|
printf("Humidity:\t%s%%\t(%s)\n", value, timeBuf);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
tdClose();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
13
examples/cpp/callbacks/Makefile
Normal file
13
examples/cpp/callbacks/Makefile
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
CC=gcc
|
||||||
|
CFLAGS=-Wall -ltelldus-core
|
||||||
|
|
||||||
|
OBJS = main.o
|
||||||
|
|
||||||
|
all: ${OBJS}
|
||||||
|
${CC} -o callbacks ${CFLAGS} ${OBJS}
|
||||||
|
|
||||||
|
main.cpp:
|
||||||
|
${CC} ${CFLAGS} -c main.cpp
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f callbacks main.o
|
||||||
77
examples/cpp/callbacks/main.cpp
Normal file
77
examples/cpp/callbacks/main.cpp
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <telldus-core.h>
|
||||||
|
|
||||||
|
bool running;
|
||||||
|
|
||||||
|
class Events {
|
||||||
|
public:
|
||||||
|
Events();
|
||||||
|
~Events();
|
||||||
|
void deviceEvent(int deviceId, int method, const char *data);
|
||||||
|
|
||||||
|
static void deviceEventCallback(int deviceId, int method, const char *data, int callbackId, void *context);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int callbackId;
|
||||||
|
};
|
||||||
|
|
||||||
|
Events::Events() {
|
||||||
|
callbackId = tdRegisterDeviceEvent( reinterpret_cast<TDDeviceEvent>(&Events::deviceEventCallback), this );
|
||||||
|
}
|
||||||
|
|
||||||
|
Events::~Events() {
|
||||||
|
tdUnregisterCallback(callbackId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Events::deviceEvent(int deviceId, int method, const char *data) {
|
||||||
|
if (method == TELLSTICK_TURNON) {
|
||||||
|
printf("ON event from device %i\n", deviceId);
|
||||||
|
} else if (method == TELLSTICK_TURNOFF) {
|
||||||
|
printf("OFF event from device %i\n", deviceId);
|
||||||
|
} else {
|
||||||
|
printf("Unknown event from device %i\n", deviceId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Events::deviceEventCallback(int deviceId, int method, const char *data, int callbackId, void *context) {
|
||||||
|
Events *e = reinterpret_cast<Events *>(context);
|
||||||
|
if (e) {
|
||||||
|
/** Please note!
|
||||||
|
* We are here in another thread than the main. Some measures to syncronize
|
||||||
|
* this must be taken!
|
||||||
|
**/
|
||||||
|
e->deviceEvent(deviceId, method, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void signalHandler(int sig) {
|
||||||
|
if (sig == SIGINT) {
|
||||||
|
printf("Shutting down\n");
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() {
|
||||||
|
Events ev;
|
||||||
|
|
||||||
|
running = true;
|
||||||
|
|
||||||
|
printf("Listening for events, press control-c to quit...\n");
|
||||||
|
//Our own simple eventloop
|
||||||
|
while(running) {
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
tdInit();
|
||||||
|
|
||||||
|
signal(SIGINT, signalHandler);
|
||||||
|
run();
|
||||||
|
|
||||||
|
tdClose();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
26
examples/dotnet/sensors/SensorPollWin.sln
Normal file
26
examples/dotnet/sensors/SensorPollWin.sln
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual Studio 2008
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorPollWin", "SensorPollWin\SensorPollWin.csproj", "{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|x86.Build.0 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
69
examples/dotnet/sensors/SensorPollWin/Program.cs
Normal file
69
examples/dotnet/sensors/SensorPollWin/Program.cs
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace SensorPollWin
|
||||||
|
{
|
||||||
|
unsafe class Program
|
||||||
|
{
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern void tdInit();
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern void tdClose();
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdSensor(char* protocol, int protocolLength, char* model, int modelLength, int* id, int* dataTypes);
|
||||||
|
|
||||||
|
[DllImport("TelldusCore.dll")]
|
||||||
|
public static extern int tdSensorValue(char* protocol, char* model, int id, int dataType, char* value, int valueLength, int* timestamp);
|
||||||
|
|
||||||
|
static unsafe void Main(string[] args)
|
||||||
|
{
|
||||||
|
int protocolstringsize = 20;
|
||||||
|
int modelstringsize = 30;
|
||||||
|
int valuestringsize = 20;
|
||||||
|
char* protocol = (char*)Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * protocolstringsize);
|
||||||
|
char* model = (char*)Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * modelstringsize);
|
||||||
|
IntPtr id = Marshal.AllocHGlobal(sizeof(int));
|
||||||
|
IntPtr dataType = Marshal.AllocHGlobal(sizeof(int));
|
||||||
|
Console.WriteLine("getting sensors");
|
||||||
|
|
||||||
|
tdInit();
|
||||||
|
while (tdSensor(protocol, protocolstringsize, model, modelstringsize, (int*)id, (int*)dataType) == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Sensor: " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(protocol))) + " " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(model))));
|
||||||
|
|
||||||
|
char* value = (char*)Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * valuestringsize);
|
||||||
|
IntPtr timestamp = Marshal.AllocHGlobal(sizeof(int));
|
||||||
|
if ((Marshal.ReadIntPtr(dataType).ToInt32() & 1) != 0)
|
||||||
|
{
|
||||||
|
tdSensorValue(protocol, model, Marshal.ReadIntPtr(id).ToInt32(), 1, value, valuestringsize, (int*)timestamp);
|
||||||
|
Console.WriteLine("Temperature: " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(value))) + "C, " + datify(Marshal.ReadIntPtr(timestamp).ToInt32()));
|
||||||
|
}
|
||||||
|
if ((Marshal.ReadIntPtr(dataType).ToInt32() & 2) != 0)
|
||||||
|
{
|
||||||
|
tdSensorValue(protocol, model, Marshal.ReadIntPtr(id).ToInt32(), 2, value, valuestringsize, (int*)timestamp);
|
||||||
|
Console.WriteLine("Humidity: " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(value))) + "%, " + datify(Marshal.ReadIntPtr(timestamp).ToInt32()));
|
||||||
|
}
|
||||||
|
Console.WriteLine("");
|
||||||
|
Marshal.FreeHGlobal((IntPtr)value);
|
||||||
|
Marshal.FreeHGlobal(timestamp);
|
||||||
|
}
|
||||||
|
Marshal.FreeHGlobal((IntPtr)protocol);
|
||||||
|
Marshal.FreeHGlobal((IntPtr)model);
|
||||||
|
Marshal.FreeHGlobal(id);
|
||||||
|
Marshal.FreeHGlobal(dataType);
|
||||||
|
tdClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string datify(int timestamp){
|
||||||
|
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||||
|
dateTime = dateTime.AddSeconds(timestamp);
|
||||||
|
dateTime = dateTime.ToLocalTime();
|
||||||
|
return dateTime.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("SensorPollWin")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
|
[assembly: AssemblyProduct("SensorPollWin")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("31424c50-2c39-4b7c-a4e8-5a11bd6b8c1d")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
77
examples/dotnet/sensors/SensorPollWin/SensorPollWin.csproj
Normal file
77
examples/dotnet/sensors/SensorPollWin/SensorPollWin.csproj
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>9.0.30729</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>SensorPollWin</RootNamespace>
|
||||||
|
<AssemblyName>SensorPollWin</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<OutputPath>bin\x86\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core">
|
||||||
|
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.Linq">
|
||||||
|
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Data.DataSetExtensions">
|
||||||
|
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
94
examples/java/sensors/SensorsJNACallback.java
Normal file
94
examples/java/sensors/SensorsJNACallback.java
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
import java.io.*;
|
||||||
|
import com.sun.jna.Library;
|
||||||
|
import com.sun.jna.Native;
|
||||||
|
import com.sun.jna.ptr.*;
|
||||||
|
import com.sun.jna.Callback;
|
||||||
|
import com.sun.jna.Pointer;
|
||||||
|
import com.sun.jna.Structure;
|
||||||
|
import com.sun.jna.Memory;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class SensorsJNACallback
|
||||||
|
{
|
||||||
|
public interface CLibrary extends Library {
|
||||||
|
|
||||||
|
static int TELLSTICK_TEMPERATURE = 1;
|
||||||
|
static int TELLSTICK_HUMIDITY = 2;
|
||||||
|
|
||||||
|
void tdInit();
|
||||||
|
void tdClose();
|
||||||
|
int tdRegisterSensorEvent(SensorCallback function, Pointer context);
|
||||||
|
int tdUnregisterCallback(int callbackID);
|
||||||
|
|
||||||
|
public interface SensorCallback extends Callback{
|
||||||
|
public void callbackfunction(Pointer protocol, Pointer model, int id, int dataType, Pointer value, int timestamp, int callbackId, Pointer context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int callbackID;
|
||||||
|
CLibrary lib;
|
||||||
|
CLibrary.SensorCallback callback;
|
||||||
|
|
||||||
|
public SensorsJNACallback(){
|
||||||
|
lib = (CLibrary)Native.loadLibrary("libtelldus-core.so.2", CLibrary.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startListening(){
|
||||||
|
|
||||||
|
lib.tdInit();
|
||||||
|
|
||||||
|
//save reference to callback to avoid garbage collection
|
||||||
|
CLibrary.SensorCallback callback = new CLibrary.SensorCallback(){
|
||||||
|
|
||||||
|
public void callbackfunction(Pointer protocol, Pointer model, int id, int dataType, Pointer value, int timestamp, int callbackId, Pointer context){
|
||||||
|
System.out.println("Sensor: " + protocol.getString(0) + " " + model.getString(0));
|
||||||
|
long timestampvalue = (long)timestamp * 1000;
|
||||||
|
Date date = new Date(timestampvalue);
|
||||||
|
|
||||||
|
if(dataType == CLibrary.TELLSTICK_TEMPERATURE){
|
||||||
|
System.out.println("Temperature: " + value.getString(0) + "C, " + date.toString());
|
||||||
|
}
|
||||||
|
else if(dataType == CLibrary.TELLSTICK_HUMIDITY){
|
||||||
|
System.out.println("Humidity: " + value.getString(0) + "%, " + date.toString());
|
||||||
|
}
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//register callback function for sensor events
|
||||||
|
callbackID = lib.tdRegisterSensorEvent(callback, (Pointer)null);
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
try{
|
||||||
|
//just wait for sensor callbacks
|
||||||
|
Thread.currentThread().sleep(1000);
|
||||||
|
}
|
||||||
|
catch(InterruptedException e){
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopListening(){
|
||||||
|
System.out.println("Exiting");
|
||||||
|
lib.tdUnregisterCallback(callbackID);
|
||||||
|
callback = null;
|
||||||
|
lib.tdClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
final SensorsJNACallback sensorsjnacallback = new SensorsJNACallback();
|
||||||
|
|
||||||
|
//add shutdown hook to allow callback unregistration
|
||||||
|
Runtime.getRuntime().addShutdownHook(new Thread(){
|
||||||
|
public void run(){
|
||||||
|
sensorsjnacallback.stopListening();
|
||||||
|
Runtime.getRuntime().halt(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sensorsjnacallback.startListening();
|
||||||
|
}
|
||||||
|
}
|
||||||
60
examples/java/sensors/SensorsJNAPoll.java
Normal file
60
examples/java/sensors/SensorsJNAPoll.java
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
import java.io.*;
|
||||||
|
import com.sun.jna.Library;
|
||||||
|
import com.sun.jna.Native;
|
||||||
|
import com.sun.jna.ptr.*;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class SensorsJNAPoll
|
||||||
|
{
|
||||||
|
public interface CLibrary extends Library {
|
||||||
|
|
||||||
|
static int TELLSTICK_TEMPERATURE = 1;
|
||||||
|
static int TELLSTICK_HUMIDITY = 2;
|
||||||
|
|
||||||
|
void tdInit();
|
||||||
|
void tdClose();
|
||||||
|
int tdTurnOn(int deviceId);
|
||||||
|
int tdTurnOff(int deviceId);
|
||||||
|
int tdSensor(byte[] protocol, int protocolLength, byte[] model, int modelLength, IntByReference id,IntByReference dataTypes);
|
||||||
|
int tdSensorValue(byte[] protocol, byte[] model, int id, int dataType, byte[] value, int valueLength, IntByReference timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
CLibrary lib = (CLibrary)Native.loadLibrary("libtelldus-core.so.2", CLibrary.class);
|
||||||
|
lib.tdInit();
|
||||||
|
|
||||||
|
IntByReference id = new IntByReference();
|
||||||
|
IntByReference dataTypes = new IntByReference();
|
||||||
|
|
||||||
|
System.out.println("getting sensors");
|
||||||
|
System.out.println("");
|
||||||
|
|
||||||
|
byte protocol[] = new byte[20];
|
||||||
|
byte model[] = new byte[20];
|
||||||
|
|
||||||
|
//check every sensor
|
||||||
|
while(lib.tdSensor(protocol, 20, model, 20, id, dataTypes) == 0){
|
||||||
|
System.out.println("Sensor: " + Native.toString(protocol) + " " + Native.toString(model));
|
||||||
|
|
||||||
|
byte value[] = new byte[20];
|
||||||
|
IntByReference timestamp = new IntByReference();
|
||||||
|
if((dataTypes.getValue() & CLibrary.TELLSTICK_TEMPERATURE) != 0){
|
||||||
|
lib.tdSensorValue(protocol, model, id.getValue(), 1, value, 20, timestamp);
|
||||||
|
long timestampvalue = (long)timestamp.getValue() * 1000;
|
||||||
|
Date date = new Date(timestampvalue);
|
||||||
|
System.out.println("Temperature: " + Native.toString(value) + "C, " + date.toString());
|
||||||
|
}
|
||||||
|
if((dataTypes.getValue() & CLibrary.TELLSTICK_HUMIDITY) != 0){
|
||||||
|
lib.tdSensorValue(protocol, model, id.getValue(), 2, value, 20, timestamp);
|
||||||
|
long timestampvalue = (long)timestamp.getValue() * 1000;
|
||||||
|
Date date = new Date(timestampvalue);
|
||||||
|
System.out.println("Humidity: " + Native.toString(value) + "%, " + date.toString());
|
||||||
|
}
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
lib.tdClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
19
examples/php/live/authentication/common.php
Normal file
19
examples/php/live/authentication/common.php
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
require_once 'HTTP/OAuth/Consumer.php';
|
||||||
|
|
||||||
|
define('PUBLIC_KEY', '');
|
||||||
|
define('PRIVATE_KEY', '');
|
||||||
|
|
||||||
|
define('URL', 'http://api.telldus.com'); //https should be used in production!
|
||||||
|
define('REQUEST_TOKEN', constant('URL').'/oauth/requestToken');
|
||||||
|
define('AUTHORIZE_TOKEN', constant('URL').'/oauth/authorize');
|
||||||
|
define('ACCESS_TOKEN', constant('URL').'/oauth/accessToken');
|
||||||
|
define('REQUEST_URI', constant('URL').'/xml');
|
||||||
|
|
||||||
|
define('BASE_URL', 'http://'.$_SERVER["SERVER_NAME"].dirname($_SERVER['REQUEST_URI']));
|
||||||
|
|
||||||
|
define('TELLSTICK_TURNON', 1);
|
||||||
|
define('TELLSTICK_TURNOFF', 2);
|
||||||
21
examples/php/live/authentication/getAccessToken.php
Normal file
21
examples/php/live/authentication/getAccessToken.php
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'common.php';
|
||||||
|
|
||||||
|
$consumer = new HTTP_OAuth_Consumer(constant('PUBLIC_KEY'), constant('PRIVATE_KEY'), $_SESSION['token'], $_SESSION['tokenSecret']);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$consumer->getAccessToken(constant('ACCESS_TOKEN'));
|
||||||
|
|
||||||
|
$_SESSION['accessToken'] = $consumer->getToken();
|
||||||
|
$_SESSION['accessTokenSecret'] = $consumer->getTokenSecret();
|
||||||
|
|
||||||
|
header('Location:index.php');
|
||||||
|
} catch (Exception $e) {
|
||||||
|
?>
|
||||||
|
<p>Authorization failed!</p>
|
||||||
|
<p><a href="index.php">Go back</a></p>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
13
examples/php/live/authentication/getRequestToken.php
Normal file
13
examples/php/live/authentication/getRequestToken.php
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'common.php';
|
||||||
|
|
||||||
|
$consumer = new HTTP_OAuth_Consumer(constant('PUBLIC_KEY'), constant('PRIVATE_KEY'));
|
||||||
|
|
||||||
|
$consumer->getRequestToken(constant('REQUEST_TOKEN'), constant('BASE_URL').'/getAccessToken.php');
|
||||||
|
|
||||||
|
$_SESSION['token'] = $consumer->getToken();
|
||||||
|
$_SESSION['tokenSecret'] = $consumer->getTokenSecret();
|
||||||
|
|
||||||
|
$url = $consumer->getAuthorizeUrl(constant('AUTHORIZE_TOKEN'));
|
||||||
|
header('Location:'.$url);
|
||||||
47
examples/php/live/authentication/index.php
Normal file
47
examples/php/live/authentication/index.php
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'common.php';
|
||||||
|
|
||||||
|
if (isset($_GET['clear'])) {
|
||||||
|
session_destroy();
|
||||||
|
header('location:index.php');
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($_SESSION['accessToken'])) {
|
||||||
|
?>We have no access token, <a href="getRequestToken.php">connect us</a><?php
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
<p>We have access!</p>
|
||||||
|
<p>
|
||||||
|
In your system, store these values to do requests for this user:<br>
|
||||||
|
Token: <?php echo $_SESSION['accessToken']; ?><br>
|
||||||
|
Secret: <?php echo $_SESSION['accessTokenSecret']; ?>
|
||||||
|
</p>
|
||||||
|
<p><a href="index.php?clear">Clear the token and restart</a></p>
|
||||||
|
<p><a href="index.php?listDevices">List users devices</a></p>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
if (isset($_GET['listDevices'])) {
|
||||||
|
$consumer = new HTTP_OAuth_Consumer(constant('PUBLIC_KEY'), constant('PRIVATE_KEY'), $_SESSION['accessToken'], $_SESSION['accessTokenSecret']);
|
||||||
|
$params = array(
|
||||||
|
'supportedMethods' => constant('TELLSTICK_TURNON') | constant('TELLSTICK_TURNOFF'),
|
||||||
|
);
|
||||||
|
$response = $consumer->sendRequest(constant('REQUEST_URI').'/devices/list', $params, 'GET');
|
||||||
|
echo '<pre>';
|
||||||
|
echo( htmlentities($response->getBody()));
|
||||||
|
}
|
||||||
|
|
||||||
|
?><p><a href="index.php?listClients">List users clients</a></p><?php
|
||||||
|
|
||||||
|
if (isset($_GET['listClients'])) {
|
||||||
|
$consumer = new HTTP_OAuth_Consumer(constant('PUBLIC_KEY'), constant('PRIVATE_KEY'), $_SESSION['accessToken'], $_SESSION['accessTokenSecret']);
|
||||||
|
$params = array();
|
||||||
|
$response = $consumer->sendRequest(constant('REQUEST_URI').'/clients/list', $params, 'GET');
|
||||||
|
echo '<pre>';
|
||||||
|
echo( htmlentities($response->getBody()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
76
examples/python/callbacks.py
Normal file
76
examples/python/callbacks.py
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
from ctypes import c_int, c_ubyte, c_void_p, POINTER, string_at #imports allowing the use of our library
|
||||||
|
from threading import Timer
|
||||||
|
import time
|
||||||
|
import platform
|
||||||
|
|
||||||
|
#platform specific imports:
|
||||||
|
if (platform.system() == 'Windows'):
|
||||||
|
#Windows
|
||||||
|
from ctypes import windll, WINFUNCTYPE
|
||||||
|
lib = windll.LoadLibrary('TelldusCore.dll') #import our library
|
||||||
|
else:
|
||||||
|
#Linux
|
||||||
|
from ctypes import cdll, CFUNCTYPE
|
||||||
|
lib = cdll.LoadLibrary('libtelldus-core.so.2') #import our library
|
||||||
|
|
||||||
|
timers = {} #timerlist
|
||||||
|
|
||||||
|
def turnOn():
|
||||||
|
print "turning on"
|
||||||
|
lib.tdTurnOn(1)
|
||||||
|
|
||||||
|
def turnOff():
|
||||||
|
print "turning off"
|
||||||
|
lib.tdTurnOff(1)
|
||||||
|
|
||||||
|
#function to be called when a device event occurs
|
||||||
|
def callbackfunction(deviceId, method, value, callbackId, context):
|
||||||
|
global timers
|
||||||
|
|
||||||
|
print "callback!"
|
||||||
|
|
||||||
|
if (deviceId == 1):
|
||||||
|
# is turning on deviceId 1 here, so just return if events for that device are picked up
|
||||||
|
return
|
||||||
|
|
||||||
|
t = 0
|
||||||
|
print "Received event for device %d" % (deviceId,)
|
||||||
|
if (deviceId in timers):
|
||||||
|
# a timer already exists for this device, it might be running so interrupt it
|
||||||
|
# Many devices (for example motion detectors) resends their messages many times to ensure that they
|
||||||
|
# are received correctly. In this example, we don't want to run the turnOn/turnOff methods every time, instead we
|
||||||
|
# start a timer, and run the method when the timer is finished. For every incoming event on this device, the timer
|
||||||
|
# is restarted.
|
||||||
|
t = timers[deviceId]
|
||||||
|
t.cancel()
|
||||||
|
if (method == 1):
|
||||||
|
#on
|
||||||
|
t = Timer(0.5, turnOn) #start timer with 0.5 second delay (adjust the delay to suit your needs), then turn on
|
||||||
|
else:
|
||||||
|
#off
|
||||||
|
t = Timer(0.5, turnOff) #start timer with 0.5 second delay (adjust the delay to suit your needs), then turn off
|
||||||
|
|
||||||
|
t.start()
|
||||||
|
timers[deviceId] = t #put timer in list, to allow later cancellation
|
||||||
|
|
||||||
|
#function to be called when device event occurs, even for unregistered devices
|
||||||
|
def rawcallbackfunction(data, controllerId, callbackId, context):
|
||||||
|
print string_at(data)
|
||||||
|
|
||||||
|
if (platform.system() == 'Windows'):
|
||||||
|
CMPFUNC = WINFUNCTYPE(None, c_int, c_int, POINTER(c_ubyte), c_int, c_void_p) #first is return type
|
||||||
|
CMPFUNCRAW = WINFUNCTYPE(None, POINTER(c_ubyte), c_int, c_int, c_void_p)
|
||||||
|
else:
|
||||||
|
CMPFUNC = CFUNCTYPE(None, c_int, c_int, POINTER(c_ubyte), c_int, c_void_p)
|
||||||
|
CMPFUNCRAW = CFUNCTYPE(None, POINTER(c_ubyte), c_int, c_int, c_void_p)
|
||||||
|
|
||||||
|
cmp_func = CMPFUNC(callbackfunction)
|
||||||
|
cmp_funcraw = CMPFUNCRAW(rawcallbackfunction)
|
||||||
|
|
||||||
|
lib.tdInit()
|
||||||
|
lib.tdRegisterDeviceEvent(cmp_func, 0)
|
||||||
|
#lib.tdRegisterRawDeviceEvent(cmp_funcraw, 0) #uncomment this, and comment out tdRegisterDeviceEvent, to see data for not registered devices
|
||||||
|
|
||||||
|
print "Waiting for events..."
|
||||||
|
while(1):
|
||||||
|
time.sleep(0.5) #don't exit
|
||||||
136
examples/python/live/server/Client.py
Normal file
136
examples/python/live/server/Client.py
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import socket, ssl
|
||||||
|
import time, os
|
||||||
|
|
||||||
|
from configobj import ConfigObj
|
||||||
|
|
||||||
|
from ServerList import *
|
||||||
|
from TelldusCore import *
|
||||||
|
from LiveMessage import *
|
||||||
|
|
||||||
|
class Client():
|
||||||
|
def __init__(self):
|
||||||
|
self.publicKey = ''
|
||||||
|
self.privateKey = ''
|
||||||
|
self.hashMethod = 'sha1'
|
||||||
|
self.pongTimer = 0
|
||||||
|
self.pingTimer = 0
|
||||||
|
self.supportedMethods = 0
|
||||||
|
self.tellduscore = TelldusCore()
|
||||||
|
self.serverList = ServerList()
|
||||||
|
|
||||||
|
self.configPath = os.environ['HOME'] + '/.config/Telldus'
|
||||||
|
self.configFilename = 'TelldusLive.conf'
|
||||||
|
self.config = ConfigObj(self.configPath + '/' + self.configFilename)
|
||||||
|
self.connect(self.serverList.popServer())
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
try:
|
||||||
|
os.makedirs(self.configPath)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
self.config.write()
|
||||||
|
|
||||||
|
def connect(self, server):
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
self.socket = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLSv1, ca_certs="/etc/ssl/certs/ca-certificates.crt",cert_reqs=ssl.CERT_REQUIRED)
|
||||||
|
self.socket.settimeout(5)
|
||||||
|
self.socket.connect((server['address'], int(server['port'])))
|
||||||
|
|
||||||
|
uuid = ''
|
||||||
|
try:
|
||||||
|
uuid = self.config['uuid']
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
msg = LiveMessage('Register')
|
||||||
|
msg.append({
|
||||||
|
'key': self.publicKey,
|
||||||
|
'uuid': uuid,
|
||||||
|
'hash': self.hashMethod
|
||||||
|
})
|
||||||
|
msg.append({
|
||||||
|
'protocol': 2,
|
||||||
|
'version': '1',
|
||||||
|
'os': 'linux',
|
||||||
|
'os-version': 'unknown'
|
||||||
|
})
|
||||||
|
|
||||||
|
self.socket.write(self.signedMessage(msg))
|
||||||
|
self.pongTimer = time.time()
|
||||||
|
self.pingTimer = time.time()
|
||||||
|
while(1):
|
||||||
|
try:
|
||||||
|
resp = self.socket.read(1024)
|
||||||
|
except ssl.SSLError:
|
||||||
|
# Timeout, try again after some maintenance
|
||||||
|
if (time.time() - self.pongTimer >= 360): # No pong received
|
||||||
|
print("No pong received, disconnecting")
|
||||||
|
break
|
||||||
|
if (time.time() - self.pingTimer >= 120):
|
||||||
|
# Time to ping
|
||||||
|
msg = LiveMessage("Ping")
|
||||||
|
self.socket.write(self.signedMessage(msg))
|
||||||
|
self.pingTimer = time.time()
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
|
if (resp == ''):
|
||||||
|
print("no response")
|
||||||
|
break
|
||||||
|
|
||||||
|
envelope = LiveMessage.fromByteArray(resp)
|
||||||
|
if (not envelope.verifySignature(self.hashMethod, self.privateKey)):
|
||||||
|
print "Signature failed"
|
||||||
|
continue
|
||||||
|
|
||||||
|
self.pongTimer = time.time()
|
||||||
|
self.handleMessage(LiveMessage.fromByteArray(envelope.argument(0).stringVal))
|
||||||
|
|
||||||
|
def handleCommand(self, args):
|
||||||
|
if (args['action'].stringVal == 'turnon'):
|
||||||
|
self.tellduscore.turnon(args['id'].intVal)
|
||||||
|
elif (args['action'].stringVal == 'turnoff'):
|
||||||
|
self.tellduscore.turnoff(args['id'].intVal)
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
if ('ACK' in args):
|
||||||
|
#Respond to ack
|
||||||
|
msg = LiveMessage("ACK")
|
||||||
|
msg.append(args['ACK'].intVal)
|
||||||
|
self.socket.write(self.signedMessage(msg))
|
||||||
|
|
||||||
|
def handleMessage(self, message):
|
||||||
|
if (message.name() == "notregistered"):
|
||||||
|
params = message.argument(0).dictVal
|
||||||
|
self.config['uuid'] = params['uuid'].stringVal
|
||||||
|
self.config['activationUrl'] = params['url'].stringVal
|
||||||
|
print "This client isn't activated, please activate it using this url:\n%s" % params['url'].stringVal
|
||||||
|
return
|
||||||
|
|
||||||
|
if (message.name() == "registered"):
|
||||||
|
params = message.argument(0).dictVal
|
||||||
|
self.supportedMethods = params['supportedMethods'].intVal
|
||||||
|
self.tellduscore.setSupportedMethods(self.supportedMethods)
|
||||||
|
self.sendDevicesReport()
|
||||||
|
return
|
||||||
|
|
||||||
|
if (message.name() == "command"):
|
||||||
|
self.handleCommand(message.argument(0).dictVal)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (message.name() == "pong"):
|
||||||
|
return
|
||||||
|
|
||||||
|
print "Did not understand: %s" % message.toByteArray()
|
||||||
|
|
||||||
|
|
||||||
|
def sendDevicesReport(self):
|
||||||
|
msg = LiveMessage("DevicesReport")
|
||||||
|
msg.append(self.tellduscore.getList())
|
||||||
|
self.socket.write(self.signedMessage(msg))
|
||||||
|
|
||||||
|
def signedMessage(self, message):
|
||||||
|
return message.toSignedMessage(self.hashMethod, self.privateKey)
|
||||||
71
examples/python/live/server/LiveMessage.py
Normal file
71
examples/python/live/server/LiveMessage.py
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
from LiveMessageToken import *
|
||||||
|
|
||||||
|
class LiveMessage():
|
||||||
|
def __init__(self, name = ""):
|
||||||
|
if (name != ""):
|
||||||
|
self.args = [LiveMessageToken(name)]
|
||||||
|
else:
|
||||||
|
self.args = []
|
||||||
|
|
||||||
|
def append(self, argument):
|
||||||
|
self.args.append(LiveMessageToken(argument))
|
||||||
|
|
||||||
|
def argument(self,index):
|
||||||
|
if (len(self.args) > index+1):
|
||||||
|
return self.args[index+1]
|
||||||
|
|
||||||
|
return LiveMessageToken()
|
||||||
|
|
||||||
|
def count(self):
|
||||||
|
return len(self.args)-1
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
return self.argument(-1).stringVal.lower()
|
||||||
|
|
||||||
|
def toByteArray(self):
|
||||||
|
retval = ''
|
||||||
|
for arg in self.args:
|
||||||
|
retval = retval + arg.toByteArray()
|
||||||
|
return retval
|
||||||
|
|
||||||
|
def toSignedMessage(self, hashMethod, privateKey):
|
||||||
|
message = self.toByteArray()
|
||||||
|
envelope = LiveMessage(LiveMessage.signatureForMessage(message, hashMethod, privateKey))
|
||||||
|
envelope.append(message)
|
||||||
|
return envelope.toByteArray()
|
||||||
|
|
||||||
|
def verifySignature(self, hashMethod, privateKey):
|
||||||
|
signature = self.name()
|
||||||
|
rawMessage = self.argument(0).stringVal
|
||||||
|
return (self.signatureForMessage(rawMessage, hashMethod, privateKey) == signature)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def fromByteArray(rawString):
|
||||||
|
list = []
|
||||||
|
start = 0
|
||||||
|
while (start < len(rawString)):
|
||||||
|
start, token = LiveMessageToken.parseToken(rawString, start)
|
||||||
|
if (token.valueType == LiveMessageToken.TYPE_INVALID):
|
||||||
|
break
|
||||||
|
list.append(token)
|
||||||
|
|
||||||
|
msg = LiveMessage()
|
||||||
|
msg.args = list
|
||||||
|
return msg
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def signatureForMessage(msg, hashMethod, privateKey):
|
||||||
|
h = 0
|
||||||
|
if (hashMethod == "sha512"):
|
||||||
|
h = hashlib.sha512()
|
||||||
|
elif (hashMethod == "sha256"):
|
||||||
|
h = hashlib.sha256()
|
||||||
|
else:
|
||||||
|
h = hashlib.sha1()
|
||||||
|
|
||||||
|
h.update(msg)
|
||||||
|
h.update(privateKey)
|
||||||
|
return h.hexdigest().lower()
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue