nxtOSEK C API 函数参考

[Translated By Wang Zicheng(王至呈), Gong Han(龚瀚)]

LEGO MINDSTORMS NXT 系统架构

TOPPERS ATK API

ECRobot API
    伺服马达 API
    光感器 API
    触感器 API
    声感器 API
    超声波传感器 API
    I2C通信 API
    Bluetooth通信 API
    USB通信 API (2009/01 更新)
    液晶显示 API
    声音 API
    NXT内部关联 API
    HiTechnic 加速度传感器 API
    HiTechnic 陀螺仪传感器 API
    RCX传感器 API

nxtOSEK Hook routines

 

 

LEGO MINDSTORMS NXT系统结构:

下图是根据LEGO MINDSTORMS NXT Hardware Developer Kit所绘制的LEGO MINDSTORMS NXT系统架构示意图。

此图说明了除了超音波感测器及伺服马达转动所获得的值以外,还说明了ARM7 processor(ATMEL AT91SAM7S256)与感测/伺服马达之间是透过co-processor进行通信的。就nxtOSEK来说,要存取感测/伺服马达要透过I2C串连汇流排来与co-processor做通信。这个系统结构在nxtOSEK的软件运行环境里面有明显的影响。ARM7 processor经由LEJOS NXJ周期1毫秒的中断服务程序(ISR),每2毫秒分别读取感测器(读取感测器的A/D值)及伺服马达(设定PWM功率比及中断模式)。伺服马达的旋转值经由LEJOS NXJ的脉冲触发截取。而超声波传感器可以借由其他的I2C通道与ARM7 processor通信。

 

TOPPERS ATK API:

TOPPERS ATK是一个开源的 OSEK,兼容于以下OSEK版本。OSEK应用程序界面的相关资料文件在OSEK/VDX的网站可找到:
OSEK OS Version 2.2.1
OSEK OIL Version 2.5


nxtOSEK由于系统结构的关系限制了一些OSEK的功能,使用者无法使用ISR定义及中断API。如果你懂日文的话,在nxtOSEK\toppers_osek\doc资料夹下有用日文写的TOPPERS ATK详细资料。

 

ECRobot API:

ECRobot API是底层设备API及ECRobot封装 API所组成的,用它来控制应用程序,在下表中灰色字体的封装API与原本的l底层设备API有相同的功能,所以最好是用原始的设备API以缩短执行时间。当你使用ECRobot API时,你必须要在程式码里include ecrobot_interface.h


伺服马达的存取有一点复杂。NXT在ARM7与AVR之间使用I2C通信来设定马达的PWM值及终止模式。然而,ARM7可以立即得到马达内的运行参数值。

伺服马达 API
描述

int
nxt_motor_get_count(U32 n)

取得伺服马达的旋转角度

参数:
    n:NXT_PORT_A,NXT_PORT_B,NXT_PORT_C
返回值:
    伺服马达的旋转角度

void
nxt_motor_set_count(U32 n, int count)

设定伺服马达的旋转角度

参数:
    n:NXT_PORT_A,NXT_PORT_B,NXT_PORT_C
    count:伺服马达的旋转角度
返回值:
    无

void
nxt_motor_set_speed(U32 n, int speed_percent,
int brake)

设定伺服马达的PWM值及刹车模式。

参数:
    n:NXT_PORT_A,NXT_PORT_B,NXT_PORT_C
    speed_percent:-100~100
    brake:0(平滑停止不刹车),1(立即刹车)
返回值:
    无

S32
ecrobot_get_motor_rev(U8 port_id)

取得伺服马达的旋转角度(nxt_motor_get_count的一个封装函数)

参数:
    port_id:NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
返回值:
    伺服马达的旋转角度

void
ecrobot_set_motor_speed(U8 port_id, S8 speed)

设定伺服马达的PWM值
(nxt_motor_set_speed的封装函数。但是刹车模式被固定为立即刹车)

参数:
    port_id:NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
    speed:-100~100
返回值:
    无

void
ecrobot_set_motor_mode_speed(U8 port_id,
S32 mode, S8 speed)

设定伺服马达的PWM值和刹车模式
(封装自nxt_motor_set_speed)

参数:
    n:NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
    speed_percent:-100~100
    brake:0(平滑停止不刹车), 1(立即刹车)
返回值:
    无


NXT在ARM7与AVR之间是使用I2C通信来存取光感器。AVR使用10位 A/D转换来取得光感器数据。

光感器API
描述

void
ecrobot_set_light_sensor_active(U8 port_id)

打开光感器的LED红光。若要使用有光模式,这个函数必须在设备初始化hook routine中先执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无

void
ecrobot_set_light_sensor_inactive(U8 port_id)

关闭LED红光。若要使用无光模式,这个函数必须在设备初始化hook routine中先执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无

U16
ecrobot_get_light_sensor(U8 port_id)

取得光感器的A/D数据,值越大表示越暗(或者反射越少)

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    0~1023


NXT在ARM7与AVR之间使用I2C通信来存取触碰传感器。AVR使用10位 A/D 转换来取得触碰感测器的数据。在ecrobot_get_touch_sensor API里,A/D data将被转换为0/1。

触碰传感器 API
描述

U8
ecrobot_get_touch_sensor(U8 port_id)

取得触碰传感器的状态

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    0(非接触), 1(接触)


NXT在ARM7与AVR之间使用I2C通信来存取声音感测器,AVR使用10位 A/D 转换来取得声音传感器的数据。

声音传感器API
描述

U16
ecrobot_get_sound_sensor(U8 port_id)

取得声音传感器的A/D数据. 值越小表示越大声。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    0~1023


超声波传感器可以经由I2C的其他通信通道来跟ARM7通信。ecrobot_get_sonar_sensor传送一个通信协议的数据来与超声波传感器通信。然而,ARM7与超声波传感器之间是经由这个函数调用所触发的ISR来进行通信,所以在抓取信号时会有周期延迟。

超声波传感器API
描述

void
ecrobot_init_sonar_sensor(U8 port_id)

初始化超声波传感器这个函数必须在设备初始化hook routine中先执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    

S32
ecrobot_get_sonar_sensor(U8 port_id)

通过I2C取得超声波传感器的测量值[cm]。。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    -1~255 (-1:表示设备还没有准备好测量)

void
ecrobot_term_sonar_sensor(U8 port_id)

终止超声波传感器的I2C通信。这个函数必须在设备终止hook routine中最后执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无

I2C通信 API
描述

void
ecrobot_init_i2c(U8 port_id U8 type)

初始化NXT传感器端口的I2C通信这个函数必须在设备初始化hook routine中先执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    type:LOWSPEED_9V/LOWSPEED
返回值:
    无

SINT
ecrobot_send_i2c(U8 port_id, U32 address,
SINT i2c_reg, U8 *buf, U32 len)

传输I2C数据。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    address:I2C通信地址 (0x01 ~ 0x7F)
    注意地址不像一些I2C设备规格一样是偶数(0x02 ~ 0xFE)。它们是7位地址而不是8位地址。
    i2c_reg:I2C寄存器地址 (例, 0x42)
    buf:数据传送缓存
    len:数据长度
返回值:
    1(发送成功) / 0(发送失败)

SINT
ecrobot_read_i2c(U8 port_id, U32 address,
SINT i2c_reg, U8 *buf, U32 len)

读取I2C数据。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    address:I2C通信地址 (0x01 ~ 0x7F)
    i2c_reg:I2C寄存器地址 (例, 0x42)
    buf:数据接收缓存
    len:数据长度
返回值:
    1(接收成功) / 0(接收失败)

void
ecrobot_term_i2c(U8 port_id)

终止NXT传感器端口的I2c通讯。这个函数必须在设备终止hook routine中最后执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无


在NXT里面有一个蓝牙芯片用来操作蓝牙通讯。ARM7使用UART与蓝牙芯片通讯。在LEGO MINDSTORMS NXT Bluetooth Developer Kit里,标准的LEGO固件可支持很多的通讯协议,不过,ECRobot API并没有支持全部的LEGO标准通讯协议。
- 在NXT连接PC蓝牙通信的情况下,有一个windows应用和程序NXT GamePad 可以用来遥控NXT,并记录NXT内部运行情况。
- 对于NXT-NXT蓝牙通信,只支持一台NXT连接一台NXT。蓝牙连接的配置需要在程序内设置

Bluetooth通信API
描述
void
ecrobot_init_bt_master(const U8 *bd_addr,
const CHAR *pin)

初始化NXT为蓝牙通信的主设备,并且建立和NXT从设备的连接。蓝牙设备地址(BD_ADDR)是48位的,NXT需要额外的8位(总共7字节),所以最后的8位必须都是0x00.这个API需要在一个循环中执行(比如ecrobot_device_initialize这个hook routine或者一个后台任务)。

参数:
    bd_addr: NXT从设备蓝牙地址
例如,如果从NXT设备的蓝牙地址是00:16:53:04:F1:B3,那么bd_addr要定义为:
const U8 bd_addr[7] = {0x00,0x16,0x53,0x04,0xF1,0xB3,0x00};
    pin:通信密码字符串(最大16字节)
返回值:
    无

void
ecrobot_init_bt_slave(const CHAR *pin)
初始化NXT为蓝牙的从设备,并连接和主设备的连接(PC或者主NXT)。这个API需要在一个循环中执行(比如ecrobot_device_initialize这个hook routine或者一个后台任务)。

参数:
    pin:通信密码字符串(最大16字节)
返回值:
    无

void
ecrobot_init_bt_connection(void)

初始化蓝牙设备并建立和PC的连接。用于连接的PINCODE是预定义为"MATLAB"。这个API需要在一个循环中执行(比如ecrobot_device_initialize这个hook routine或者一个后台任务)。

参数:
    
返回值:
    无
SINT
ecrobot_get_bt_status(void)

取得蓝牙设备的状态。若要和其他设备通信,蓝牙设备的状态必须为BT_STREAM

参数:
    无
返回值:
    
Bluetooth设备状态
        BT_NO_INIT (未初始化状态)
        BT_INITIALIZED (初初始化状态)
        BT_CONNECTED (通过配对已连接状态)
        BT_STREAM (已准备好 读取/发送 数据状态)

U32
ecrobot_send_bt_packet(U8 *buf, U32 bufLen)

发送数据封包到蓝牙设备(PC,主/从 NXT)。

参数:
    buf: 蓝牙发送数据包
    bufLen:数据包大小(最大 254字节)
返回值:
    被发送到蓝牙芯片的数据包字节数量

U32
ecrobot_read_bt_packet(U8 *buf, U32 bufLen)

从蓝牙设备接收数据封包(PC,主/从NXT)

参数:
    buf:蓝牙接收数据封包
    bufLen:封包大小(最大 254字节)
返回值:
    接收到蓝牙芯片的数据包字节数量

void
ecrobot_term_bt_connection(void)

停止蓝牙连接(PC,主/从NXT)

参数:
    
返回值:
    无

void
ecrobot_bt_data_logger(S8 data1, S8 data2)

发送预置的NXT内部状态数据。数据包大小被限制在32字节内,并且下列的NXT内部状态数据默认已经发送到PC。这个API是为NXT GamePad设计的,并且NXT GamePad将把所有数据存到一个CSV文件中。

数据包    0-3字节:系统时钟[毫秒], 数据类型 U32
数据包       4字节:数据1, 数据类型 S8
数据包       5字节:数据2, 数据类型 S8
数据包    6-7字节:电池电压[毫伏], 数据类型 U16
数据包  8-11字节:马达旋转角度[端口A], 数据类型 S32
数据包12-15字节:马达旋转角度[端口B], 数据类型 S32
数据包16-19字节:马达旋转角度[端口C], 数据类型 S32
数据包20-21字节:传感器感应数值[端口S1], 数据类型 S16
数据包22-23字节:传感器感应数值[端口S2], 数据类型 S16
数据包24-25字节:传感器感应数值[端口S3], 数据类型 S16
数据包26-27字节:传感器感应数值[端口S4], 数据类型 S16
数据包28-31字节:超声波传感器感应数值, 数据类型 S32

参数:
    data1:用户自定义数据1 (例, 左模拟输入摇杆值)
    data2:用户自定义数据2 (例, 右模拟输入摇杆值)
返回值:
    无

nxtOSEK使用LibUsb和LibNXT作为USB的主要应用程序。在samples文件夹内,有usbtest和usbhost两个样例程序可供参考,不过现在USB只能进行一台NXT对一台电脑的通讯。

2009/01:新版本的nxtOSEK v2.05使用了LEGO Fantom 驱动,用于使USB主机程序和USB通信协议变得更加一致(比如:明确的连接/断开),并且对功能进行了扩展(比如: 相对于先前的版本,多NXT连接一个主机)。欲了解关于nxtOSEK USB API的更多信息,请查看 samples\usbtest 目录。主机端编程,请查看 samples\usbtest\usbhost 目录。

USB通信API
描述

void
ecrobot_init_usb(void)

初始化NXT的USB通信。这个函数可以被包含在ecrobot_device_initialize这个hool routine和程序运行过程中。

参数:
    
返回值:
    无

SINT
ecrobot_set_name_usb(U8* name)

设置NXT的名称。默认情况下,"nxt"的设备名称是 ecrobot_init_usb函数参数中所指定的。

参数:
    name:NXT的设备名称(最大字符长度16)
返回值:
    1(成功)/0(失败)

U8
ecrobot_process1ms_usb(void)

USB 进程句柄,用于和主机建立连接。 这个函数必须每毫秒被调用一次。 (比如:一个1毫秒等待周期的循环,或者是一个 OSEK/JSP 1毫秒周期任务)

参数:
    
返回值:
    USB状态(USB_NO_INIT/USB_INIT/USB_CONNECTED)

SINT
ecrobot_read_usb(U8 *buf, U32 len)

从主机接收USB数据。

参数:
    buf:数据缓存
    len:数据大小(最大64 字节)
返回值:
    已读取的数据数量(字节)

SINT
ecrobot_send_usb(U8 *buf, U32 len)

发送USB数据到主机。

参数:
    buf:数据缓存
    len:数据缓存大小 (最大64 字节)
返回值:
    已发送的数据数量(字节)

SINT
ecrobot_disconnect_usb(void)

断开和当前主机端的连接。这个API函数实现了在程序中设置 连接/断开 顺序。这个函数默认了USB设备名称,所以它需要调用ecrobot_set_name_usb来自定义设备名称。

参数:
    
返回值:
    1(成功)/0(失败)

void
ecrobot_term_usb(void)

停止NXT的USB通信。

参数:
    
返回值:
    无

nxtOSEK支持黑白画面的BMP图片,用户可以在电脑上自行设计BMP图片,并将它置于NXT中显示。GCC可以连结BMP文件并转成nxtOSEK支持的格式。在samples文件夹内有两个BMP文件的范例(anime和bmptest)。

液晶屏幕显示API
描述

SINT
ecrobot_bmp2lcd(const CHAR *file, U8 *lcd,
S32 width, S32 height)

将黑白的BMP文件转换为BMP字符数组数据

参数:
    fileBMP_DATA_START(BMP文件名)宏必须加上。
    BMP文件名不能包含扩展名(.bmp)。
    lcd:LCD数组缓存(最大数据大小为800)
    width:LCD数组宽,单位bit(最大100)
    height:LCD数组高,单位bit (最大64)
返回值:
    1:BMP文件转换成功
    0:BMP文件转换失败

void
display_bitmap_copy(const U8 *data, U32 width,
U32 depth, U32 x, U32 y)

在LCD上显示BMP图片,依据数组数据。

参数:
    data:BMP数组数据的起始地址。
    width:LCD数组宽,单位bit(最大100)
    depth:LCD数组高,单位bit(最大8)
    x:BMP数组数据水平位置,单位bit(0 - 100)
    y:BMP数组数据垂直位置,单位bit(0 - 8)
返回值:
    无

void
display_update(void)

更新LCD显示。

参数:
    
返回值:
    无

void
display_clear(U32 updateToo)

LCD清屏。

参数:
    updateToo:0 (表示在清屏后没有更新LCD显示), 1(表示在清屏后更新了LCD显示)
返回值:
    无

void
display_goto_xy(int x, int y)

设定文字在LCD上的显示位置。左上角为(0, 0)

参数:
    x:水平方向位置 (0 - 15)
    y:垂直方向位置 (0 - 7)
返回值:
    无

void
display_string(const char *str)

在LCD上显示字符串。

参数:
    str:支持ASCII字符(范围:0x00~0x7F)
返回值:
    无

void
display_hex(U32 val, U32 places)

在LCD上显示整数(16进制)

参数:
    val:显示的整数
    places:数字显示的保留宽度
返回值:
    无

void
display_unsigned(U32 val, U32 places)

在LCD上显示无符号整数。

参数:
    val:显示的无符号整数
    places:数字显示的保留宽度
返回值:
    无

void
display_int(int val, U32 places)

在LCD上显示有符号整数。

参数:
    val:显示的有符号整数
    places:数字显示的保留宽度
返回值:
    无

void
ecrobot_status_monitor(const CHAR *target_name)

显示NXT的内部运行状态:
用户自定义字符串
系统时钟[秒]
电压[毫伏]
马达转动角度(A/B/C) [度]
A/D原始数据(S1/S2/S3/S4)
Bluetooth通信状态(1:已连接, 0:未连接)
超声波传感器数据[cm]

建议在程序中设置一个低周期任务包含这个函数(例, 500毫秒周期)。

参数:
    target_name:用户自定义字符串
返回值:
    无

nxtOSEK支持播放8bit单声道的PCM WAV文件,WAV文件的声音可以即时地在NXT内播放。GCC可以连结W毫伏文件并转成nxtOSEK支持的格式。在samples文件夹内有一个播放BMP文件的范例(wavtest)。

声音API
描述

SINT
ecrobot_sound_tone(U32 freq, U32 ms, U32 vol)

播放一个音调。32Hz到2100Hz的频率是人可以听到的。持续时间参数的单位是分秒(百分之一秒)而不是毫秒,只能被截取到256,所以一个音调的最大持续时间是2.56秒。

参数:
    freq:音调的频率[Hz]。31Hz - 2100Hz
    ms
:持续时间[单位10毫秒]。最大256 (= 2.56sec)
    vol:音量(0 - 100)。 0表示静音。
返回值:
    1:表示成功播放音调。

SINT
ecrobot_sound_wav(const CHAR *file, U32 length,
S32 freq, U32 vol)

播放8bit单声道PCM WAV声音文件。

参数:
    fileWAV_DATA_START(WAV文件名) 宏必须被加上。
    WAV文件名,不能包含扩展名(.wav)
    lengthWAV_DATA_SIZE(WAV文件名) 宏必须被加上。
    
WAV文件名,不能包含扩展名(.wav)
    freq:采样频率[Hz]。 范围:2000Hz - 22050Hz。 -1:使用WAV文件原始的采样频率。
    vol
音量(0 - 100)。 0表示静音。
返回值
    1:成功发声
    0:声音资源忙
    -1:不支持播放此文件

void
sound_freq(U32 freq, U32 ms)

播放一个音调。32Hz到2100Hz的频率是人可以听到的。持续时间参数的单位是分秒(百分之一秒)而不是毫秒,只能被截取到256,所以一个音调的最大持续时间是2.56秒。

参数:
    freq:音调的频率[Hz]。31Hz - 2100Hz
    ms
:持续时间[单位10毫秒]。最大256 (= 2.56sec)
返回值:
    1:表示成功播放音调。


NXT内部关联API、电压测定、系统时钟相关函数(单位:毫秒)。

NXT内部关联API
描述
U8
ecrobot_is_ENTER_button_pressed(void)
返回ENTER按键的状态。

参数:
    
返回值:
    ENTER (ENTR)按键的状态
    
1:按键有按下
    0:按键没按下

U8
ecrobot_is_RUN_button_pressed(void)

返回RUN按键的状态。

参数:
    
返回值:
    
RUN按键的状态
    1:按键有按下
    0:按键没按下

U16
ecrobot_get_battery_voltage(void)

取得电池电压[毫伏]

参数:
    
返回值:
    电池电压 (例, 9000 = 9.000V)

U32
systick_get_ms(void)

取得系统时钟值[毫秒]。当NXT打开后,系统时钟开始计时(不是从一个程序开始执行时)。

参数:
    
返回值:
    系统时钟值[毫秒]

U32
ecrobot_get_systick_ms(void)

取得系统时钟值[毫秒]。(封装自systick_get_ms函数)

参数:
    
返回值:
    系统时钟值[毫秒]

void
systick_wait_ms(U32 ms)

程序停留等待指定的时间[毫秒]

参数:
    ms:等待時間[毫秒]
返回值:
    


HiTechnic加速度传感器(NAC1040)NXT可以经由HiTechnic加速度传感器 (NAC1040)量得三轴的加速度并经由I2C通信。然而,ARM7和加速规之间是经由一个函数回调所触发的ISR(中断服务程序)来进行通信,所以在抓取信号时会有周期延迟。根据HiTechnic的信息,加速规的采样频率,约每秒100次,测量的加速度范围在+2g到-2g之间,缩放比约为200次每g。关于更多加速规的详细资料请至HiTechnic官方站点参考。

HiTechnic加速度传感器API
描述

void
ecrobot_init_accel_sensor(U8 port_id)

为加速度传感器初始化一个端口作为I2C的通信端口。这个函数必须在设备初始化hook routine中执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无

void
ecrobot_get_accel_sensor(U8 port_id, S16 *buf)

取得三轴的加速度。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    buf:三轴的加速度 (buf[0]:x轴, buf[1]:y轴, buf[2]:z轴)

返回值:
    无

void
ecrobot_term_accel_sensorr(U8 port_id)

终止加速度传感器的I2C通信。这个函数必须在设备终止hook routine中执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无


HiTechnic陀螺仪传感器NXT借由I2C与ARM7之间的的通讯来读取HiTechnic 陀螺仪(NGY1044)的测量值。AVR使用10位 A/D转换来取得陀螺仪的数据。根据HiTechnic的信息,陀螺仪每秒可量测+/- 360°的旋转,而且约每秒可读取300次的角速度。关于更多陀螺仪的详细资料请至HiTechnic官方站点参考。

HiTechnic陀螺仪传感器API
描述

U16
ecrobot_get_gyro_sensor(U8 port_id)

得到陀螺仪传感器的原始A/D数据。这个传感器数据有一个平衡值(大约600)

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无


RCX有源传感器(例, 光感器)。RCX有源传感器的API也可以被其他的RCX有源传感器使用(尚未全部测试)。

RCX有源传感器API
描述

void
ecrobot_set_RCX_power_source(U8 port_id)

提供电源给RCX有源传感器。这个函数必须在设备初始化hook routine中执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无

S16
ecrobot_get_RCX_sensor(U8 port_id)

取得RCX有源传感器的原始A/D数据

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    RCX有源传感器的原始A/D数据

void
ecrobot_term_RCX_power_source(U8 port_id)

停止RCX有源传感器的电源供应。这个函数必须在设备终止hook routine中执行。

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    无


RCX Touch Sensor兼容NXT A/D Sensors,比如NXT Touch Sensor。这个API只差别在分辨RCX/NXT Touch Sensors ( ecrobot_get_touch_sensor指令也可以用来存取RCX Touch Sensor)。

RCX触碰传感器API
描述

U8
ecrobot_get_RCX_touch_sensor(U8 port_id)

取得触碰传感器状态

参数:
    port_id:NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
返回值:
    0(非接触), 1(接触)

 

nxtOSEK Hook Routines:

nxtOSEK 提供给用户3个 hook routine. 这些hook routine必须在源码里定义。NXTway sample的ecrobot_main.c 这个文件能够让你了解如何去使用这些hook routine.

  • void ecrobot_device_initialize(void)这个hook rontine在nxtOSEK启动时被调用,用户可以在这里放置设备初始化函数。

void ecrobot_device_initialize(void)
{
    /* Initialize ECRobot used devices */
    ecrobot_set_light_sensor_active(NXT_PORT_S1);
    ecrobot_set_light_sensor_active(NXT_PORT_S3);
    ecrobot_init_sonar_sensor(NXT_PORT_S2);
    ecrobot_init_bt_connection();
}

  • void ecrobot_device_terminate(void)这个hook rontine在nxtOSEK程序终止时(按下STOP或者EXIT按键)被调用,用户可以在这里放置设备终止运作的函数。

void ecrobot_device_terminate(void)
{
    /* Terminate ECRobot used devices */
    ecrobot_set_light_sensor_inactive(NXT_PORT_S1);
    ecrobot_set_light_sensor_inactive(NXT_PORT_S3);
    ecrobot_set_motor_speed(NXT_PORT_B, 0);
    ecrobot_set_motor_speed(NXT_PORT_C, 0);
    ecrobot_term_sonar_sensor(NXT_PORT_S2);
    ecrobot_term_bt_connection();
}

  • void user_1ms_isr_type2(void):这个hook routine每毫秒被调用一次,是第二类ISR(中断服务程序)。从样例中我们看到,用户可以使用OSEK Alarm counter在这个hook routine中进行单调速率调度。

#include "kernel.h"
#include "kernel_id.h"

void user_1ms_isr_type2(void)
{
    StatusType ercd;

    /* Increment System Timer Count */
    ercd = SignalCounter(SysTimerCnt);
    if (ercd != E_OK)
    {
        ShutdownOS(ercd);
    }
}

 

 

 

主页