📄 icandrv.c51
字号:
case CAN_STOP_ORDER:
c_stop ();
can_stopped = TRUE;
break;
case CAN_START_ORDER:
/* Alle Objekte im Objekt-Buffer als gelesen markieren */
/* zum Erreichen eines definierten Anfangszustandes */
c_set_all_read ();
c_start ();
can_stopped = FALSE;
if (c_get_status() == bus_off) {
/* wenn der CAN-Controller bereits nach dem Starten im */
/* Bus-Off Zustand ist, ist etwas schief gelaufen */
c_get_back (C_CAN_FAILURE);
return;
}
break;
case CAN_SEND_ORDER:
if (c_get_status() == bus_off) {
c_get_back (C_BUS_OFF);
return;
}
/* Pointer auf das Datenfeld initialisieren */
po.short_ptr.offs[0] = c_order_buf.param[0];
po.short_ptr.offs[1] = c_order_buf.param[1];
/* ident = *po.l_ptr */
temp_0 = c_get_index_from_ident (*po.l_ptr);
if (temp_0 == 0) {
c_get_back (C_OBJ_ERROR);
return;
}
temp_1 = c_get_obj_typ (temp_0);
if ((temp_1 != D_SEND) && (temp_1 != D_SEND_R_REC)) {
c_get_back (C_OBJ_ERROR);
return;
}
done = c_transmit_obj (temp_0, /* obj index */
po.c_ptr+4 /* pointer to datas */
);
if (done==FALSE) {
c_get_back (C_SEND_ERROR);
return;
}
break;
case CAN_REQUEST_ORDER:
if (c_get_status() == bus_off) {
c_get_back (C_BUS_OFF);
return;
}
/* identifier */
qq.tb[0] = c_order_buf.param[0]; /* ident */
qq.tb[1] = c_order_buf.param[1];
qq.tb[2] = c_order_buf.param[2];
qq.tb[3] = c_order_buf.param[3];
temp_0 = c_get_index_from_ident (qq.tl);
if (temp_0 == 0) {
c_get_back (C_OBJ_ERROR);
return;
}
temp_1 = c_get_obj_typ (temp_0);
if (temp_1 != D_REC_R_SEND) {
c_get_back (C_OBJ_ERROR);
return;
}
done = c_send_remote (temp_0);
if (done==FALSE) {
c_get_back (C_SEND_ERROR);
return;
}
break;
case CAN_BIND_OBJ_ORDER:
/* identifier */
qq.tb[0] = c_order_buf.param[0]; /* ident */
qq.tb[1] = c_order_buf.param[1];
qq.tb[2] = c_order_buf.param[2];
qq.tb[3] = c_order_buf.param[3];
temp_0 = c_get_index_from_ident (qq.tl);
if (temp_0 == 0) {
c_get_back (C_OBJ_ERROR);
return;
}
temp_1 = c_get_bind (temp_0);
done = c_set_bind (temp_0, /* obj index */
c_order_buf.param[4] /* task ID */
);
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if ((signal_ok[i].task_id == NO_BIND)
|| (signal_ok[i].task_id == c_order_buf.param[4])) {
signal_ok[i].task_id = c_order_buf.param[4];
signal_ok[i].task_waits = FALSE;
break;
}
}
if (done == FALSE) {
c_get_back (C_MEM_FULL);
return;
}
if (temp_1 != NO_BIND) {
/* Objekt war schon an Task gebunden */
c_get_back (C_OBJ_REBIND);
return;
}
break;
case CAN_UNBIND_OBJ_ORDER:
/* identifier */
qq.tb[0] = c_order_buf.param[0]; /* ident */
qq.tb[1] = c_order_buf.param[1];
qq.tb[2] = c_order_buf.param[2];
qq.tb[3] = c_order_buf.param[3];
temp_0 = c_get_index_from_ident (qq.tl);
if (temp_0 == 0) {
c_get_back (C_OBJ_ERROR);
return;
}
temp_1 = c_get_bind(temp_0);
c_clear_bind (temp_0);
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if (signal_ok[i].task_id == temp_1) {
signal_ok[i].task_id = NO_BIND;
signal_ok[i].task_waits = FALSE;
break;
}
}
break;
case CAN_BIND_L_OBJ_ORDER:
temp_0 = 15; /* last obj index */
temp_1 = c_get_bind (temp_0);
done = c_set_bind (temp_0, /* obj index */
c_order_buf.param[1] /* task ID */
);
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if ((signal_ok[i].task_id == NO_BIND)
|| (signal_ok[i].task_id == c_order_buf.param[1])) {
signal_ok[i].task_id = c_order_buf.param[1];
signal_ok[i].task_waits = FALSE;
break;
}
}
if (done == FALSE) {
c_get_back (C_MEM_FULL);
return;
}
if (temp_1 != NO_BIND) {
/* Objekt war schon an Task gebunden */
c_get_back (C_OBJ_REBIND);
return;
}
break;
case CAN_UNBIND_L_OBJ_ORDER:
temp_0 = 15; /* last obj index */
temp_1 = c_get_bind(temp_0);
c_clear_bind (temp_0);
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if (signal_ok[i].task_id == temp_1) {
signal_ok[i].task_id = NO_BIND;
signal_ok[i].task_waits = FALSE;
break;
}
}
break;
case CAN_WRITE_ORDER:
/* Pointer auf das Datenfeld initialisieren */
po.short_ptr.offs[0] = c_order_buf.param[0];
po.short_ptr.offs[1] = c_order_buf.param[1];
temp_0 = c_get_index_from_ident (*po.l_ptr);
if (temp_0 == 0) {
c_get_back (C_OBJ_ERROR);
return;
}
temp_1 = c_get_obj_typ (temp_0);
if ((temp_1 != D_SEND) && (temp_1 != D_SEND_R_REC)) {
c_get_back (C_OBJ_ERROR);
return;
}
c_write_data (temp_0, /* obj index */
po.c_ptr+4 /* pointer to datas */
);
break;
/* aufgerufen wenn can_receive */
case CAN_READ_W_IND_ORDER:
if (c_get_status() == bus_off) {
c_get_back (C_BUS_OFF);
return;
}
/* Pointer auf das Datenfeld initialisieren */
po.short_ptr.offs[0] = c_order_buf.param[0];
po.short_ptr.offs[1] = c_order_buf.param[1];
/* lese Identifikation f乺 Objekts 1..14 */
/* da wird f乺 15. = Objekt Ident = 0xFFFFFFFF wenn index = 0xF */
/* diese Ident wird erst beim read_data() (n刢hste Befehl) korrigiert */
*po.l_ptr = c_get_ident (c_order_buf.param[2]);
/* param[2] ist obj index */
/* lese Data oder lese Data und Ident fuer 15. Objekt */
c_read_data (c_order_buf.param[2], /* index */
po.c_ptr+4 /* pointer to datas */
);
break;
/* aufgerufen wenn can_wait */
case CAN_READ_W_TID_ORDER:
/* Pointer auf das Datenfeld initialisieren */
po.short_ptr.offs[0] = c_order_buf.param[0];
po.short_ptr.offs[1] = c_order_buf.param[1];
/* param[2] ist obj task ID tmp_0 ist Objekt Index */
temp_0 = c_get_rec_bind (c_order_buf.param[2]);
if (temp_0 == 0) {
c_get_back (C_CAN_FAILURE);
return;
}
/* lese Identifikation f乺 Objekts 1..14 */
/* da wird f乺 15. = Objekt Ident = 0xFFFFFFFF wenn index(temp_0 = 0xF */
/* diese Ident wird erst beim read_data() (n刢hste Befehl) korrigiert */
*po.l_ptr = c_get_ident (temp_0);
/* lese Data oder lese Data und Ident fuer 15. Objekt */
c_read_data (temp_0, /* index */
po.c_ptr+4 /* pointer to datas */
);
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if (signal_ok[i].task_id == c_order_buf.param[2]) {
signal_ok[i].task_waits = FALSE;
break;
}
}
break;
case CAN_READ_ORDER:
qq.tb[0] = c_order_buf.param[0]; /* ident */
qq.tb[1] = c_order_buf.param[1];
qq.tb[2] = c_order_buf.param[2];
qq.tb[3] = c_order_buf.param[3];
temp_0 = c_get_index_from_ident (qq.tl);
if (temp_0 == 0) {
c_get_back (C_OBJ_ERROR);
return;
}
/* Pointer auf das Datenfeld initialisieren */
po.short_ptr.offs[0] = c_order_buf.param[4];
po.short_ptr.offs[1] = c_order_buf.param[5];
/* lese Identifikation f乺 Objekts 1..14 */
/* da wird f乺 15. = Objekt Ident = 0xFFFFFFFF wenn index(temp_0 = 0xF */
/* diese Ident wird erst beim read_data() (n刢hste Befehl) korrigiert */
*po.l_ptr = c_get_ident (temp_0);
/* lese Data oder lese Data und Ident fuer 15. Objekt */
c_read_data (temp_0, /* index */
po.c_ptr+4 /* pointer to datas */
);
break;
case CAN_READ_L_OBJ_ORDER:
/* Pointer auf das Datenfeld initialisieren */
po.short_ptr.offs[0] = c_order_buf.param[0];
po.short_ptr.offs[1] = c_order_buf.param[1];
/* lese Data und Ident fuer 15. Objekt */
c_read_data (15, /* index */
po.c_ptr+4 /* pointer to datas */
);
break;
case CAN_GET_STATUS_ORDER:
if (c_get_status() == error_active) {
c_get_back (C_ERR_ACTIVE);
}
else if (c_get_status() == error_passive) {
c_get_back (C_ERR_PASSIVE);
}
else if (c_get_status() == bus_off) {
c_get_back (C_BUS_OFF);
}
else {
c_get_back (C_CAN_FAILURE);
}
return;
break;
case CAN_ACTIVATE_WAIT:
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if (signal_ok[i].task_id == (c_order_buf.task_id)) {
signal_ok[i].task_waits = TRUE;
break;
}
}
if (c_get_rec_bind (c_order_buf.task_id) != 0) {
os_send_signal (c_order_buf.task_id);
}
return;
break;
default:
c_get_back (C_CAN_FAILURE);
return;
break;
}
c_get_back (C_OK);
}
#pragma eject
/*---------------------------------------------------------------------*
* C A N - T A S K *
*---------------------------------------------------------------------*/
/*---------------------------------------------------------------------*
* C A N _ C A N _ T A S K _ M A I N
*---------------------------------------------------------------------*
* Funktion:
*
* Hauptschleife des CAN-Task.
*
*---------------------------------------------------------------------*
* Parameter:
*
* --
*
*---------------------------------------------------------------------*/
void can_can_task_main (void) _task_ CAN_TASK_ID _priority_ 3
{
byte i;
/* Grundinitialisierung beim Starten des CAN-Task */
/* CAN-Controller auf anhalten, bis zur Initialisierung */
/* durch die Applikation d乺fen keine Interrupts auftreten */
can_stopped = TRUE;
c_init_obj_buf ();
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
signal_ok[i].task_id = NO_BIND;
signal_ok[i].task_waits = FALSE;
}
/* CAN-Interrupt zuordnen */
os_attach_interrupt (CAN_INT_NBR);
/* Hauptschleife des Task */
for (;;) {
/* Auf Signal von der Applikation oder Interrupt vom */
/* CAN-Controller warten */
if (os_wait (K_INT+K_SIG, 0xff, 0) == INT_EVENT) {
/* CAN-Controller Interrupt abhandeln */
c_handle_can_int ();
}
else {
/* Signal von der Applikation abhandeln */
c_handle_appli_signal ();
}
}
}
/*---------------------------------------------------------------------*
* Ende Modul ICANDRV *
*---------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -