2016-06-11 16 views
0

редактирования: Смотрите мой ответ нижеArduino: Изменение определяет без редактирования библиотеки [решенной, ошибка в компиляторе, обходные доступны]


Я довольно новый для платформы Arduino и создания теперь Проект USB HID с библиотекой attiny85 (Trinket) AdaFruit. Смотрите также мой предыдущий вопрос ответил о возможностях этой библиотеки: Change/Override Trinket (attiny85) USB identification name, device name

Я проковылял на редком C, связанных с ограничением (см также последний комментарий в ответ на ссылку выше предыдущего вопроса), отделенный поздно связывание двоичные файлы путем разделения компиляции. Если вы хотите изменить параметры USB-устройства, вам нужно изменить сама библиотека, какая-то странная для меня, потому что это библиотека.

Например, если вы добавляете файл заголовка с измененными параметрами перед загрузкой библиотеки, ничего не изменяется, потому что оно неизвестно библиотекой, потому что оно также должно быть включено в эту библиотеку.

Пример: Это не работает:

#include "myUSBOptions.h" 
#include "TrinketHidCombo.h" 

Другой подход:

Так что мне нужно изменить саму библиотеку для каждого проекта, в этом случае файл usbconfig.h. Это звучит для меня глупо, потому что это библиотека и может использоваться другими проектами. Возможно, это ошибка дизайна в библиотеке Adafruit, такие вещи, как vendorname, devicename и т. Д., Должны быть необязательными в этой библиотеке, а также ваши настройки могут быть перезаписаны при обновлении библиотеки. И ... вам нужно снова отредактировать файл для каждого отдельного проекта.

Итак, я придумал включить дополнительный файл заголовка в файл usbconfig.h, #include "user_usbconfig.h", который требует только одного изменения. Но это не единственный файл usbconfig.h, по крайней мере три версии доступны! Создайте один файл user_usbconfig.h в каталоге проекта, написали командный файл для его автоматизации и включите его в каталог проекта, чтобы изменить параметры, просто щелкнув по нему при переключении проекта.

добавлены в usbconfig.h файлов Line:

....... 

#include "cmdline_defs.h" 

#ifndef __usbconfig_h_included__ 
#define __usbconfig_h_included__ 

#include "user_usbconfig.h" // <-- added this 

....... 

Например user_usbconfig.h включены в проект

/* DEVICE SETTINGS */ 

/* Version number of the device: Minor number first, then major number. */ 
#define USB_CFG_DEVICE_VERSION 0x00, 0x01 


/* VENDOR_NAME 
* These two values define the vendor name returned by the USB device. The name 
* must be given as a list of characters under single quotes. The characters 
* are interpreted as Unicode (UTF-16) entities. 
* If you don't want a vendor name string, undefine these macros. 
* ALWAYS define a vendor name containing your Internet domain name if you use 
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for 
* details. 
*/ 
#define USB_CFG_VENDOR_NAME  'm', 'y', 'C', 'o', 'm', 'p', 'a', 'n', 'y', 'n' 
#define USB_CFG_VENDOR_NAME_LEN 10 


/* DEVICE_NAME 
* Same as above for the device name. If you don't want a device name, undefine 
* the macros. See the file USB-IDs-for-free.txt before you assign a name if 
* you use a shared VID/PID. 
*/ 
#define USB_CFG_DEVICE_NAME  'm', 'y', 'D', 'e', 'v', 'i', 'c', 'e' 
#define USB_CFG_DEVICE_NAME_LEN 8 


/* SERIAL_NUMBER 
* Same as above for the serial number. If you don't want a serial number, 
* undefine the macros. 
* It may be useful to provide the serial number through other means than at 
* compile time. See the section about descriptor properties below for how 
* to fine tune control over USB descriptors such as the string descriptor 
* for the serial number. 
*/ 
/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ 
/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ 

Пример Исходный код MyProject.ино, не делает ничего, кроме активирующего USB:

#include "TrinketHidCombo.h" 

void setup() 
{ 
    TrinketHidCombo.begin(); 
} 

void loop() // Main program - main() 
{ 
    // do nothing, check if USB needs anything done 
    TrinketHidCombo.poll(); 
} 

Пакетный файл я создаю, добавил в директории проекта:

@echo off 
rem ******************************************************** 
rem * setTrinketUSBLibraryOptions.bat      * 
rem * ---------------------------------------------------- * 
rem * Author  : Erwin Haantjes      * 
rem * Project  : Arduino Trinket USB     * 
rem * Dev date  : 11-06-2016       * 
rem * Last changed : 11-06-2016       * 
rem * What it do : 'Copy' (link) USB options project to * 
rem *    Trinket lib to make settings optional.* 
rem *              * 
rem ******************************************************** 


rem *** Config parts that can be modified if required 
SET ARDUINO_LIB_DIR=F:\Program Files\Arduino\DigiSpark\Digispark-Arduino-1.0.4\libraries 
SET USER_HEADER_FILE=user_usbconfig.h 
SET ATU_HEADER_FILE=usbconfig.h 
SET ATU_DIRNAME1=TrinketHidCombo 
SET ATU_DIRNAME2=TrinketKeyboard 
SET ATU_DIRNAME3=TrinketMouse 

SET ATU_HEADER_FILE1=%ARDUINO_LIB_DIR%\%ATU_DIRNAME1%\%ATU_HEADER_FILE% 
SET ATU_HEADER_FILE2=%ARDUINO_LIB_DIR%\%ATU_DIRNAME2%\%ATU_HEADER_FILE% 
SET ATU_HEADER_FILE3=%ARDUINO_LIB_DIR%\%ATU_DIRNAME3%\%ATU_HEADER_FILE% 
SET ATU_USER_HEADER_FILE1=%ARDUINO_LIB_DIR%\%ATU_DIRNAME1%\%USER_HEADER_FILE% 
SET ATU_USER_HEADER_FILE2=%ARDUINO_LIB_DIR%\%ATU_DIRNAME2%\%USER_HEADER_FILE% 
SET ATU_USER_HEADER_FILE3=%ARDUINO_LIB_DIR%\%ATU_DIRNAME3%\%USER_HEADER_FILE% 

rem *** START 
echo. 
echo. 
echo Set Thrinket USB Library options to match your project 
echo ------------------------------------------------------ 
echo. 
if "@%1"=="@/?" goto USAGE 
if "@%1"=="@-?" goto USAGE 
goto INTRO 

:USAGE 
SET USAGEMODE=true 
echo Created by Erwin Haantjes 2016 
echo. 
echo USAGE: 
echo %0 [/?,/C,-?,-C] 
echo. 
echo SWITCHES: 
echo - ? Shows this help 
echo - C Use copy command instead of symlink to hardcopy the "%USER_HEADER_FILE%" to it's targets 
echo. 

:INTRO 
rem *** WARNING and NOTICE 
echo WARNING: 
echo - This batch changes/symlink options to be able to config the Trinket USB Library by project easily. Run this file once each time you work on a project to be sure you are using the right settings. 
echo - If a physical %USER_HEADER_FILE% file exists in the library directory, it will be deleted! 
echo. 
echo NOTICE: 
echo - Each "%ATU_HEADER_FILE%" file in (parts/the) Trinket USB library must include the line: #include "%USER_HEADER_FILE%" at top of the file after #define __usbconfig_h_included__ . 
echo - Once applying this 'patch', you can change USB settings in the "%USER_HEADER_FILE%" file in this directory on the fly without the need to run this batch again. Just compile it after a change and your changes will be 'visible'. 
echo. 
echo. 
echo Library directory is set to: 
echo %ARDUINO_LIB_DIR% 
echo. 
echo. 
if "%USAGEMODE%"=="true" goto END 
echo Do you want to continue? Press any key. 
pause >NUL 
echo. 

rem *** Check destinations 
if exist "%USER_HEADER_FILE%" goto NEXT1 
goto ERROR_NO_USER_FILE 
:NEXT1 
if exist "%ATU_HEADER_FILE1%" goto NEXT2 
goto ERROR_LIB_NOT_EXISTS 
:NEXT2 
if exist "%ATU_HEADER_FILE2%" goto NEXT3 
goto ERROR_LIB_NOT_EXISTS 
:NEXT3 
if exist "%ATU_HEADER_FILE3%" goto NEXT4 
goto ERROR_LIB_NOT_EXISTS 
:NEXT4 
goto APPLY 

rem *** ERRORS 
:ERROR_NO_USER_FILE 
echo ERROR: Create a "%USER_HEADER_FILE%" in this directory first. 
goto ABORTED 
:ERROR_LIB_NOT_EXISTS 
echo %ATU_HEADER_FILE1% 
echo ERROR: Check the directory location match your Arduino IDE setup, see "ARDUINO_LIB_DIR" at top of this batch file. Check also if you have the Trinket USB Library currently installed. 
goto ABORTED 

:APPLY 
echo All seems to be fine, applying patch (symlinks)..... 
echo Checking and removing target files.... 
if exist "%ATU_USER_HEADER_FILE1%" goto REMOVE1 
goto APPLY_NEXT2 
:REMOVE1 
echo Remove symlink of "%ATU_USER_HEADER_FILE1%" .... 
del "%ATU_USER_HEADER_FILE1%" 

:APPLY_NEXT2 
if exist "%ATU_USER_HEADER_FILE2%" goto REMOVE2 
goto APPLY_NEXT3 
:REMOVE2 
echo Remove symlink of "%ATU_USER_HEADER_FILE2%" .... 
del "%ATU_USER_HEADER_FILE2%" 

:APPLY_NEXT3 
if exist "%ATU_USER_HEADER_FILE3%" goto REMOVE3 
goto APPLY_NEXT 
:REMOVE3 
echo Remove file/symlink of "%ATU_USER_HEADER_FILE3%" .... 
del "%ATU_USER_HEADER_FILE3%" 

:APPLY_NEXT 
echo. 
if "@%1"== "@/c" goto APPLY_COPY 
if "@%1"== "@/C" goto APPLY_COPY 
if "@%1"== "@-c" goto APPLY_COPY 
if "@%1"== "@-C" goto APPLY_COPY 
echo Applying symlinks.... 
mklink /H "%ATU_USER_HEADER_FILE1%" "%USER_HEADER_FILE%" 
mklink /H "%ATU_USER_HEADER_FILE2%" "%USER_HEADER_FILE%" 
mklink /H "%ATU_USER_HEADER_FILE3%" "%USER_HEADER_FILE%" 
goto SUCCESS 

:APPLY_COPY 
echo Copy file(s).... 
copy "%USER_HEADER_FILE%" "%ATU_USER_HEADER_FILE1%" 
copy "%USER_HEADER_FILE%" "%ATU_USER_HEADER_FILE2%" 
copy "%USER_HEADER_FILE%" "%ATU_USER_HEADER_FILE3%" 
SET COPYMODE=true 
goto SUCCESS 

:ABORTED 
echo Batch aborted due error. 
goto END 

:SUCCESS 
echo. 
echo SUCCESS! 
echo NOTICE: 
echo - Patch succesfully applied when no error is visible on screen. 
if "%COPYMODE%"=="true" echo - Because you specify the copymode switch, you have to take care of updates yourself. Run this batch file again when you have changed USB settings. 

:END 
SET USAGEMODE= 
SET COPYMODE= 
echo. 
echo Press any key to exit... 
pause >NUL 

:DIE 
echo. 

Заключение и вопрос:

Хотя этот метод является работая отлично, я все еще не удовлетворен и задаюсь вопросом, есть ли более простой способ для этого, не меняя ни одной строки кода библиотеки. Более «на лету» решение, поэтому вам не нужно думать об этом, чтобы избежать ошибок и других головных болей.

+0

Вы переросли библиотеки Arduino. Подумайте о работе на нижнем рычаге. –

+0

@ IgnacioVazquez-Abrams: Спасибо за комментарий. Да, я начинаю с Arduino, да, я могу программировать на других языках и на более высоких навыках. Вы хотите сказать, что достичь цели невозможно с помощью среды разработки Arduino IDE/программирования? Что вы предлагаете мне использовать? Любые намеки? – Codebeat

+0

@ IgnacioVazquez-Abrams: Нет комментариев? – Codebeat

ответ

0

После долгого времени я узнаю, как компилятор Arduino компилирует код. Это не проблема C/C++, на самом деле это ошибка в компиляторе Arduino, комбайне и компиляции. Также компилятор добавляет некоторый определенный код перед компиляцией.


Обход:

Включите ваши библиотеки/independencies с использованием exra проекта ч-файла. Определения перед включением не будут работать, потому что метод компиляции включает h-файлы до того, как будут определены определения (в вашем ino-файле). При использовании определений для изменения библиотеки, например, требуется отдельный h-файл. Например, «myproject.inc.h», который включает в себя все библиотеки, которые вы хотите использовать.

Теперь все определения, которые вы указываете перед включением библиотеки, будут применяться.

Пример:


myproject.ino


#include "myproject.inc.h" 

void setup() 
{ 
    TrinketHidCombo.begin(); 
} 

void loop() // Main program - main() 
{ 
    // do nothing, check if USB needs anything done 
    TrinketHidCombo.poll(); 
} 

myproject.inc.h


#define USB_CFG_VENDOR_NAME  'm', 'y', 'C', 'o', 'm', 'p', 'a', 'n', 'y', 'n' 
#define USB_CFG_VENDOR_NAME_LEN 10 

#include "TrinketHidCombo.h"