--- a/stage4/generate_cc/generate_cc_sfc.cc Fri Oct 05 17:58:44 2007 +0200
+++ b/stage4/generate_cc/generate_cc_sfc.cc Wed Oct 17 17:51:24 2007 +0200
@@ -65,6 +65,7 @@
generate_cc_il_c *generate_cc_il;
generate_cc_st_c *generate_cc_st;
generate_cc_SFC_IL_ST_c *generate_cc_code;
+ search_var_instance_decl_c *search_var_instance_decl;
int transition_number;
std::list<TRANSITION> transition_list;
@@ -80,6 +81,7 @@
generate_cc_il = new generate_cc_il_c(s4o_ptr, scope, variable_prefix);
generate_cc_st = new generate_cc_st_c(s4o_ptr, scope, variable_prefix);
generate_cc_code = new generate_cc_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix);
+ search_var_instance_decl = new search_var_instance_decl_c(scope);
this->set_variable_prefix(variable_prefix);
}
@@ -87,6 +89,7 @@
delete generate_cc_il;
delete generate_cc_st;
delete generate_cc_code;
+ delete search_var_instance_decl;
}
void reset_transition_number(void) {transition_number = 0;}
@@ -147,6 +150,12 @@
s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
}
+ bool is_variable(symbol_c *symbol) {
+ /* we try to find the variable instance declaration, to determine its type... */
+ symbol_c *var_decl = search_var_instance_decl->get_decl(symbol);
+
+ return var_decl != NULL;
+ }
/*********************************************/
/* B.1.6 Sequential function chart elements */
@@ -231,7 +240,7 @@
if (symbol->integer != NULL) {
transition->priority = atoi(((token_c *)symbol->integer)->value);
std::list<TRANSITION>::iterator pt = transition_list.begin();
- while (pt != transition_list.end() && pt->priority > transition->priority) {
+ while (pt != transition_list.end() && pt->priority <= transition->priority) {
pt++;
}
transition_list.insert(pt, *transition);
@@ -467,12 +476,24 @@
s4o.print(" = 1;\n");
}
if (strcmp(qualifier, "S") == 0) {
- print_action_argument(current_action, "set");
+ if (is_variable(current_action)) {
+ print_variable_prefix();
+ current_action->accept(*this);
+ }
+ else
+ print_action_argument(current_action, "set");
s4o.print(" = 1;\n");
}
if (strcmp(qualifier, "R") == 0) {
- print_action_argument(current_action, "reset");
- s4o.print(" = 1;\n");
+ if (is_variable(current_action)) {
+ print_variable_prefix();
+ current_action->accept(*this);
+ s4o.print(" = 0;\n");
+ }
+ else {
+ print_action_argument(current_action, "reset");
+ s4o.print(" = 1;\n");
+ }
}
if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 ||
strcmp(qualifier, "SL") == 0) {
@@ -564,7 +585,9 @@
print_variable_prefix();
s4o.print("step_list[i].elapsed_time = __time_add(");
print_variable_prefix();
- s4o.print("step_list[i].elapsed_time, PERIOD);\n");
+ s4o.print("step_list[i].elapsed_time, ");
+ print_variable_prefix();
+ s4o.print("period);\n");
s4o.indent_left();
s4o.print(s4o.indent_spaces + "}\n");
s4o.indent_left();
@@ -586,17 +609,21 @@
print_variable_prefix();
s4o.print("action_list[i].reset = 0;\n");
s4o.print(s4o.indent_spaces + "if (");
- print_variable_prefix();
- s4o.print("__gt_TIME(action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
+ s4o.print("__gt_TIME(2, ");
+ print_variable_prefix();
+ s4o.print("action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
s4o.indent_right();
s4o.print(s4o.indent_spaces);
print_variable_prefix();
s4o.print("action_list[i].set_remaining_time = __time_sub(");
print_variable_prefix();
- s4o.print("action_list[i].set_remaining_time, PERIOD);\n");
+ s4o.print("action_list[i].set_remaining_time, ");
+ print_variable_prefix();
+ s4o.print("period);\n");
s4o.print(s4o.indent_spaces + "if (");
- print_variable_prefix();
- s4o.print("__le_TIME(action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
+ s4o.print("__le_TIME(2, ");
+ print_variable_prefix();
+ s4o.print("action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
s4o.indent_right();
s4o.print(s4o.indent_spaces);
print_variable_prefix();
@@ -609,17 +636,21 @@
s4o.indent_left();
s4o.print(s4o.indent_spaces + "}\n");
s4o.print(s4o.indent_spaces + "if (");
- print_variable_prefix();
- s4o.print("__gt_TIME(action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
+ s4o.print("__gt_TIME(2, ");
+ print_variable_prefix();
+ s4o.print("action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
s4o.indent_right();
s4o.print(s4o.indent_spaces);
print_variable_prefix();
s4o.print("action_list[i].reset_remaining_time = __time_sub(");
print_variable_prefix();
- s4o.print("action_list[i].reset_remaining_time, PERIOD);\n");
+ s4o.print("action_list[i].reset_remaining_time, ");
+ print_variable_prefix();
+ s4o.print("period);\n");
s4o.print(s4o.indent_spaces + "if (");
- print_variable_prefix();
- s4o.print("__le_TIME(action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
+ s4o.print("__le_TIME(2, ");
+ print_variable_prefix();
+ s4o.print("action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
s4o.indent_right();
s4o.print(s4o.indent_spaces);
print_variable_prefix();
@@ -676,9 +707,9 @@
s4o.indent_right();
s4o.print(s4o.indent_spaces);
print_variable_prefix();
- s4o.print("action_list[i].set_remaining_time = 0;\n" + s4o.indent_spaces);
- print_variable_prefix();
- s4o.print("action_list[i].reset_remaining_time = 0;\n" + s4o.indent_spaces);
+ s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
+ print_variable_prefix();
+ s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
print_variable_prefix();
s4o.print("action_list[i].stored = 0;\n");
s4o.indent_left();