mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	Add knx-usb example
This commit is contained in:
		
							parent
							
								
									7c185a9293
								
							
						
					
					
						commit
						d66e80c1be
					
				
							
								
								
									
										5
									
								
								knx-usb/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								knx-usb/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
.pio
 | 
			
		||||
.vscode/.browse.c_cpp.db*
 | 
			
		||||
.vscode/c_cpp_properties.json
 | 
			
		||||
.vscode/launch.json
 | 
			
		||||
.vscode/ipch
 | 
			
		||||
							
								
								
									
										67
									
								
								knx-usb/.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								knx-usb/.travis.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,67 @@
 | 
			
		||||
# Continuous Integration (CI) is the practice, in software
 | 
			
		||||
# engineering, of merging all developer working copies with a shared mainline
 | 
			
		||||
# several times a day < https://docs.platformio.org/page/ci/index.html >
 | 
			
		||||
#
 | 
			
		||||
# Documentation:
 | 
			
		||||
#
 | 
			
		||||
# * Travis CI Embedded Builds with PlatformIO
 | 
			
		||||
#   < https://docs.travis-ci.com/user/integration/platformio/ >
 | 
			
		||||
#
 | 
			
		||||
# * PlatformIO integration with Travis CI
 | 
			
		||||
#   < https://docs.platformio.org/page/ci/travis.html >
 | 
			
		||||
#
 | 
			
		||||
# * User Guide for `platformio ci` command
 | 
			
		||||
#   < https://docs.platformio.org/page/userguide/cmd_ci.html >
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# Please choose one of the following templates (proposed below) and uncomment
 | 
			
		||||
# it (remove "# " before each line) or use own configuration according to the
 | 
			
		||||
# Travis CI documentation (see above).
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Template #1: General project. Test it using existing `platformio.ini`.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# language: python
 | 
			
		||||
# python:
 | 
			
		||||
#     - "2.7"
 | 
			
		||||
#
 | 
			
		||||
# sudo: false
 | 
			
		||||
# cache:
 | 
			
		||||
#     directories:
 | 
			
		||||
#         - "~/.platformio"
 | 
			
		||||
#
 | 
			
		||||
# install:
 | 
			
		||||
#     - pip install -U platformio
 | 
			
		||||
#     - platformio update
 | 
			
		||||
#
 | 
			
		||||
# script:
 | 
			
		||||
#     - platformio run
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Template #2: The project is intended to be used as a library with examples.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# language: python
 | 
			
		||||
# python:
 | 
			
		||||
#     - "2.7"
 | 
			
		||||
#
 | 
			
		||||
# sudo: false
 | 
			
		||||
# cache:
 | 
			
		||||
#     directories:
 | 
			
		||||
#         - "~/.platformio"
 | 
			
		||||
#
 | 
			
		||||
# env:
 | 
			
		||||
#     - PLATFORMIO_CI_SRC=path/to/test/file.c
 | 
			
		||||
#     - PLATFORMIO_CI_SRC=examples/file.ino
 | 
			
		||||
#     - PLATFORMIO_CI_SRC=path/to/test/directory
 | 
			
		||||
#
 | 
			
		||||
# install:
 | 
			
		||||
#     - pip install -U platformio
 | 
			
		||||
#     - platformio update
 | 
			
		||||
#
 | 
			
		||||
# script:
 | 
			
		||||
#     - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N
 | 
			
		||||
							
								
								
									
										8
									
								
								knx-usb/custom_hwids.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								knx-usb/custom_hwids.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
Import("env")
 | 
			
		||||
 | 
			
		||||
board_config = env.BoardConfig()
 | 
			
		||||
board_config.update("build.hwids", [
 | 
			
		||||
#  ["0x135e", "0x0024"] # Merten GmbH & Co. KG
 | 
			
		||||
#  ["0x0E77", "0x2001"] # Weinzierl Engineering GmbH
 | 
			
		||||
  ["0x7660", "0x0002"] # KNX Assoc.
 | 
			
		||||
])
 | 
			
		||||
							
								
								
									
										39
									
								
								knx-usb/include/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								knx-usb/include/README
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
 | 
			
		||||
This directory is intended for project header files.
 | 
			
		||||
 | 
			
		||||
A header file is a file containing C declarations and macro definitions
 | 
			
		||||
to be shared between several project source files. You request the use of a
 | 
			
		||||
header file in your project source file (C, C++, etc) located in `src` folder
 | 
			
		||||
by including it, with the C preprocessing directive `#include'.
 | 
			
		||||
 | 
			
		||||
```src/main.c
 | 
			
		||||
 | 
			
		||||
#include "header.h"
 | 
			
		||||
 | 
			
		||||
int main (void)
 | 
			
		||||
{
 | 
			
		||||
 ...
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Including a header file produces the same results as copying the header file
 | 
			
		||||
into each source file that needs it. Such copying would be time-consuming
 | 
			
		||||
and error-prone. With a header file, the related declarations appear
 | 
			
		||||
in only one place. If they need to be changed, they can be changed in one
 | 
			
		||||
place, and programs that include the header file will automatically use the
 | 
			
		||||
new version when next recompiled. The header file eliminates the labor of
 | 
			
		||||
finding and changing all the copies as well as the risk that a failure to
 | 
			
		||||
find one copy will result in inconsistencies within a program.
 | 
			
		||||
 | 
			
		||||
In C, the usual convention is to give header files names that end with `.h'.
 | 
			
		||||
It is most portable to use only letters, digits, dashes, and underscores in
 | 
			
		||||
header file names, and at most one dot.
 | 
			
		||||
 | 
			
		||||
Read more about using header files in official GCC documentation:
 | 
			
		||||
 | 
			
		||||
* Include Syntax
 | 
			
		||||
* Include Operation
 | 
			
		||||
* Once-Only Headers
 | 
			
		||||
* Computed Includes
 | 
			
		||||
 | 
			
		||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
 | 
			
		||||
							
								
								
									
										46
									
								
								knx-usb/lib/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								knx-usb/lib/README
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
			
		||||
 | 
			
		||||
This directory is intended for project specific (private) libraries.
 | 
			
		||||
PlatformIO will compile them to static libraries and link into executable file.
 | 
			
		||||
 | 
			
		||||
The source code of each library should be placed in a an own separate directory
 | 
			
		||||
("lib/your_library_name/[here are source files]").
 | 
			
		||||
 | 
			
		||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
 | 
			
		||||
 | 
			
		||||
|--lib
 | 
			
		||||
|  |
 | 
			
		||||
|  |--Bar
 | 
			
		||||
|  |  |--docs
 | 
			
		||||
|  |  |--examples
 | 
			
		||||
|  |  |--src
 | 
			
		||||
|  |     |- Bar.c
 | 
			
		||||
|  |     |- Bar.h
 | 
			
		||||
|  |  |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
 | 
			
		||||
|  |
 | 
			
		||||
|  |--Foo
 | 
			
		||||
|  |  |- Foo.c
 | 
			
		||||
|  |  |- Foo.h
 | 
			
		||||
|  |
 | 
			
		||||
|  |- README --> THIS FILE
 | 
			
		||||
|
 | 
			
		||||
|- platformio.ini
 | 
			
		||||
|--src
 | 
			
		||||
   |- main.c
 | 
			
		||||
 | 
			
		||||
and a contents of `src/main.c`:
 | 
			
		||||
```
 | 
			
		||||
#include <Foo.h>
 | 
			
		||||
#include <Bar.h>
 | 
			
		||||
 | 
			
		||||
int main (void)
 | 
			
		||||
{
 | 
			
		||||
  ...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
PlatformIO Library Dependency Finder will find automatically dependent
 | 
			
		||||
libraries scanning project source files.
 | 
			
		||||
 | 
			
		||||
More information about PlatformIO Library Dependency Finder
 | 
			
		||||
- https://docs.platformio.org/page/librarymanager/ldf.html
 | 
			
		||||
							
								
								
									
										35
									
								
								knx-usb/platformio.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								knx-usb/platformio.ini
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
;PlatformIO Project Configuration File
 | 
			
		||||
;
 | 
			
		||||
;   Build options: build flags, source filter
 | 
			
		||||
;   Upload options: custom upload port, speed and extra flags
 | 
			
		||||
;   Library options: dependencies, extra library storages
 | 
			
		||||
;   Advanced options: extra scripting
 | 
			
		||||
;
 | 
			
		||||
; Please visit documentation for the other options and examples
 | 
			
		||||
; https://docs.platformio.org/page/projectconf.html
 | 
			
		||||
 | 
			
		||||
[env:adafruit_feather_m0]
 | 
			
		||||
platform = atmelsam
 | 
			
		||||
board = adafruit_feather_m0
 | 
			
		||||
framework = arduino
 | 
			
		||||
 | 
			
		||||
; VID must be changed to some known KNX Manufacturer 
 | 
			
		||||
; so that the KNX USB interface gets recognized by ETS
 | 
			
		||||
extra_scripts = pre:custom_hwids.py
 | 
			
		||||
board_build.usb_product="KNX RF - USB Interface"
 | 
			
		||||
 | 
			
		||||
lib_deps =
 | 
			
		||||
  Adafruit_TinyUSB_Arduino
 | 
			
		||||
  SPI
 | 
			
		||||
  https://github.com/thelsing/FlashStorage.git
 | 
			
		||||
  knx
 | 
			
		||||
 | 
			
		||||
build_flags =
 | 
			
		||||
  -DMEDIUM_TYPE=2
 | 
			
		||||
  -DUSE_CEMI_SERVER
 | 
			
		||||
  -DUSE_TINYUSB
 | 
			
		||||
  -Wno-unknown-pragmas
 | 
			
		||||
 | 
			
		||||
debug_tool = jlink
 | 
			
		||||
#upload_protocol = jlink
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										128
									
								
								knx-usb/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								knx-usb/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,128 @@
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
#include <Adafruit_TinyUSB.h>
 | 
			
		||||
#include <knx.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * USB stuff
 | 
			
		||||
*/
 | 
			
		||||
#define STRINGIFY(s) XSTRINGIFY(s)
 | 
			
		||||
#define XSTRINGIFY(s) #s
 | 
			
		||||
 | 
			
		||||
#pragma message ("USB_VID=" STRINGIFY(USB_VID))
 | 
			
		||||
#pragma message ("USB_PID=" STRINGIFY(USB_PID))
 | 
			
		||||
#pragma message ("USB_MANUFACTURER=" STRINGIFY(USB_MANUFACTURER))
 | 
			
		||||
#pragma message ("USB_PRODUCT=" STRINGIFY(USB_PRODUCT))
 | 
			
		||||
 | 
			
		||||
Adafruit_USBD_HID usb_hid;
 | 
			
		||||
 | 
			
		||||
// Invoked when received SET_REPORT control request or
 | 
			
		||||
// received data on interrupt OUT endpoint
 | 
			
		||||
void setReportCallback(uint8_t report_id, hid_report_type_t report_type, uint8_t const* data, uint16_t bufSize)
 | 
			
		||||
{
 | 
			
		||||
	// we don't use multiple report and report ID
 | 
			
		||||
	(void) report_id;
 | 
			
		||||
	(void) report_type;
 | 
			
		||||
 | 
			
		||||
    UsbTunnelInterface::receiveHidReport(data, bufSize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool sendHidReport(uint8_t* data, uint16_t length)
 | 
			
		||||
{
 | 
			
		||||
	// We do not use reportId of the TinyUSB sendReport()-API here but instead provide it in the first byte of the buffer
 | 
			
		||||
    return usb_hid.sendReport(0, data, length);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool isSendHidReportPossible()
 | 
			
		||||
{
 | 
			
		||||
    return usb_hid.ready();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * KNX stuff
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// create macros easy access to group objects
 | 
			
		||||
#define goTemperature knx.getGroupObject(1)
 | 
			
		||||
#define goHumidity knx.getGroupObject(2)
 | 
			
		||||
 | 
			
		||||
uint32_t cyclSend = 0;
 | 
			
		||||
uint8_t sendCounter = 0;
 | 
			
		||||
long lastsend = 0;
 | 
			
		||||
 | 
			
		||||
/******************************************************************************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * setup()
 | 
			
		||||
*/
 | 
			
		||||
void setup(void)
 | 
			
		||||
{
 | 
			
		||||
    Serial1.begin(115200);
 | 
			
		||||
    ArduinoPlatform::SerialDebug = &Serial1;
 | 
			
		||||
    Serial1.println("Start.");
 | 
			
		||||
 | 
			
		||||
    usb_hid.enableOutEndpoint(true);
 | 
			
		||||
    usb_hid.setPollInterval(2);
 | 
			
		||||
    usb_hid.setReportDescriptor(UsbTunnelInterface::getKnxHidReportDescriptor(), UsbTunnelInterface::getHidReportDescriptorLength());
 | 
			
		||||
    usb_hid.setReportCallback(NULL, setReportCallback);
 | 
			
		||||
 | 
			
		||||
    usb_hid.begin();
 | 
			
		||||
 | 
			
		||||
    // wait until device mounted
 | 
			
		||||
    while( !USBDevice.mounted() ) delay(1);
 | 
			
		||||
 | 
			
		||||
    println("KNX USB Interface enabled.");
 | 
			
		||||
 | 
			
		||||
    // read adress table, association table, groupobject table and parameters from eeprom
 | 
			
		||||
    knx.readMemory();
 | 
			
		||||
 | 
			
		||||
    if (knx.induvidualAddress() == 0)
 | 
			
		||||
      knx.progMode(true);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (knx.configured())
 | 
			
		||||
    {
 | 
			
		||||
        cyclSend = knx.paramInt(0);
 | 
			
		||||
        Serial1.print("Zykl. send:");
 | 
			
		||||
        Serial1.println(cyclSend);
 | 
			
		||||
        goTemperature.dataPointType(Dpt(9, 1));
 | 
			
		||||
        goHumidity.dataPointType(Dpt(9, 1));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // start the framework.
 | 
			
		||||
    knx.start();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * loop()
 | 
			
		||||
*/
 | 
			
		||||
void loop(void)
 | 
			
		||||
{
 | 
			
		||||
    // don't delay here to much. Otherwise you might lose packages or mess up the timing with ETS
 | 
			
		||||
    knx.loop();
 | 
			
		||||
 | 
			
		||||
    // only run the application code if the device was configured with ETS
 | 
			
		||||
    if(!knx.configured())
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    long now = millis();
 | 
			
		||||
    if ((now - lastsend) < 3000)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    lastsend = now;
 | 
			
		||||
 | 
			
		||||
    float temp = 1.2345;
 | 
			
		||||
    float humi = 60.2;
 | 
			
		||||
    String output = String(millis());
 | 
			
		||||
    output += ", " + String(temp);
 | 
			
		||||
    output += ", " + String(humi);
 | 
			
		||||
    Serial1.println(output);
 | 
			
		||||
        
 | 
			
		||||
    if (sendCounter++ == cyclSend)
 | 
			
		||||
    {
 | 
			
		||||
        sendCounter = 0;
 | 
			
		||||
    
 | 
			
		||||
        goTemperature.value(temp);
 | 
			
		||||
        goHumidity.value(humi);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								knx-usb/test/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								knx-usb/test/README
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
 | 
			
		||||
This directory is intended for PIO Unit Testing and project tests.
 | 
			
		||||
 | 
			
		||||
Unit Testing is a software testing method by which individual units of
 | 
			
		||||
source code, sets of one or more MCU program modules together with associated
 | 
			
		||||
control data, usage procedures, and operating procedures, are tested to
 | 
			
		||||
determine whether they are fit for use. Unit testing finds problems early
 | 
			
		||||
in the development cycle.
 | 
			
		||||
 | 
			
		||||
More information about PIO Unit Testing:
 | 
			
		||||
- https://docs.platformio.org/page/plus/unit-testing.html
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user