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字符数组数据
参数:
file:BMP_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声音文件。
参数:
file:WAV_DATA_START(WAV文件名) 宏必须被加上。
WAV文件名,不能包含扩展名(.wav)
length:WAV_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);
}
}
|
主页 |