📄 icanobja.c51
字号:
can_obj_buf[nbr_of_obj].task_bind = NO_BIND;
can_obj_buf[nbr_of_obj].obj_read = TRUE;
can_obj_buf[nbr_of_obj].contr_adr =
CONTR_BUF_START_ADR + (nbr_of_obj - 1) * MESSAGE_SIZE;
c_init_obj (identifier,
data_length,
obj_typ,
can_obj_buf[nbr_of_obj].contr_adr,
FALSE); /* 0 for extended */
return C_OK;
}
else {
/* Objekt existiert schon */
return C_OBJ_ERROR;
}
}
/*---------------------------------------------------------------------*
* C _ D E F I N E _ L _ O B J
*---------------------------------------------------------------------*
* Funktion:
* Definiert 15. Objekt im Objekt-Buffer
* resultierende Akzeptanz-Maske
*
*---------------------------------------------------------------------*
* Parameter:
*
* mask_15 : 15. Obj Mask
* data_length : Anzahl Datenbytes des zu definierenden
* Objektes (0..8)
*
* Returnwert : OK, OBJ_ERROR, TOO_LONG
*
*---------------------------------------------------------------------*/
byte c_define_l_obj (unsigned long mask_15,
byte data_length
)
{
if (mask_15 > MAX_OBJECT_IDENT) return C_OBJ_ERROR;
if (can_obj_buf[MAX_OBJECTS].identifier == 0) {
can_obj_buf[MAX_OBJECTS].identifier = mask_15;
can_obj_buf[MAX_OBJECTS].obj_typ = D_REC;
can_obj_buf[MAX_OBJECTS].standart = TRUE;
can_obj_buf[MAX_OBJECTS].data_length = data_length;
can_obj_buf[MAX_OBJECTS].task_bind = NO_BIND;
can_obj_buf[MAX_OBJECTS].obj_read = TRUE;
can_obj_buf[MAX_OBJECTS].contr_adr =
CONTR_BUF_START_ADR + (MAX_OBJECTS -1 ) * MESSAGE_SIZE ;
c_init_obj (mask_15,
data_length,
D_REC,
can_obj_buf[MAX_OBJECTS].contr_adr,
TRUE); /* 1 for standart */
return C_OK;
}
else {
/* Objekt existiert schon */
return C_OBJ_ERROR;
}
}
/*---------------------------------------------------------------------*
* C _ D E F I N E _ L _ O B J _ E X T
*---------------------------------------------------------------------*
* Funktion:
* Definiert 15. Objekt im Objekt-Buffer
*
*---------------------------------------------------------------------*
* Parameter:
*
* mask_15 : 15. Obj Mask
* data_length : Anzahl Datenbytes des zu definierenden
* Objektes (0..8)
*
* Returnwert : OK, OBJ_ERROR, TOO_LONG
*
*---------------------------------------------------------------------*/
byte c_define_l_obj_ext (unsigned long mask_15,
byte data_length
)
{
if (mask_15 > MAX_OBJECT_IDENT_EXT) return C_OBJ_ERROR;
if (can_obj_buf[MAX_OBJECTS].identifier == 0) {
can_obj_buf[MAX_OBJECTS].identifier = mask_15;
can_obj_buf[MAX_OBJECTS].obj_typ = D_REC;
can_obj_buf[MAX_OBJECTS].standart = TRUE;
can_obj_buf[MAX_OBJECTS].data_length = data_length;
can_obj_buf[MAX_OBJECTS].task_bind = NO_BIND;
can_obj_buf[MAX_OBJECTS].obj_read = TRUE;
can_obj_buf[MAX_OBJECTS].contr_adr =
CONTR_BUF_START_ADR + (MAX_OBJECTS -1 ) * MESSAGE_SIZE ;
c_init_obj (mask_15,
data_length,
D_REC,
can_obj_buf[MAX_OBJECTS].contr_adr,
FALSE ); /* 0 for extended */
return C_OK;
}
else {
/* Objekt existiert schon */
return C_OBJ_ERROR;
}
}
#pragma eject
/*---------------------------------------------------------------------*
* Zugriffsfunktionen *
*---------------------------------------------------------------------*/
/* Die Applikation benutzt die Objekt-Identifikation f乺 den Zugriff */
/* auf ein bestimmtes Objekt. Intern wird jedoch nur der Index eines */
/* bestimmten Objektes innerhalb des Objektbuffers zum Zugriff */
/* benutzt. Mit den Prozeduren C_GET_INDEX und C_GET_IDENT */
/* kann der Index resp. die Identifikation eines bestimmten Objektes */
/* ermittelt werden. */
/* */
/* Die jeweiligen Zugriffsprozeduren testen aus Zeitgr乶den jeweils */
/* nicht mehr ob ein bestimmter Index tats刢hlich einem definierten */
/* Objekt entspricht ! */
/*---------------------------------------------------------------------*
* C _ G E T _ I N D E X _ F R O M _ I D E N T
*---------------------------------------------------------------------*
* Funktion:
* Testet ob das Objekt IDENTIFIER im Objekt-Buffer definiert ist
* und gibt den entsprechenden Index innerhalb CAN_OBJ_BUF zur乧k.
*
*---------------------------------------------------------------------*
* Parameter:
*
* identifier : Identifikation des gesuchten Objektes
*
* Returnwert : 0 --> Das Objekt IDENTIFIER existiert
* nicht
* 1 .. 14 --> Index des Objektes IDENTIFIER
*
*---------------------------------------------------------------------*/
byte c_get_index_from_ident (unsigned long identifier)
{
byte i, temp;
temp = nbr_of_obj;
for (i=1; i<=temp; i++) {
if (can_obj_buf[i].identifier == identifier) return i;
}
return 0;
}
/*---------------------------------------------------------------------*
* C _ G E T _ I D E N T
*---------------------------------------------------------------------*
* Funktion:
* Gibt den Identifier des Objektes mit dem INDEX innerhalb
* CAN_OBJ_BUF zur乧k.
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des gesuchten Objektes(1..14)
*
* Returnwert : Identifikation des gew乶schten Objektes
* FFFFFFFFH -> Objekt existiert nicht
* oder 15. Objekt
*---------------------------------------------------------------------*/
unsigned long c_get_ident (byte index)
{
if ((index == 0) || (index > nbr_of_obj)) return 0xffffffff;
return can_obj_buf[index].identifier;
}
/*---------------------------------------------------------------------*
* C _ G E T _ R E C _ B I N D
*---------------------------------------------------------------------*
* Funktion:
* Gibt den Index eines neu empfangenen und noch nicht von der
* Applikation gelesenen Objektes, das fest an den Task TASK_ID
* gebunden ist, zur乧k.
*
*---------------------------------------------------------------------*
* Parameter:
*
* task_id : Task-Identifikation des Tasks an den das Objekt
* gebunden ist
*
* Returnwert : 0 --> Es existiert kein gew乶schtes Objekt
* 1 .. 15 --> Index des Objektes
*
*---------------------------------------------------------------------*/
byte c_get_rec_bind (byte task_id)
{
byte i, ind;
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
ind = bind_index_list[i];
if (ind != 0) {
if (can_obj_buf[ind].task_bind == task_id) {
if (!(can_obj_buf[ind].obj_read)) {
return ind;
}
}
}
}
return 0;
}
/*---------------------------------------------------------------------*
* C _ G E T _ O B J _ T Y P
*---------------------------------------------------------------------*
* Funktion:
* Gibt den Objekttyp wie in C_DEFINE_OBJ definiert des Objektes
* INDEX zur乧k.
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objektes innerhalb CAN_OBJ_BUF dessen
* Typ gelesen werden soll
*
* Returnwert : Objekttyp des Objektes INDEX
*
*---------------------------------------------------------------------*/
byte c_get_obj_typ (byte index)
{
return can_obj_buf[index].obj_typ;
}
/*---------------------------------------------------------------------*
* C _ W R I T E _ D A T A
*---------------------------------------------------------------------*
* Funktion:
* Schreiben von Daten aus dem Array ARR in das Objekt mit INDEX
* im Objekt-Buffer.
* Es werden soviele Datenbytes geschrieben wie DATA_LENGTH
* des entsprechenden Objektes angibt.
* Die Daten werden nur in das Objekt geschrieben, sie werden
* nicht gesendet.
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objektes innerhalb OBJ_BUF in das
* geschrieben werden soll
*
* arr : Zu schreibende Daten
*
*---------------------------------------------------------------------*/
void c_write_data (byte index,
byte xdata *arr)
{
byte temp;
if (can_obj_buf[index].data_length > 0) {
/* Der Returnwert der Funktion wird nicht ausgewertet */
/* Nur f乺 interne Testzwecke */
temp = c_write_obj (can_obj_buf[index].contr_adr, arr);
}
}
/*---------------------------------------------------------------------*
* C _ R E A D _ D A T A
*---------------------------------------------------------------------*
* Funktion:
* Lesen der Daten des Objektes INDEX im Objekt-Buffer. Es werden
* soviele Daten gelesen, wie DATA_LENGTH des entsprechenden
* Objektes angibt.
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objektes in OBJ_BUF aus dem gelesen
* werden soll.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -