1567 lines
50 KiB
C++
Executable File
1567 lines
50 KiB
C++
Executable File
/*
|
|
* LEGO® MINDSTORMS EV3
|
|
*
|
|
* Copyright (C) 2010-2013 The LEGO Group
|
|
*
|
|
* 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 2 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* As a special exception, if other files instantiate templates or use macros or
|
|
* inline functions from this file, or you compile this file and link it with
|
|
* other works to produce a work based on this file, this file does not by itself
|
|
* cause the resulting work to be covered by the GNU General Public License.
|
|
* However the source code for this file must still be made available in accordance
|
|
* with section (3) of the GNU General Public License.
|
|
*
|
|
*/
|
|
|
|
|
|
/*! \page debug Terminal Configuration
|
|
*
|
|
\verbatim
|
|
|
|
|
|
TERMINAL CONFIGURATION (in top of "lms2012.h")
|
|
|
|
Normal release: DEBUG not defined, TERMINAL_ENABLED = 0, DEBUG_UART = 4
|
|
|
|
Printf working: DEBUG not defined, TERMINAL_ENABLED = 0, DEBUG_UART = 0
|
|
|
|
Development with debug messages: DEBUG defined, TERMINAL_ENABLED = 1, DEBUG_UART = 0
|
|
|
|
*/
|
|
|
|
|
|
//#define DEBUG //!< When defined debug messages is output on standard I/O (d_uart is different)
|
|
|
|
#define TERMINAL_ENABLED 0 //!< DEBUG terminal enabled (0 = disabled, 1 = enabled)
|
|
#define DEBUG_UART 4 //!< UART used for debug (0 = port1, 1 = port2, ... 4 = none)
|
|
|
|
|
|
/* \endverbatim */
|
|
|
|
//#define DEBUG_VM
|
|
//#define DEBUG_TRACE_TASK
|
|
//#define DEBUG_C_COM
|
|
//#define DEBUG_C_INPUT
|
|
//#define DEBUG_C_INPUT_DAISYCHAIN
|
|
//#define DEBUG_C_INPUT_DATALOG
|
|
//#define DEBUG_C_INPUT_FAST_DATALOG
|
|
//#define DEBUG_C_MEMORY
|
|
//#define DEBUG_C_MEMORY_LOG
|
|
//#define DEBUG_C_MEMORY_FILE
|
|
//#define DEBUG_C_MEMORY_LOW
|
|
//#define DEBUG_C_SOUND
|
|
//#define DEBUG_C_UI
|
|
|
|
//#define DEBUG_D_ANALOG
|
|
//#define DEBUG_D_POWER
|
|
//#define DEBUG_D_UART
|
|
//#define DEBUG_D_UART_ERROR
|
|
//#define DEBUG_D_UI
|
|
//#define DEBUG_D_SOUND
|
|
//#define DEBUG_D_IIC
|
|
//#define DEBUG_D_USBDEV
|
|
|
|
//#define ENABLE_TEST_ON_PORT4
|
|
|
|
//#define BUFPRINTSIZE 100000
|
|
//#define REMEMBER_TO_ENABLE_SAVE_USER_DATA
|
|
//#define REMEMBER_TO_FIX_TYPEDATA
|
|
|
|
//#define DEBUG_TRACE_USB_COMMAND
|
|
//#define DEBUG_TRACE_MODE_CHANGE
|
|
//#define DEBUG_TRACE_KEY
|
|
//#define DEBUG_TRACE_ANGLE
|
|
//#define DEBUG_TRACE_US
|
|
//#define DEBUG_TRACE_VM
|
|
//#define DEBUG_TRACE_DAISYCHAIN
|
|
//#define DEBUG_BYTECODE_TIME
|
|
//#define DEBUG_TRACE_FREEZE
|
|
//#define DEBUG_TRACE_FILENAME
|
|
//#define DEBUG_TRACE_IIC
|
|
//#define DEBUG_SDCARD
|
|
//#define DEBUG_USBSTICK
|
|
//#define DEBUG_VIRTUAL_BATT_TEMP
|
|
//#define DEBUG_TEMP_SHUTDOWN
|
|
//#define DEBUG_BACK_BLOCKED
|
|
//#define DEBUG_MEMORY_USAGE
|
|
#define DEBUG_RECHARGEABLE
|
|
#define ALLOW_DEBUG_PULSE
|
|
|
|
|
|
|
|
#ifndef LMS2012_H_
|
|
#define LMS2012_H_
|
|
|
|
// HARDWARE PLATFORM
|
|
|
|
#define EP2 4 //!< Schematics revision D
|
|
#define FINALB 3 //!< Schematics revision B and C
|
|
#define FINAL 2 //!< Final prototype
|
|
#define SIMULATION 0 //!< LEGO digital simulation
|
|
|
|
#define PLATFORM_START FINAL //!< Oldest supported hardware (older versions will use this)
|
|
#define PLATFORM_END EP2 //!< Newest supported hardware (newer versions will use this)
|
|
|
|
// Will be removed when not used anymore
|
|
#define A4 -1
|
|
#define EVALBOARD -2
|
|
#define ONE2ONE 1 //!< First real size prototype
|
|
|
|
|
|
#ifdef LEGO_SIMULATION
|
|
#define HARDWARE SIMULATION
|
|
#else
|
|
|
|
#ifndef HARDWARE
|
|
#define HARDWARE FINAL //!< Actual hardware platform (must be one of above)
|
|
#endif
|
|
|
|
#endif
|
|
|
|
// Support for module parameter "HwId"
|
|
//
|
|
// Readout File int PCB
|
|
//
|
|
// V1.00 10 10 MP (h = home, e = education)
|
|
// V0.50 05 5 EP3
|
|
// V0.40 04 4 EP2
|
|
// V0.30 03 3 EP1 (FINALB) (DEFAULT if file "HwId" not found)
|
|
// V0.20 02 2 FINAL
|
|
|
|
#ifdef HW_ID_SUPPORT
|
|
|
|
char *HwId = "03";
|
|
|
|
#define HWID (((HwId[0] - '0') * 10) + (HwId[1] - '0'))
|
|
|
|
#endif
|
|
|
|
|
|
// FIRMWARE VARIANTS
|
|
|
|
//#define OLDCALL //!< Don't use optimised sub calls
|
|
//#define DISABLE_PRU_UARTS //!< Don't use port 3 and 4 for UART sensors
|
|
//#define DISABLE_OLD_COLOR //!< Don't support NXT color sensor
|
|
//#define DISABLE_ADC //!< Don't use ADC (no clock EMC test)
|
|
//#define ADC_BITBANGING //!< Don't use SPI for a/d converter
|
|
//#define DISABLE_DAISYCHAIN
|
|
//#define DISABLE_DAISYCHAIN_COM_CALL
|
|
//#define DISABLE_FAST_DATALOG_BUFFER
|
|
//#define DISABLE_BUMBED
|
|
//#define LOG_ASCII
|
|
//#define DISABLE_FIQ_IIC
|
|
#define UART1_FAKE_INTERRUPT //!< Don't use real interrupt on UART1 (linux prompt)
|
|
//#define DISABLE_LOW_VOLTAGE //!< Don't shut down on low voltage
|
|
//#define ENABLE_HIGH_CURRENT //!< Don't shut down on high current
|
|
//#define DISABLE_LOW_MEMORY //!< Don't check low memory
|
|
//#define DISABLE_UART_DATA_ERROR //!< Don't reset UART sensor if timeout or crc error
|
|
#define DISABLE_PREEMPTED_VM //!< Don't run VM as preempted
|
|
//#define DISABLE_SDCARD_SUPPORT //!< Don't use SD card
|
|
#define DISABLE_USBSTICK_SUPPORT //!< Don't use USB stick
|
|
//#define ENABLE_PERFORMANCE_TEST //!< Show performance bar in the top line
|
|
//#define ENABLE_LOAD_TEST //!< Show integrated current in the top line
|
|
//#define ENABLE_MEMORY_TEST //!< Show used memory in the top line
|
|
//#define ENABLE_STATUS_TEST
|
|
//#define DISABLE_VIRTUAL_BATT_TEMP
|
|
//#define DISABLE_SOUND
|
|
//#define DISABLE_PAR_ALIGNMENT //!< Disable possibility to align sub call parameter types
|
|
//#define DISABLE_NEW_CALL_MUTEX //!< Disable smart object switching after return from non reentrant sub call (enables blocked thread call)
|
|
//#define DISABLE_SYSTEM_BYTECODE //!< Disable the use of opSYSTEM command
|
|
//#define DISABLE_FILENAME_CHECK //!< Disable "c_memory" filename check
|
|
//#define DISABLE_AD_WORD_PROTECT //!< Disable A/D word result protection
|
|
//#define DISABLE_UPDATE_DISASSEMBLY //!< Disable disassemble of running update commands
|
|
#define DISABLE_BLOCK_ALIAS_LOCALS //!< Disable change of block locals if sub call alias (parallelism)
|
|
|
|
#define TESTDEVICE 3
|
|
|
|
#ifdef Linux_X86
|
|
#define DISABLE_DAISYCHAIN
|
|
#define DISABLE_DAISYCHAIN_COM_CALL
|
|
#endif
|
|
|
|
#ifndef PCASM
|
|
#include <asm/types.h>
|
|
#endif
|
|
|
|
#include "lmstypes.h"
|
|
#include "bytecodes.h"
|
|
|
|
// Hardware
|
|
|
|
#define OUTPUTS vmOUTPUTS //!< Number of output ports in the system
|
|
#define INPUTS vmINPUTS //!< Number of input ports in the system
|
|
#define BUTTONS vmBUTTONS //!< Number of buttons in the system
|
|
#define LEDS vmLEDS //!< Number of LEDs in the system
|
|
|
|
#define LCD_WIDTH vmLCD_WIDTH //!< LCD horizontal pixels
|
|
#define LCD_HEIGHT vmLCD_HEIGHT //!< LCD vertical pixels
|
|
#define TOPLINE_HEIGHT vmTOPLINE_HEIGHT //!< Top line vertical pixels
|
|
#define LCD_STORE_LEVELS vmLCD_STORE_LEVELS //!< Store levels
|
|
|
|
// Software
|
|
|
|
#define FG_COLOR vmFG_COLOR //!< Foreground color
|
|
#define BG_COLOR vmBG_COLOR //!< Background color
|
|
|
|
#define CHAIN_DEPT vmCHAIN_DEPT //!< Number of bricks in the USB daisy chain (master + slaves)
|
|
|
|
#define EVENT_BT_PIN vmEVENT_BT_PIN
|
|
|
|
// Folders
|
|
|
|
#define MEMORY_FOLDER vmMEMORY_FOLDER
|
|
#define PROGRAM_FOLDER vmPROGRAM_FOLDER
|
|
#define DATALOG_FOLDER vmDATALOG_FOLDER
|
|
#define SDCARD_FOLDER vmSDCARD_FOLDER
|
|
#define USBSTICK_FOLDER vmUSBSTICK_FOLDER
|
|
|
|
// Files
|
|
#define DETAILS_FILE vmDETAILS_FILE //!< File containing firmware version
|
|
|
|
// Extensions
|
|
|
|
#define EXT_SOUND vmEXT_SOUND //!< Rudolf sound file
|
|
#define EXT_GRAPHICS vmEXT_GRAPHICS //!< Rudolf graphics file
|
|
#define EXT_BYTECODE vmEXT_BYTECODE //!< Rudolf byte code file
|
|
#define EXT_TEXT vmEXT_TEXT //!< Rudolf text file
|
|
#define EXT_DATALOG vmEXT_DATALOG //!< Rudolf datalog file
|
|
#define EXT_PROGRAM vmEXT_PROGRAM //!< Rudolf program byte code file
|
|
#define EXT_CONFIG vmEXT_CONFIG //!< rudolf configuration file
|
|
|
|
/*! \page system System Configuration
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* Following defines sets the system configuration and limitations.\n
|
|
* Defines with preceding "vm" is visible for the byte code assembler\n
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
#define PROJECT "LMS2012"
|
|
#define VERS 1.09
|
|
|
|
//#define RETAILVERS //!< Retail version
|
|
//#define EDUCATIONVERS //!< Education version
|
|
#define DEVELOPERVERS //!< Developer version (telnet with password)
|
|
//#define TESTVERS '1' //!< Minor version (not shown if less than ASCII zero)
|
|
|
|
|
|
#ifdef RETAILVERS
|
|
|
|
#define SPECIALVERS 'H'
|
|
#define LEGO_BUNDLE_SEED_ID "9RNK8ZF528"
|
|
#define LEGO_BUNDLE_ID "com.lego.lms"
|
|
|
|
#endif
|
|
|
|
#ifdef EDUCATIONVERS
|
|
|
|
#define SPECIALVERS 'E'
|
|
#define LEGO_BUNDLE_SEED_ID "9YZJD9MXPZ"
|
|
#define LEGO_BUNDLE_ID "com.lego.education.ev3"
|
|
|
|
#endif
|
|
|
|
#ifdef DEVELOPERVERS
|
|
|
|
#define SPECIALVERS 'D'
|
|
#define LEGO_BUNDLE_SEED_ID "9RNK8ZF528"
|
|
#define LEGO_BUNDLE_ID "com.lego.lms"
|
|
|
|
#endif
|
|
|
|
#ifdef TESTVERS
|
|
|
|
#define SPECIALVERS TESTVERS
|
|
#define LEGO_BUNDLE_SEED_ID "BA9Q76VTQG"
|
|
#define LEGO_BUNDLE_ID "com.lego.education.ev3"
|
|
/*
|
|
#define SPECIALVERS TESTVERS
|
|
#define LEGO_BUNDLE_SEED_ID "BA9Q76VTQG"
|
|
#define LEGO_BUNDLE_ID "com.lego.edu.ev3"
|
|
|
|
#define SPECIALVERS TESTVERS
|
|
#define LEGO_BUNDLE_SEED_ID "BA9Q76VTQG"
|
|
#define LEGO_BUNDLE_ID "com.lego.education.ev3programming"
|
|
*/
|
|
#endif
|
|
|
|
|
|
#define MAX_PROGRAMS SLOTS //!< Max number of programs (including UI and direct commands) running at a time
|
|
#define MAX_BREAKPOINTS 4 //!< Max number of breakpoints (opCODES depends on this value)
|
|
#define MAX_LABELS 32 //!< Max number of labels per program
|
|
#define MAX_DEVICE_TYPE 127 //!< Highest type number (positive)
|
|
#define MAX_VALID_TYPE vmMAX_VALID_TYPE //!< Highest valid type
|
|
#define MAX_DEVICE_MODES 8 //!< Max number of modes in one device
|
|
#define MAX_DEVICE_DATASETS 8 //!< Max number of data sets in one device
|
|
#define MAX_DEVICE_DATALENGTH 32 //!< Max device data length
|
|
|
|
#define MAX_DEVICE_BUSY_TIME 1200 //!< Max number of mS a device can be busy when read
|
|
|
|
#define MAX_DEVICE_TYPES ((MAX_DEVICE_TYPE + 1) * MAX_DEVICE_MODES)//!< Max number of different device types and modes (max type data list size)
|
|
|
|
#define MAX_FRAMES_PER_SEC 10 //!< Max frames per second update in display
|
|
|
|
#define CACHE_DEEPT 10 //!< Max number of programs cached (in RECENT FILES MENU)
|
|
#define MAX_HANDLES 500 //!< Max number of handles to memory pools and arrays in one program
|
|
|
|
#define MAX_ARRAY_SIZE 1000000000 //!< Max array size
|
|
#define MIN_ARRAY_ELEMENTS 0 //!< Min elements in a DATA8 array
|
|
|
|
#define INSTALLED_MEMORY 6000 //!< Flash allocated to hold user programs/data
|
|
#define LOW_MEMORY 500 //!< Low memory warning [KB]
|
|
|
|
#define LOGBUFFER_SIZE 1000 //!< Min log buffer size
|
|
#define DEVICE_LOGBUF_SIZE 300 //!< Device log buffer size (black layer buffer)
|
|
#define MIN_LIVE_UPDATE_TIME 10 //!< [mS] Min sample time when live update
|
|
|
|
#define MIN_IIC_REPEAT_TIME 10 //!< [mS] Min IIC device repeat time
|
|
#define MAX_IIC_REPEAT_TIME 1000 //!< [mS] Max IIC device repeat time
|
|
|
|
#define MAX_COMMAND_BYTECODES 64 //!< Max number of byte codes in a debug terminal direct command
|
|
#define MAX_COMMAND_LOCALS 64 //!< Max number of bytes allocated for direct command local variables
|
|
#define MAX_COMMAND_GLOBALS 1021 //!< Max number of bytes allocated for direct command global variables
|
|
|
|
#define UI_PRIORITY 20 //!< UI byte codes before switching VM thread
|
|
#define C_PRIORITY 200 //!< C call byte codes
|
|
|
|
#ifndef DISABLE_PREEMPTED_VM
|
|
#define PRG_PRIORITY 2000 //!< Prg byte codes before switching VM thread
|
|
#else
|
|
#define PRG_PRIORITY 200 //!< Prg byte codes before switching VM thread
|
|
#endif
|
|
|
|
#define BUTTON_DEBOUNCE_TIME 30
|
|
#define BUTTON_START_REPEAT_TIME 400
|
|
#define BUTTON_REPEAT_TIME 200
|
|
|
|
#define LONG_PRESS_TIME 3000 //!< [mS] Time pressed before long press recognised
|
|
|
|
#define ADC_REF 5000 //!< [mV] maximal value on ADC
|
|
#define ADC_RES 4095 //!< [CNT] maximal count on ADC
|
|
|
|
#define IN1_ID_HYSTERESIS 50 //!< [mV] half of the span one Id takes up on input connection 1 voltage
|
|
#define OUT5_ID_HYSTERESIS 100 //!< [mV] half of the span one Id takes up on output connection 5 voltage
|
|
|
|
#define DEVICE_UPDATE_TIME 1000000 //!< Min device (sensor) update time [nS]
|
|
#define DELAY_TO_TYPEDATA 10000 //!< Time from daisy chain active to upload type data [mS]
|
|
#define DAISYCHAIN_MODE_TIME 10 //!< Time for daisy chain change mode [mS]
|
|
#define MAX_FILE_HANDLES 64 //!< Max number of down load file handles
|
|
#define MIN_HANDLE 3 //!< Min file handle to close
|
|
|
|
#define ID_LENGTH 7 //!< Id length (BT MAC id) (incl. zero terminator)
|
|
#define NAME_LENGTH 12 //!< Name length (not including zero termination)
|
|
|
|
#define ERROR_BUFFER_SIZE 8 //!< Number of errors in buffer
|
|
|
|
#define PWM_DEVICE "lms_pwm" //!< PWM device name
|
|
#define PWM_DEVICE_NAME "/dev/lms_pwm" //!< PWM device file name
|
|
|
|
#define MOTOR_DEVICE "lms_motor" //!< TACHO device name
|
|
#define MOTOR_DEVICE_NAME "/dev/lms_motor" //!< TACHO device file name
|
|
|
|
#define ANALOG_DEVICE "lms_analog" //!< ANALOG device name
|
|
#define ANALOG_DEVICE_NAME "/dev/lms_analog" //!< ANALOG device file name
|
|
|
|
#define POWER_DEVICE "lms_power" //!< POWER device name
|
|
#define POWER_DEVICE_NAME "/dev/lms_power" //!< POWER device file name
|
|
|
|
#define DCM_DEVICE "lms_dcm" //!< DCM device name
|
|
#define DCM_DEVICE_NAME "/dev/lms_dcm" //!< DCM device file name
|
|
|
|
#define UI_DEVICE "lms_ui" //!< UI device name
|
|
#define UI_DEVICE_NAME "/dev/lms_ui" //!< UI device file name
|
|
|
|
#define LCD_DEVICE "lms_display" //!< DISPLAY device name
|
|
//#define LCD_DEVICE_NAME "/dev/lms_display" //!< DISPLAY device file name
|
|
#define LCD_DEVICE_NAME "/dev/fb0" //!< DISPLAY device file name
|
|
|
|
#define UART_DEVICE "lms_uart" //!< UART device name
|
|
#define UART_DEVICE_NAME "/dev/lms_uart" //!< UART device file name
|
|
|
|
#define USBDEV_DEVICE "lms_usbdev" //!< USB device
|
|
#define USBDEV_DEVICE_NAME "/dev/lms_usbdev" //!< USB device
|
|
|
|
#define USBHOST_DEVICE "lms_usbhost" //!< USB host
|
|
#define USBHOST_DEVICE_NAME "/dev/lms_usbhost" //!< USB host
|
|
|
|
#define SOUND_DEVICE "lms_sound" //!< SOUND device name
|
|
#define SOUND_DEVICE_NAME "/dev/lms_sound" //!< SOUND device
|
|
|
|
#define IIC_DEVICE "lms_iic" //!< IIC device name
|
|
#define IIC_DEVICE_NAME "/dev/lms_iic" //!< IIC device
|
|
|
|
#define BT_DEVICE "lms_bt" //!< BT device name
|
|
#define BT_DEVICE_NAME "/dev/lms_bt" //!< BT device
|
|
|
|
#define UPDATE_DEVICE "lms_update" //!< UPDATE device name
|
|
#define UPDATE_DEVICE_NAME "/dev/lms_update" //!< UPDATE device
|
|
|
|
#define TEST_PIN_DEVICE "lms_tst_pin" //!< TEST pin device name
|
|
#define TEST_PIN_DEVICE_NAME "/dev/lms_tst_pin" //!< TEST pin device file name
|
|
|
|
#define TEST_UART_DEVICE "lms_tst_uart" //!< TEST UART device name
|
|
#define TEST_UART_DEVICE_NAME "/dev/lms_tst_uart" //!< TEST UART device file name
|
|
|
|
|
|
#define DIR_DEEPT vmDIR_DEEPT //!< Max directory items allocated
|
|
|
|
// File
|
|
|
|
//***********************************************************************************************************************
|
|
//! \todo Filename sizes should only use vmPATHSIZE, vmNAMESIZE, vmEXTSIZE and vmFILENAMESIZE
|
|
|
|
#define FILENAMESIZE vmFILENAMESIZE //!< All inclusive (path, filename, extension and zero termination)
|
|
#define FILENAME_SIZE 52 //!< User filename size without extension including zero
|
|
#define FOLDERNAME_SIZE 10 //!< Folder name size relative to "lms2012" folder including zero
|
|
#define SUBFOLDERNAME_SIZE FILENAME_SIZE //!< Sub folder name size without "/" including zero
|
|
|
|
#define MAX_FILENAME_SIZE (FOLDERNAME_SIZE + SUBFOLDERNAME_SIZE + FILENAME_SIZE + 5)
|
|
|
|
//***********************************************************************************************************************
|
|
|
|
#define TYPEDATE_FILE_NAME "typedata" //!< TypeData filename
|
|
#define ICON_FILE_NAME "icon" //!< Icon image filename
|
|
#define TEXT_FILE_NAME "text" //!< Text filename
|
|
|
|
#define DEMO_FILE_NAME "../prjs/BrkProg_SAVE/Demo.rpf"
|
|
|
|
// Memory
|
|
|
|
|
|
|
|
|
|
|
|
// SD card
|
|
|
|
#ifdef Linux_X86
|
|
#define SDCARD_DEVICE1 "/dev/mmcblk0"
|
|
#define SDCARD_DEVICE2 "/dev/mmcblk0p1"
|
|
#else
|
|
#define SDCARD_DEVICE1 "/dev/mmcblk0"
|
|
#define SDCARD_DEVICE2 "/dev/mmcblk0p1"
|
|
#endif
|
|
|
|
#define SDCARD_MOUNT "./mount_sdcard"
|
|
#define SDCARD_UNMOUNT "./unmount_sdcard"
|
|
|
|
// USB stick
|
|
|
|
#ifndef Linux_X86
|
|
#define USBSTICK_DEVICE "/dev/sda"
|
|
#else
|
|
#define USBSTICK_DEVICE "/dev/sdf1"
|
|
#endif
|
|
|
|
#define USBSTICK_MOUNT "./mount_usbstick"
|
|
#define USBSTICK_UNMOUNT "./unmount_usbstick"
|
|
|
|
/*
|
|
#define DEFAULT_PRJS_FOLDER "~/lms2012/prjs" //!< Project folder name without trailing "/"
|
|
#define DEFAULT_APPS_FOLDER "~/lms2012/apps" //!< Applet folder name without trailing "/"
|
|
#define DEFAULT_TOOLS_FOLDER "~/lms2012/tools" //!< Setting folder name without trailing "/"
|
|
#define DEFAULT_SYS_FOLDER "~/lms2012/sys" //!< System folder name without trailing "/"
|
|
#define DEFAULT_SETUP_FOLDER "~/lms2012/sys" //!< Setup folder name without trailing "/"
|
|
#define DEFAULT_SD_FOLDER "~/lms2012/SD Card" //!< Sd card folder name without trailing "/"
|
|
#define DEFAULT_USB_FOLDER "~/lms2012/USB Memory"//!< USB Memory folder name without trailing "/"
|
|
*/
|
|
|
|
#define DEFAULT_FOLDER "ui" //!< Folder containing the first small programs
|
|
#define DEFAULT_UI "ui" //!< Default user interface
|
|
|
|
#define DEFAULT_VOLUME vmDEFAULT_VOLUME
|
|
#define DEFAULT_SLEEPMINUTES vmDEFAULT_SLEEPMINUTES
|
|
|
|
#define COM_CMD_DEVICE_NAME USBDEV_DEVICE_NAME //!< USB HID command pipe device file name
|
|
|
|
/*! \endverbatim
|
|
*
|
|
*/
|
|
|
|
/*! \page powermanagement Power Management
|
|
*
|
|
* This section describes various constants used in the power management
|
|
*
|
|
*
|
|
*\n
|
|
* <hr size="1"/>
|
|
* <b>Battery Indicator</b>
|
|
*\n
|
|
* <hr size="1"/>
|
|
* \verbatim
|
|
*/
|
|
|
|
#define BATT_INDICATOR_HIGH 7500 //!< Battery indicator high [mV]
|
|
#define BATT_INDICATOR_LOW 6200 //!< Battery indicator low [mV]
|
|
|
|
#define ACCU_INDICATOR_HIGH 7500 //!< Rechargeable battery indicator high [mV]
|
|
#define ACCU_INDICATOR_LOW 7100 //!< Rechargeable battery indicator low [mV]
|
|
|
|
/*! \endverbatim
|
|
* \subpage pmbattind
|
|
*\n
|
|
* <hr size="1"/>
|
|
* <b>Low Voltage Shutdown</b>
|
|
*\n
|
|
* <hr size="1"/>
|
|
* \verbatim
|
|
*/
|
|
|
|
#define LOW_VOLTAGE_SHUTDOWN_TIME 10000 //!< Time from shutdown lower limit to shutdown [mS]
|
|
|
|
#define BATT_WARNING_HIGH 6.2 //!< Battery voltage warning upper limit [V]
|
|
#define BATT_WARNING_LOW 5.5 //!< Battery voltage warning lower limit [V]
|
|
#define BATT_SHUTDOWN_HIGH 5.5 //!< Battery voltage shutdown upper limit [V]
|
|
#define BATT_SHUTDOWN_LOW 4.5 //!< Battery voltage shutdown lower limit [V]
|
|
|
|
#define ACCU_WARNING_HIGH 7.1 //!< Rechargeable battery voltage warning upper limit [V]
|
|
#define ACCU_WARNING_LOW 6.5 //!< Rechargeable battery voltage warning lower limit [V]
|
|
#define ACCU_SHUTDOWN_HIGH 6.5 //!< Rechargeable battery voltage shutdown upper limit [V]
|
|
#define ACCU_SHUTDOWN_LOW 6.0 //!< Rechargeable battery voltage shutdown lower limit [V]
|
|
|
|
/*! \endverbatim
|
|
* \subpage pmbattsd
|
|
*\n
|
|
*/
|
|
#ifdef ENABLE_HIGH_CURRENT
|
|
/*! \page powermanagement
|
|
*
|
|
* <hr size="1"/>
|
|
* <b>High Load Shutdown</b>
|
|
*\n
|
|
* <hr size="1"/>
|
|
* \verbatim
|
|
*/
|
|
|
|
#define LOAD_SHUTDOWN_FAIL 4.0 //!< Current limit for instantly shutdown [A]
|
|
#define LOAD_SHUTDOWN_HIGH 3.0 //!< Current limit for integrated current shutdown [A*S]
|
|
#define LOAD_BREAK_EVEN 1.75 //!< Current limit for integrated current break even [A*S]
|
|
|
|
#define LOAD_SLOPE_UP 0.2 //!< Current slope when current is above break even [A/S]
|
|
#define LOAD_SLOPE_DOWN 0.1 //!< Current slope when current is below break even [A/S]
|
|
|
|
/*! \endverbatim
|
|
* \subpage pmloadsd
|
|
*\n
|
|
*/
|
|
#endif
|
|
|
|
#ifndef DISABLE_VIRTUAL_BATT_TEMP
|
|
/*! \page powermanagement
|
|
*
|
|
* <hr size="1"/>
|
|
* <b>High Temperature Shutdown</b>
|
|
*\n
|
|
* <hr size="1"/>
|
|
* \verbatim
|
|
*/
|
|
|
|
#define TEMP_SHUTDOWN_FAIL 45.0 //!< Temperature rise before fail shutdown [C]
|
|
#define TEMP_SHUTDOWN_WARNING 40.0 //!< Temperature rise before warning [C]
|
|
|
|
/*! \endverbatim
|
|
* \subpage pmtempsd
|
|
*\n
|
|
*/
|
|
#endif
|
|
|
|
#define UPDATE_TIME1 2 //!< Update repeat time1 [mS]
|
|
#define UPDATE_TIME2 10 //!< Update repeat time2 [mS]
|
|
#define UPDATE_MEMORY 200 //!< Update memory size [mS]
|
|
#define UPDATE_SDCARD 500 //!< Update sdcard size [mS]
|
|
#define UPDATE_USBSTICK 500 //!< Update usbstick size [mS]
|
|
|
|
|
|
// Per start of (polution) defines
|
|
#define MAX_SOUND_DATA_SIZE 250
|
|
#define SOUND_CHUNK 250
|
|
#define SOUND_ADPCM_CHUNK 125
|
|
#define SOUND_MASTER_CLOCK 132000000
|
|
#define SOUND_TONE_MASTER_CLOCK 1031250
|
|
#define SOUND_MIN_FRQ 250
|
|
#define SOUND_MAX_FRQ 10000
|
|
#define SOUND_MAX_LEVEL 8
|
|
#define SOUND_FILE_BUFFER_SIZE SOUND_CHUNK + 2 // 12.8 mS @ 8KHz
|
|
#define SOUND_BUFFER_COUNT 3
|
|
#define SOUND_FILE_FORMAT_NORMAL 0x0100 // RSO-file
|
|
#define SOUND_FILE_FORMAT_COMPRESSED 0x0101 // RSO-file compressed
|
|
// Per end of defines
|
|
|
|
|
|
/*!
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
#define VtoC(V) ((UWORD)((V * ADC_RES) / ADC_REF))
|
|
#define CtoV(C) ((UWORD)((C * ADC_REF) / ADC_RES))
|
|
#define MtoV(M) ((UWORD)((M * ADC_REF * 100) / (ADC_RES * 52)))
|
|
|
|
#define KB 1024
|
|
|
|
enum
|
|
{
|
|
FALSE = 0,
|
|
TRUE = 1,
|
|
};
|
|
|
|
|
|
/*! \page connections Connections
|
|
*
|
|
* \anchor connectiontypes
|
|
*
|
|
* Following defines sets the input and output port connection type\n
|
|
*
|
|
* These connection types are evaluated in the DCM driver \ref DcmDriver "Device Detection Manager Driver"
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
CONN_UNKNOWN = 111, //!< Connection is fake (test)
|
|
|
|
CONN_DAISYCHAIN = 117, //!< Connection is daisy chained
|
|
CONN_NXT_COLOR = 118, //!< Connection type is NXT color sensor
|
|
CONN_NXT_DUMB = 119, //!< Connection type is NXT analog sensor
|
|
CONN_NXT_IIC = 120, //!< Connection type is NXT IIC sensor
|
|
|
|
CONN_INPUT_DUMB = 121, //!< Connection type is LMS2012 input device with ID resistor
|
|
CONN_INPUT_UART = 122, //!< Connection type is LMS2012 UART sensor
|
|
|
|
CONN_OUTPUT_DUMB = 123, //!< Connection type is LMS2012 output device with ID resistor
|
|
CONN_OUTPUT_INTELLIGENT = 124, //!< Connection type is LMS2012 output device with communication
|
|
CONN_OUTPUT_TACHO = 125, //!< Connection type is LMS2012 tacho motor with series ID resistance
|
|
|
|
CONN_NONE = 126, //!< Port empty or not available
|
|
CONN_ERROR = 127, //!< Port not empty and type is invalid
|
|
}
|
|
CONN;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
|
|
/*! \page objectstatus Object Status
|
|
*
|
|
\verbatim
|
|
|
|
Image load -> Initialize all objects
|
|
|
|
|
|
Initialize -> if TriggerCount == 0 -> RUNNING (VMTHREAD)
|
|
else -> STOPPED (waiting for 1. trigger)
|
|
|
|
1.Trigger -> Initialise -> WAITING
|
|
|
|
Triggered -> Enqueue -> RUNNING
|
|
|
|
Done -> Dequeue -> STOPPED
|
|
|
|
|
|
Program start
|
|
|
|
|
v
|
|
STOPPED -------> WAITING -------> RUNNING --------,
|
|
^ 1.trig/ n.trig/ done/ |
|
|
| Reset+Enqueue Dequeue |
|
|
| |
|
|
'----------------------------------------------'
|
|
|
|
\endverbatim
|
|
*/
|
|
|
|
|
|
/*! \enum DSPSTAT
|
|
*
|
|
* Dispatch status values
|
|
*/
|
|
typedef enum
|
|
{
|
|
NOBREAK = 0x0100, //!< Dispatcher running (looping)
|
|
STOPBREAK = 0x0200, //!< Break because of program stop
|
|
SLEEPBREAK = 0x0400, //!< Break because of sleeping
|
|
INSTRBREAK = 0x0800, //!< Break because of opcode break
|
|
BUSYBREAK = 0x1000, //!< Break because of waiting for completion
|
|
PRGBREAK = 0x2000, //!< Break because of program break
|
|
USERBREAK = 0x4000, //!< Break because of user decision
|
|
FAILBREAK = 0x8000 //!< Break because of fail
|
|
}
|
|
DSPSTAT;
|
|
|
|
typedef void (*PRIM)(void); //!< Prototype for all byte codes
|
|
|
|
|
|
|
|
/*! \page memorylayout Memory Layout
|
|
*
|
|
* RAM layout
|
|
*
|
|
*- GlobalVariables (aligned)
|
|
*
|
|
*- ObjectPointerList (aligned)
|
|
*
|
|
*- OBJ (aligned)
|
|
* - Ip (4 bytes)
|
|
* - Status (2 bytes)
|
|
* - TriggerCount/CallerId (2 bytes)
|
|
* - Local (0..MAX Bytes)\n
|
|
*
|
|
*/
|
|
|
|
/*! \struct OBJ
|
|
* Object data is used to hold the variables used for an object (allocated at image load time)
|
|
*/
|
|
typedef struct // Object
|
|
{
|
|
IP Ip; //!< Object instruction pointer
|
|
LP pLocal; //!< Local variable pointer
|
|
#ifndef DISABLE_NEW_CALL_MUTEX
|
|
UBYTE ObjStatus; //!< Object status
|
|
UBYTE Blocked;
|
|
#else
|
|
UWORD ObjStatus; //!< Object status
|
|
#endif
|
|
union //!< Different meaning for SUBCALL and BLOCKS
|
|
{
|
|
OBJID CallerId; //!< Caller id used for SUBCALL to save object id to return to
|
|
TRIGGER TriggerCount; //!< Trigger count used by BLOCK's trigger logic
|
|
}u;
|
|
VARDATA Local[]; //!< Poll of bytes used for local variables
|
|
}
|
|
OBJ;
|
|
|
|
|
|
/*! \struct BRKP
|
|
* Breakpoint data hold information used for breakpoint
|
|
*/
|
|
typedef struct
|
|
{
|
|
IMINDEX Addr; //!< Offset to breakpoint address from image start
|
|
OP OpCode; //!< Saved substituted opcode
|
|
}
|
|
BRKP;
|
|
|
|
/*! \struct PRG
|
|
* Program data hold information about a program
|
|
*/
|
|
typedef struct
|
|
{
|
|
ULONG InstrCnt; //!< Instruction counter used for performance analyses
|
|
ULONG InstrTime; //!< Instruction time used for performance analyses
|
|
|
|
ULONG StartTime; //!< Program start time [mS]
|
|
ULONG RunTime; //!< Program run time [uS]
|
|
|
|
IP pImage; //!< Pointer to start of image
|
|
GP pData; //!< Pointer to start of data
|
|
GP pGlobal; //!< Pointer to start of global bytes
|
|
OBJHEAD* pObjHead; //!< Pointer to start of object headers
|
|
OBJ** pObjList; //!< Pointer to object pointer list
|
|
IP ObjectIp; //!< Working object Ip
|
|
LP ObjectLocal; //!< Working object locals
|
|
|
|
OBJID Objects; //!< No of objects in image
|
|
OBJID ObjectId; //!< Active object id
|
|
|
|
OBJSTAT Status; //!< Program status
|
|
OBJSTAT StatusChange; //!< Program status change
|
|
RESULT Result; //!< Program result (OK, BUSY, FAIL)
|
|
|
|
BRKP Brkp[MAX_BREAKPOINTS]; //!< Storage for breakpoint logic
|
|
|
|
LABEL Label[MAX_LABELS]; //!< Storage for labels
|
|
UWORD Debug; //!< Debug flag
|
|
|
|
DATA8 Name[FILENAME_SIZE];
|
|
|
|
}
|
|
PRG;
|
|
|
|
|
|
#define TYPE_NAME_LENGTH 11
|
|
#define SYMBOL_LENGTH 4 //!< Symbol leng th (not including zero)
|
|
|
|
/*! \struct TYPES
|
|
* Device type data
|
|
*/
|
|
typedef struct // if data type changes - remember to change "cInputTypeDataInit" !
|
|
{
|
|
SBYTE Name[TYPE_NAME_LENGTH + 1]; //!< Device name
|
|
DATA8 Type; //!< Device type
|
|
DATA8 Connection;
|
|
DATA8 Mode; //!< Device mode
|
|
DATA8 DataSets;
|
|
DATA8 Format;
|
|
DATA8 Figures;
|
|
DATA8 Decimals;
|
|
DATA8 Views;
|
|
DATAF RawMin; //!< Raw minimum value (e.c. 0.0)
|
|
DATAF RawMax; //!< Raw maximum value (e.c. 1023.0)
|
|
DATAF PctMin; //!< Percent minimum value (e.c. -100.0)
|
|
DATAF PctMax; //!< Percent maximum value (e.c. 100.0)
|
|
DATAF SiMin; //!< SI unit minimum value (e.c. -100.0)
|
|
DATAF SiMax; //!< SI unit maximum value (e.c. 100.0)
|
|
UWORD InvalidTime; //!< mS from type change to valid data
|
|
UWORD IdValue; //!< Device id value (e.c. 0 ~ UART)
|
|
DATA8 Pins; //!< Device pin setup
|
|
SBYTE Symbol[SYMBOL_LENGTH + 1]; //!< SI unit symbol
|
|
UWORD Align;
|
|
}
|
|
TYPES;
|
|
|
|
#define TYPE_PARAMETERS 19 //!< Number of members in the structure above
|
|
#define MAX_DEVICE_INFOLENGTH 54 //!< Number of bytes in the structure above (can not be changed)
|
|
|
|
|
|
/*!\enum ERR
|
|
*
|
|
* Describes error numbers
|
|
*/
|
|
typedef enum
|
|
{
|
|
TOO_MANY_ERRORS_TO_BUFFER,
|
|
TYPEDATA_TABEL_FULL,
|
|
TYPEDATA_FILE_NOT_FOUND,
|
|
ANALOG_DEVICE_FILE_NOT_FOUND,
|
|
ANALOG_SHARED_MEMORY,
|
|
UART_DEVICE_FILE_NOT_FOUND,
|
|
UART_SHARED_MEMORY,
|
|
IIC_DEVICE_FILE_NOT_FOUND,
|
|
IIC_SHARED_MEMORY,
|
|
DISPLAY_SHARED_MEMORY,
|
|
UI_SHARED_MEMORY,
|
|
UI_DEVICE_FILE_NOT_FOUND,
|
|
LCD_DEVICE_FILE_NOT_FOUND,
|
|
OUTPUT_SHARED_MEMORY,
|
|
COM_COULD_NOT_OPEN_FILE,
|
|
COM_NAME_TOO_SHORT,
|
|
COM_NAME_TOO_LONG,
|
|
COM_INTERNAL,
|
|
VM_INTERNAL,
|
|
VM_PROGRAM_VALIDATION,
|
|
VM_PROGRAM_NOT_STARTED,
|
|
VM_PROGRAM_FAIL_BREAK,
|
|
VM_PROGRAM_INSTRUCTION_BREAK,
|
|
VM_PROGRAM_NOT_FOUND,
|
|
SOUND_DEVICE_FILE_NOT_FOUND,
|
|
SOUND_SHARED_MEMORY,
|
|
FILE_OPEN_ERROR,
|
|
FILE_READ_ERROR,
|
|
FILE_WRITE_ERROR,
|
|
FILE_CLOSE_ERROR,
|
|
FILE_GET_HANDLE_ERROR,
|
|
FILE_NAME_ERROR,
|
|
USB_SHARED_MEMORY,
|
|
OUT_OF_MEMORY,
|
|
ERRORS
|
|
}
|
|
ERR;
|
|
|
|
// INTERFACE FOR SHARED LIBRARIES
|
|
|
|
extern void PrimParAdvance(void); // Dummy get parameter
|
|
|
|
extern void* PrimParPointer(void); // Get pointer to primitives and system calls parameters
|
|
|
|
extern IP GetImageStart(void); // Get pointer to start of image
|
|
|
|
extern void SetDispatchStatus(DSPSTAT Status); // Set dispatch status (result from executing byte code)
|
|
|
|
extern void SetInstructions(ULONG Instructions); // Set number of instructions before VMThread change
|
|
|
|
extern PRGID CurrentProgramId(void); // Get current program id
|
|
|
|
extern OBJSTAT ProgramStatus(PRGID PrgId); // Get program status
|
|
|
|
extern OBJSTAT ProgramStatusChange(PRGID PrgId); // Get program status change
|
|
|
|
extern void ProgramEnd(PRGID PrgId);
|
|
|
|
extern OBJID CallingObjectId(void); // Get calling objects id
|
|
|
|
extern void AdjustObjectIp(IMOFFS Value); // Adjust IP
|
|
|
|
extern IP GetObjectIp(void); // Get IP
|
|
|
|
extern void SetObjectIp(IP Ip); // Set IP
|
|
|
|
extern ULONG GetTimeUS(void); // Get uS
|
|
|
|
extern ULONG GetTimeMS(void); // Get mS
|
|
|
|
extern ULONG GetTime(void); // Get actual program time
|
|
|
|
extern ULONG CurrentObjectIp(void); // Get current object ip
|
|
|
|
extern void VmPrint(char *pString); // print string
|
|
|
|
extern void SetTerminalEnable(DATA8 Value); // Terminal enable/disable
|
|
|
|
extern DATA8 GetTerminalEnable(void); // Get terminal enable state
|
|
|
|
extern void GetResourcePath(char *pString,DATA8 MaxLength);// Get resource path
|
|
|
|
extern void* VmMemoryResize(HANDLER Handle,DATA32 Elements);
|
|
|
|
extern void SetVolumePercent(DATA8 Volume);
|
|
|
|
extern DATA8 GetVolumePercent(void);
|
|
|
|
extern void SetSleepMinutes(DATA8 Minutes);
|
|
|
|
extern DATA8 GetSleepMinutes(void);
|
|
|
|
extern DSPSTAT ExecuteByteCode(IP pByteCode,GP pGlobals,LP pLocals); // Execute byte code stream (C-call)
|
|
|
|
extern DATA8 CheckSdcard(DATA8 *pChanged,DATA32 *pTotal,DATA32 *pFree,DATA8 Force);
|
|
|
|
extern DATA8 CheckUsbstick(DATA8 *pChanged,DATA32 *pTotal,DATA32 *pFree,DATA8 Force);
|
|
|
|
extern void SetUiUpdate(void);
|
|
|
|
extern RESULT ValidateChar(DATA8 *pChar,DATA8 Set);
|
|
|
|
extern RESULT ValidateString(DATA8 *pString,DATA8 Set);
|
|
|
|
extern ERR LogErrorGet(void);
|
|
|
|
#ifdef BUFPRINTSIZE
|
|
extern void BufPrint(char Cmd,char *pFormat, ...);
|
|
#endif
|
|
|
|
|
|
|
|
#define ERR_STRING_SIZE vmERR_STRING_SIZE // Inclusive zero termination
|
|
|
|
extern void LogErrorNumber(ERR Error); // Log error number
|
|
extern DATA8 LogErrorNumberExists(ERR Error);
|
|
|
|
|
|
#ifndef DISABLE_OLD_COLOR
|
|
|
|
#define COLORS 4
|
|
#define CALPOINTS 3
|
|
|
|
|
|
/*! \page NxtColorMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
ULONG Calibration[CALPOINTS][COLORS];
|
|
UWORD CalLimits[CALPOINTS - 1];
|
|
UWORD Crc;
|
|
UWORD ADRaw[COLORS];
|
|
UWORD SensorRaw[COLORS];
|
|
}
|
|
COLORSTRUCT;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
#endif
|
|
|
|
|
|
// INTERFACE BETWEEN SHARED LIBRARIES AND MODULES
|
|
|
|
/*! \page AnalogModuleMemory
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the raw analogue values for use in userspace
|
|
* this pointer will point to a struct and the layout is following:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
DATA16 InPin1[INPUTS]; //!< Analog value at input port connection 1
|
|
DATA16 InPin6[INPUTS]; //!< Analog value at input port connection 6
|
|
DATA16 OutPin5[OUTPUTS]; //!< Analog value at output port connection 5
|
|
DATA16 BatteryTemp; //!< Battery temperature
|
|
DATA16 MotorCurrent; //!< Current flowing to motors
|
|
DATA16 BatteryCurrent; //!< Current flowing from the battery
|
|
DATA16 Cell123456; //!< Voltage at battery cell 1, 2, 3,4, 5, and 6
|
|
#ifndef DISABLE_FAST_DATALOG_BUFFER
|
|
DATA16 Pin1[INPUTS][DEVICE_LOGBUF_SIZE]; //!< Raw value from analog device
|
|
DATA16 Pin6[INPUTS][DEVICE_LOGBUF_SIZE]; //!< Raw value from analog device
|
|
UWORD Actual[INPUTS];
|
|
UWORD LogIn[INPUTS];
|
|
UWORD LogOut[INPUTS];
|
|
#endif
|
|
#ifndef DISABLE_OLD_COLOR
|
|
COLORSTRUCT NxtCol[INPUTS];
|
|
#endif
|
|
DATA16 OutPin5Low[OUTPUTS]; //!< Analog value at output port connection 5 when connection 6 is low
|
|
|
|
DATA8 Updated[INPUTS];
|
|
|
|
DATA8 InDcm[INPUTS]; //!< Input port device types
|
|
DATA8 InConn[INPUTS];
|
|
|
|
DATA8 OutDcm[OUTPUTS]; //!< Output port device types
|
|
DATA8 OutConn[OUTPUTS];
|
|
#ifndef DISABLE_PREEMPTED_VM
|
|
UWORD PreemptMilliSeconds;
|
|
#endif
|
|
}
|
|
ANALOG;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
/*! \page UartModuleMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the uart values for use in userspace
|
|
* this pointer will point to a struct and the layout is following:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
#define UART_DATA_LENGTH MAX_DEVICE_DATALENGTH
|
|
#define UART_BUFFER_SIZE 64
|
|
|
|
typedef struct
|
|
{
|
|
TYPES TypeData[INPUTS][MAX_DEVICE_MODES]; //!< TypeData
|
|
|
|
#ifndef DISABLE_FAST_DATALOG_BUFFER
|
|
UWORD Repeat[INPUTS][DEVICE_LOGBUF_SIZE];
|
|
DATA8 Raw[INPUTS][DEVICE_LOGBUF_SIZE][UART_DATA_LENGTH]; //!< Raw value from UART device
|
|
UWORD Actual[INPUTS];
|
|
UWORD LogIn[INPUTS];
|
|
#else
|
|
DATA8 Raw[INPUTS][UART_DATA_LENGTH]; //!< Raw value from UART device
|
|
#endif
|
|
DATA8 Status[INPUTS]; //!< Status
|
|
DATA8 Output[INPUTS][UART_DATA_LENGTH]; //!< Bytes to UART device
|
|
DATA8 OutputLength[INPUTS];
|
|
}
|
|
UART;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
#define UART_PORT_CHANGED 0x01 //!< Input port changed
|
|
#define UART_DATA_READY 0x08 //!< Data is ready
|
|
#define UART_WRITE_REQUEST 0x10 //!< Write request
|
|
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Connection[INPUTS];
|
|
DATA8 Type[INPUTS];
|
|
DATA8 Mode[INPUTS];
|
|
}
|
|
DEVCON;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
TYPES TypeData;
|
|
DATA8 Port;
|
|
DATA8 Mode;
|
|
}
|
|
UARTCTL;
|
|
|
|
#define UART_SET_CONN _IOWR('u',0,DEVCON)
|
|
#define UART_READ_MODE_INFO _IOWR('u',1,UARTCTL)
|
|
#define UART_NACK_MODE_INFO _IOWR('u',2,UARTCTL)
|
|
#define UART_CLEAR_CHANGED _IOWR('u',3,UARTCTL)
|
|
|
|
|
|
/*! \page IicModuleMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the iic values for use in userspace
|
|
* this pointer will point to a struct and the layout is following:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
#define IIC_DATA_LENGTH MAX_DEVICE_DATALENGTH
|
|
#define IIC_NAME_LENGTH 8
|
|
|
|
typedef struct
|
|
{
|
|
TYPES TypeData[INPUTS][MAX_DEVICE_MODES]; //!< TypeData
|
|
|
|
#ifndef DISABLE_FAST_DATALOG_BUFFER
|
|
UWORD Repeat[INPUTS][DEVICE_LOGBUF_SIZE];
|
|
DATA8 Raw[INPUTS][DEVICE_LOGBUF_SIZE][IIC_DATA_LENGTH]; //!< Raw value from IIC device
|
|
UWORD Actual[INPUTS];
|
|
UWORD LogIn[INPUTS];
|
|
#else
|
|
DATA8 Raw[INPUTS][IIC_DATA_LENGTH]; //!< Raw value from IIC device
|
|
#endif
|
|
DATA8 Status[INPUTS]; //!< Status
|
|
DATA8 Changed[INPUTS];
|
|
DATA8 Output[INPUTS][IIC_DATA_LENGTH]; //!< Bytes to IIC device
|
|
DATA8 OutputLength[INPUTS];
|
|
}
|
|
IIC;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
#define IIC_PORT_CHANGED 0x01 //!< Input port changed
|
|
#define IIC_DATA_READY 0x08 //!< Data is ready
|
|
#define IIC_WRITE_REQUEST 0x10 //!< Write request
|
|
|
|
|
|
typedef struct
|
|
{
|
|
TYPES TypeData;
|
|
DATA8 Port;
|
|
DATA8 Mode;
|
|
}
|
|
IICCTL;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
RESULT Result;
|
|
DATA8 Port;
|
|
DATA8 Repeat;
|
|
DATA16 Time;
|
|
DATA8 WrLng;
|
|
DATA8 WrData[IIC_DATA_LENGTH];
|
|
DATA8 RdLng;
|
|
DATA8 RdData[IIC_DATA_LENGTH];
|
|
}
|
|
IICDAT;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Port;
|
|
DATA16 Time;
|
|
DATA8 Type;
|
|
DATA8 Mode;
|
|
DATA8 Manufacturer[IIC_NAME_LENGTH + 1];
|
|
DATA8 SensorType[IIC_NAME_LENGTH + 1];
|
|
DATA8 SetupLng;
|
|
ULONG SetupString;
|
|
DATA8 PollLng;
|
|
ULONG PollString;
|
|
DATA8 ReadLng;
|
|
}
|
|
IICSTR;
|
|
|
|
|
|
#define IIC_SET_CONN _IOWR('i',2,DEVCON)
|
|
#define IIC_READ_TYPE_INFO _IOWR('i',3,IICCTL)
|
|
#define IIC_SETUP _IOWR('i',5,IICDAT)
|
|
#define IIC_SET _IOWR('i',6,IICSTR)
|
|
|
|
|
|
|
|
|
|
#define TST_PIN_LENGTH 8
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Port;
|
|
DATA8 Length;
|
|
DATA8 String[TST_PIN_LENGTH + 1];
|
|
}
|
|
TSTPIN;
|
|
|
|
#define TST_PIN_ON _IOWR('t',1,TSTPIN)
|
|
#define TST_PIN_OFF _IOWR('t',2,TSTPIN)
|
|
#define TST_PIN_READ _IOWR('t',3,TSTPIN)
|
|
#define TST_PIN_WRITE _IOWR('t',4,TSTPIN)
|
|
|
|
|
|
|
|
|
|
#define TST_UART_LENGTH UART_BUFFER_SIZE
|
|
|
|
typedef struct
|
|
{
|
|
DATA32 Bitrate;
|
|
DATA8 Port;
|
|
DATA8 Length;
|
|
DATA8 String[TST_UART_LENGTH];
|
|
}
|
|
TSTUART;
|
|
|
|
#define TST_UART_ON _IOWR('t',5,TSTUART)
|
|
#define TST_UART_OFF _IOWR('t',6,TSTUART)
|
|
#define TST_UART_EN _IOWR('t',7,TSTUART)
|
|
#define TST_UART_DIS _IOWR('t',8,TSTUART)
|
|
#define TST_UART_READ _IOWR('t',9,TSTUART)
|
|
#define TST_UART_WRITE _IOWR('t',10,TSTUART)
|
|
|
|
|
|
|
|
|
|
/*! \page UiModuleMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the ui button states for use in userspace
|
|
* this pointer will point to a struct and the layout is following:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Pressed[BUTTONS]; //!< Pressed status
|
|
}
|
|
UI;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
#define LCD_BUFFER_SIZE (((LCD_WIDTH + 7) / 8) * LCD_HEIGHT)
|
|
#define LCD_TOPLINE_SIZE (((LCD_WIDTH + 7) / 8) * (TOPLINE_HEIGHT + 1))
|
|
|
|
|
|
/*! \page DisplayModuleMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the display memory for use in userspace
|
|
* this pointer will point to a frame buffer as follows:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
UBYTE Lcd[LCD_BUFFER_SIZE];
|
|
}
|
|
LCD;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
/*! \page SoundModuleMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the sound ready flag for use in userspace
|
|
* this pointer will point to a struct and the layout is following:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Status; //!< Status
|
|
}
|
|
SOUND;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
/*! \page UsbModuleMemory
|
|
*
|
|
* <b> Shared Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* It is possible to get a pointer to the USB Speed (FULL or HIGH) for use in userspace
|
|
* this pointer will point to a struct and the layout is following:
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
enum {
|
|
FULL_SPEED,
|
|
HIGH_SPEED
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Speed;
|
|
}
|
|
USB_SPEED;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
/*! \page VmNonvolatileMemory
|
|
*
|
|
* <b> VM non volatile Memory </b>
|
|
*
|
|
* <hr size="1"/>
|
|
*
|
|
* This struct will be loaded at start up and save when closing down VM
|
|
*
|
|
* \verbatim
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 VolumePercent; //!< System default volume [0..100%]
|
|
DATA8 SleepMinutes; //!< System sleep [0..120min] (0 = ~)
|
|
}
|
|
NONVOL;
|
|
|
|
/*\endverbatim
|
|
*
|
|
* \n
|
|
*/
|
|
|
|
|
|
/*
|
|
* Motor/OUTPUT Typedef
|
|
*/
|
|
typedef struct
|
|
{
|
|
SLONG TachoCounts;
|
|
SBYTE Speed;
|
|
SLONG TachoSensor;
|
|
}MOTORDATA;
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Cmd;
|
|
DATA8 Nos;
|
|
DATA8 Power;
|
|
DATA32 Step1;
|
|
DATA32 Step2;
|
|
DATA32 Step3;
|
|
DATA8 Brake;
|
|
} STEPPOWER;
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Cmd;
|
|
DATA8 Nos;
|
|
DATA8 Power;
|
|
DATA32 Time1;
|
|
DATA32 Time2;
|
|
DATA32 Time3;
|
|
DATA8 Brake;
|
|
} TIMEPOWER;
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Cmd;
|
|
DATA8 Nos;
|
|
DATA8 Speed;
|
|
DATA32 Step1;
|
|
DATA32 Step2;
|
|
DATA32 Step3;
|
|
DATA8 Brake;
|
|
} STEPSPEED;
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Cmd;
|
|
DATA8 Nos;
|
|
DATA8 Speed;
|
|
DATA32 Time1;
|
|
DATA32 Time2;
|
|
DATA32 Time3;
|
|
DATA8 Brake;
|
|
} TIMESPEED;
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Cmd;
|
|
DATA8 Nos;
|
|
DATA8 Speed;
|
|
DATA16 Turn;
|
|
DATA32 Step;
|
|
DATA8 Brake;
|
|
} STEPSYNC;
|
|
|
|
typedef struct
|
|
{
|
|
DATA8 Cmd;
|
|
DATA8 Nos;
|
|
DATA8 Speed;
|
|
DATA16 Turn;
|
|
DATA32 Time;
|
|
DATA8 Brake;
|
|
} TIMESYNC;
|
|
/*
|
|
* End of Motor/OUTPUT Typedef
|
|
*/
|
|
|
|
|
|
#define PRINTBUFFERSIZE 160
|
|
|
|
typedef struct
|
|
{
|
|
NONVOL NonVol;
|
|
DATA8 FirstProgram[MAX_FILENAME_SIZE];
|
|
|
|
char PrintBuffer[PRINTBUFFERSIZE + 1];
|
|
DATA8 TerminalEnabled;
|
|
|
|
PRGID FavouritePrg;
|
|
PRGID ProgramId; //!< Program id running
|
|
PRG Program[MAX_PROGRAMS]; //!< Program[0] is the UI byte codes running
|
|
|
|
|
|
ULONG InstrCnt; //!< Instruction counter (performance test)
|
|
IP pImage; //!< Pointer to start of image
|
|
GP pGlobal; //!< Pointer to start of global bytes
|
|
OBJHEAD* pObjHead; //!< Pointer to start of object headers
|
|
OBJ** pObjList; //!< Pointer to object pointer list
|
|
|
|
IP ObjectIp; //!< Working object Ip
|
|
LP ObjectLocal; //!< Working object locals
|
|
OBJID Objects; //!< No of objects in image
|
|
OBJID ObjectId; //!< Active object id
|
|
|
|
IP ObjIpSave;
|
|
GP ObjGlobalSave;
|
|
LP ObjLocalSave;
|
|
DSPSTAT DispatchStatusSave;
|
|
ULONG PrioritySave;
|
|
|
|
long TimerDataSec;
|
|
long TimerDatanSec;
|
|
|
|
UWORD Debug;
|
|
|
|
UWORD Test;
|
|
|
|
UWORD RefCount;
|
|
|
|
ULONG TimeuS;
|
|
|
|
ULONG OldTime1;
|
|
ULONG OldTime2;
|
|
ULONG NewTime;
|
|
#ifdef ENABLE_PERFORMANCE_TEST
|
|
ULONG PerformTimer;
|
|
DATAF PerformTime;
|
|
#endif
|
|
|
|
DSPSTAT DispatchStatus; //!< Dispatch status
|
|
ULONG Priority; //!< Object priority
|
|
|
|
ULONG Value;
|
|
HANDLER Handle;
|
|
|
|
ERR Errors[ERROR_BUFFER_SIZE];
|
|
UBYTE ErrorIn;
|
|
UBYTE ErrorOut;
|
|
|
|
DATA32 MemorySize;
|
|
DATA32 MemoryFree;
|
|
ULONG MemoryTimer;
|
|
|
|
#ifndef DISABLE_SDCARD_SUPPORT
|
|
DATA32 SdcardSize;
|
|
DATA32 SdcardFree;
|
|
ULONG SdcardTimer;
|
|
DATA8 SdcardOk;
|
|
#endif
|
|
|
|
#ifndef DISABLE_USBSTICK_SUPPORT
|
|
DATA32 UsbstickSize;
|
|
DATA32 UsbstickFree;
|
|
ULONG UsbstickTimer;
|
|
DATA8 UsbstickOk;
|
|
#endif
|
|
|
|
LCD LcdBuffer; //!< Copy of last LCD update
|
|
DATA8 LcdUpdated; //!< LCD updated
|
|
|
|
ANALOG Analog;
|
|
ANALOG *pAnalog;
|
|
int AdcFile;
|
|
|
|
#ifdef ENABLE_STATUS_TEST
|
|
DATA8 Status;
|
|
#endif
|
|
|
|
#ifdef ALLOW_DEBUG_PULSE
|
|
DATA8 PulseShow;
|
|
DATA8 Pulse;
|
|
#endif
|
|
|
|
#if (HARDWARE == SIMULATION)
|
|
class NXT * nxt;
|
|
#endif
|
|
}GLOBALS;
|
|
|
|
|
|
#if (HARDWARE == SIMULATION)
|
|
extern GLOBALS * gInstance;
|
|
#define VMInstance (*gInstance)
|
|
RESULT mSchedInit();
|
|
RESULT mSchedCtrl();
|
|
RESULT mSchedExit();
|
|
|
|
void setInstance(GLOBALS * _Instance);
|
|
GLOBALS * getInstance();
|
|
#else
|
|
extern GLOBALS VMInstance;
|
|
#endif
|
|
|
|
|
|
#endif /* LMS2012_H_ */
|