1 /* $Id: fsm.c,v 1.14.6.4 2001/09/23 22:24:47 kai Exp $
6 * Copyright by Karsten Keil <keil@isdn4linux.de>
7 * by Kai Germaschewski <kai.germaschewski@gmx.de>
9 * This software may be used and distributed according to the terms
10 * of the GNU General Public License, incorporated herein by reference.
12 * Thanks to Jan den Ouden
17 #include <linux/module.h>
18 #include <linux/init.h>
21 #define FSM_TIMER_DEBUG 0
24 FsmNew(struct Fsm
*fsm
, struct FsmNode
*fnlist
, int fncount
)
28 fsm
->jumpmatrix
= (FSMFNPTR
*)
29 kmalloc(sizeof (FSMFNPTR
) * fsm
->state_count
* fsm
->event_count
, GFP_KERNEL
);
33 memset(fsm
->jumpmatrix
, 0, sizeof (FSMFNPTR
) * fsm
->state_count
* fsm
->event_count
);
35 for (i
= 0; i
< fncount
; i
++)
36 if ((fnlist
[i
].state
>=fsm
->state_count
) || (fnlist
[i
].event
>=fsm
->event_count
)) {
37 printk(KERN_ERR
"FsmNew Error line %d st(%ld/%ld) ev(%ld/%ld)\n",
38 i
,(long)fnlist
[i
].state
,(long)fsm
->state_count
,
39 (long)fnlist
[i
].event
,(long)fsm
->event_count
);
41 fsm
->jumpmatrix
[fsm
->state_count
* fnlist
[i
].event
+
42 fnlist
[i
].state
] = (FSMFNPTR
) fnlist
[i
].routine
;
47 FsmFree(struct Fsm
*fsm
)
49 kfree((void *) fsm
->jumpmatrix
);
53 FsmEvent(struct FsmInst
*fi
, int event
, void *arg
)
57 if ((fi
->state
>=fi
->fsm
->state_count
) || (event
>= fi
->fsm
->event_count
)) {
58 printk(KERN_ERR
"FsmEvent Error st(%ld/%ld) ev(%d/%ld)\n",
59 (long)fi
->state
,(long)fi
->fsm
->state_count
,event
,(long)fi
->fsm
->event_count
);
62 r
= fi
->fsm
->jumpmatrix
[fi
->fsm
->state_count
* event
+ fi
->state
];
65 fi
->printdebug(fi
, "State %s Event %s",
66 fi
->fsm
->strState
[fi
->state
],
67 fi
->fsm
->strEvent
[event
]);
72 fi
->printdebug(fi
, "State %s Event %s no routine",
73 fi
->fsm
->strState
[fi
->state
],
74 fi
->fsm
->strEvent
[event
]);
80 FsmChangeState(struct FsmInst
*fi
, int newstate
)
84 fi
->printdebug(fi
, "ChangeState %s",
85 fi
->fsm
->strState
[newstate
]);
89 FsmExpireTimer(struct FsmTimer
*ft
)
93 ft
->fi
->printdebug(ft
->fi
, "FsmExpireTimer %lx", (long) ft
);
95 FsmEvent(ft
->fi
, ft
->event
, ft
->arg
);
99 FsmInitTimer(struct FsmInst
*fi
, struct FsmTimer
*ft
)
102 ft
->tl
.function
= (void *) FsmExpireTimer
;
103 ft
->tl
.data
= (long) ft
;
106 ft
->fi
->printdebug(ft
->fi
, "FsmInitTimer %lx", (long) ft
);
112 FsmDelTimer(struct FsmTimer
*ft
, int where
)
116 ft
->fi
->printdebug(ft
->fi
, "FsmDelTimer %lx %d", (long) ft
, where
);
122 FsmAddTimer(struct FsmTimer
*ft
,
123 int millisec
, int event
, void *arg
, int where
)
128 ft
->fi
->printdebug(ft
->fi
, "FsmAddTimer %lx %d %d",
129 (long) ft
, millisec
, where
);
132 if (timer_pending(&ft
->tl
)) {
133 printk(KERN_WARNING
"FsmAddTimer: timer already active!\n");
134 ft
->fi
->printdebug(ft
->fi
, "FsmAddTimer already active!");
140 ft
->tl
.expires
= jiffies
+ (millisec
* HZ
) / 1000;
146 FsmRestartTimer(struct FsmTimer
*ft
,
147 int millisec
, int event
, void *arg
, int where
)
152 ft
->fi
->printdebug(ft
->fi
, "FsmRestartTimer %lx %d %d",
153 (long) ft
, millisec
, where
);
156 if (timer_pending(&ft
->tl
))
161 ft
->tl
.expires
= jiffies
+ (millisec
* HZ
) / 1000;