--- a/stage4/generate_c/generate_c.cc Thu Jun 04 09:44:53 2009 +0200
+++ b/stage4/generate_c/generate_c.cc Thu Jun 04 09:47:35 2009 +0200
@@ -1129,6 +1129,7 @@
private:
/* The name of the resource curretnly being processed... */
symbol_c *current_resource_name;
+ symbol_c *current_task_name;
symbol_c *current_global_vars;
public:
@@ -1138,6 +1139,7 @@
search_resource_instance = new search_var_instance_decl_c(resource_scope);
common_ticktime = time;
current_resource_name = NULL;
+ current_task_name = NULL;
current_global_vars = NULL;
};
virtual ~generate_c_resources_c(void) {
@@ -1224,9 +1226,14 @@
s4o.print("#include \"POUS.h\"\n\n");
s4o.print("#include \"POUS.c\"\n\n");
+ wanted_declaretype = declare_dt;
+
/* (A.4) Resource programs declaration... */
- wanted_declaretype = declare_dt;
+ symbol->task_configuration_list->accept(*this);
+
+ /* (A.5) Resource programs declaration... */
symbol->program_configuration_list->accept(*this);
+
s4o.print("\n");
/* (B) resource initialisation function... */
@@ -1248,8 +1255,12 @@
}
s4o.print("\n");
- /* (B.3) Resource programs initialisations... */
wanted_declaretype = init_dt;
+
+ /* (B.3) Tasks initialisations... */
+ symbol->task_configuration_list->accept(*this);
+
+ /* (B.4) Resource programs initialisations... */
symbol->program_configuration_list->accept(*this);
s4o.indent_left();
@@ -1263,11 +1274,12 @@
s4o.print("(int tick) {\n");
s4o.indent_right();
+ wanted_declaretype = run_dt;
+
/* (C.2) Task management... */
symbol->task_configuration_list->accept(*this);
/* (C.3) Program run declaration... */
- wanted_declaretype = run_dt;
symbol->program_configuration_list->accept(*this);
s4o.indent_left();
@@ -1283,58 +1295,62 @@
/* PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */
//SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused)
void *visit(program_configuration_c *symbol) {
- if (wanted_declaretype == declare_dt) {
- s4o.print(s4o.indent_spaces);
- symbol->program_type_name->accept(*this);
- s4o.print(" ");
- current_resource_name->accept(*this);
- s4o.print("__");
- symbol->program_name->accept(*this);
- s4o.print(";\n#define ");
- symbol->program_name->accept(*this);
- s4o.print(" ");
- current_resource_name->accept(*this);
- s4o.print("__");
- symbol->program_name->accept(*this);
- s4o.print("\n");
- }
- if (wanted_declaretype == init_dt) {
- s4o.print(s4o.indent_spaces);
- symbol->program_type_name->accept(*this);
- s4o.print(FB_INIT_SUFFIX);
- s4o.print("(&");
- symbol->program_name->accept(*this);
- s4o.print(");\n");
- }
- if (wanted_declaretype == run_dt) {
- current_program_name = ((identifier_c*)(symbol->program_name))->value;
- if (symbol->task_name != NULL) {
+ switch (wanted_declaretype) {
+ case declare_dt:
s4o.print(s4o.indent_spaces);
- s4o.print("if (!");
- symbol->task_name->accept(*this);
- s4o.print(") {\n");
- s4o.indent_right();
- }
+ symbol->program_type_name->accept(*this);
+ s4o.print(" ");
+ current_resource_name->accept(*this);
+ s4o.print("__");
+ symbol->program_name->accept(*this);
+ s4o.print(";\n#define ");
+ symbol->program_name->accept(*this);
+ s4o.print(" ");
+ current_resource_name->accept(*this);
+ s4o.print("__");
+ symbol->program_name->accept(*this);
+ s4o.print("\n");
+ break;
+ case init_dt:
+ s4o.print(s4o.indent_spaces);
+ symbol->program_type_name->accept(*this);
+ s4o.print(FB_INIT_SUFFIX);
+ s4o.print("(&");
+ symbol->program_name->accept(*this);
+ s4o.print(");\n");
+ break;
+ case run_dt:
+ current_program_name = ((identifier_c*)(symbol->program_name))->value;
+ if (symbol->task_name != NULL) {
+ s4o.print(s4o.indent_spaces);
+ s4o.print("if (");
+ symbol->task_name->accept(*this);
+ s4o.print(") {\n");
+ s4o.indent_right();
+ }
- wanted_assigntype = assign_at;
- if (symbol->prog_conf_elements != NULL)
- symbol->prog_conf_elements->accept(*this);
-
- s4o.print(s4o.indent_spaces);
- symbol->program_type_name->accept(*this);
- s4o.print(FB_FUNCTION_SUFFIX);
- s4o.print("(&");
- symbol->program_name->accept(*this);
- s4o.print(");\n");
-
- wanted_assigntype = send_at;
- if (symbol->prog_conf_elements != NULL)
- symbol->prog_conf_elements->accept(*this);
-
- if (symbol->task_name != NULL) {
- s4o.indent_left();
- s4o.print(s4o.indent_spaces + "}\n");
- }
+ wanted_assigntype = assign_at;
+ if (symbol->prog_conf_elements != NULL)
+ symbol->prog_conf_elements->accept(*this);
+
+ s4o.print(s4o.indent_spaces);
+ symbol->program_type_name->accept(*this);
+ s4o.print(FB_FUNCTION_SUFFIX);
+ s4o.print("(&");
+ symbol->program_name->accept(*this);
+ s4o.print(");\n");
+
+ wanted_assigntype = send_at;
+ if (symbol->prog_conf_elements != NULL)
+ symbol->prog_conf_elements->accept(*this);
+
+ if (symbol->task_name != NULL) {
+ s4o.indent_left();
+ s4o.print(s4o.indent_spaces + "}\n");
+ }
+ break;
+ default:
+ break;
}
return NULL;
}
@@ -1342,30 +1358,110 @@
/* TASK task_name task_initialization */
//SYM_REF2(task_configuration_c, task_name, task_initialization)
void *visit(task_configuration_c *symbol) {
- s4o.print(s4o.indent_spaces + "int ");
- symbol->task_name->accept(*this);
- s4o.print(" = ");
- symbol->task_initialization->accept(*this);
- s4o.print(";\n");
+ current_task_name = symbol->task_name;
+ switch (wanted_declaretype) {
+ case declare_dt:
+ s4o.print(s4o.indent_spaces + "BOOL ");
+ current_task_name->accept(*this);
+ s4o.print(";\n");
+ symbol->task_initialization->accept(*this);
+ break;
+ case init_dt:
+ s4o.print(s4o.indent_spaces);
+ current_task_name->accept(*this);
+ s4o.print(" = __BOOL_LITERAL(FALSE);\n");
+ symbol->task_initialization->accept(*this);
+ break;
+ case run_dt:
+ symbol->task_initialization->accept(*this);
+ break;
+ default:
+ break;
+ }
+ current_task_name = NULL;
return NULL;
}
/* '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */
//SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused)
void *visit(task_initialization_c *symbol) {
- if (symbol->interval_data_source != NULL) {
- calculate_time_c calculate_time;
- symbol->interval_data_source->accept(calculate_time);
- unsigned long time = calculate_time.get_time();
- if (time != 0) {
- s4o.print("tick % ");
- s4o.print_integer((int)(time / common_ticktime));
- }
- else
- s4o.print("1");
+ switch (wanted_declaretype) {
+ case declare_dt:
+ if (symbol->single_data_source != NULL) {
+ s4o.print(s4o.indent_spaces + "R_TRIG ");
+ current_task_name->accept(*this);
+ s4o.print("_R_TRIG;\n");
+ }
+ break;
+ case init_dt:
+ if (symbol->single_data_source != NULL) {
+ s4o.print(s4o.indent_spaces + "R_TRIG");
+ s4o.print(FB_INIT_SUFFIX);
+ s4o.print("(&");
+ current_task_name->accept(*this);
+ s4o.print("_R_TRIG);\n");
+ }
+ break;
+ case run_dt:
+ if (symbol->single_data_source != NULL) {
+ symbol_c *config_var_decl = NULL;
+ symbol_c *res_var_decl = NULL;
+ symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->single_data_source))->global_var_name;
+ res_var_decl = search_resource_instance->get_decl(current_var_reference);
+ if (res_var_decl == NULL) {
+ config_var_decl = search_config_instance->get_decl(current_var_reference);
+ if (config_var_decl == NULL)
+ ERROR;
+ s4o.print(s4o.indent_spaces + "{extern ");
+ config_var_decl->accept(*this);
+ s4o.print(" *");
+ symbol->single_data_source->accept(*this);
+ s4o.print("; ");
+ }
+ else
+ s4o.print(s4o.indent_spaces);
+ current_task_name->accept(*this);
+ s4o.print("_R_TRIG.CLK = *");
+ symbol->single_data_source->accept(*this);
+ s4o.print(";");
+ if (config_var_decl != NULL)
+ s4o.print("}");
+ s4o.print("\n");
+ s4o.print(s4o.indent_spaces + "R_TRIG");
+ s4o.print(FB_FUNCTION_SUFFIX);
+ s4o.print("(&");
+ current_task_name->accept(*this);
+ s4o.print("_R_TRIG);\n");
+ s4o.print(s4o.indent_spaces);
+ current_task_name->accept(*this);
+ s4o.print(" = ");
+ current_task_name->accept(*this);
+ s4o.print("_R_TRIG.Q");
+ }
+ else {
+ s4o.print(s4o.indent_spaces);
+ current_task_name->accept(*this);
+ s4o.print(" = ");
+ if (symbol->interval_data_source != NULL) {
+ calculate_time_c calculate_time;
+ symbol->interval_data_source->accept(calculate_time);
+ unsigned long time = calculate_time.get_time();
+ if (time != 0) {
+ s4o.print("!(tick % ");
+ s4o.print_integer((int)(time / common_ticktime));
+ s4o.print(")");
+ }
+ else
+ s4o.print("1");
+ }
+ else
+ s4o.print("1");
+ }
+ s4o.print(";\n");
+ break;
+ default:
+ break;
}
- else
- s4o.print("1");
return NULL;
}