stage4/generate_c/generate_c_sfc.cc
changeset 897 8c3e91c385f5
parent 885 b2604fc6d25c
child 899 a3f734a23566
equal deleted inserted replaced
896:c1cf7259160d 897:8c3e91c385f5
   108     }
   108     }
   109 
   109 
   110     void print_step_argument(symbol_c *step_name, const char* argument, bool setter=false) {
   110     void print_step_argument(symbol_c *step_name, const char* argument, bool setter=false) {
   111       print_variable_prefix();
   111       print_variable_prefix();
   112       if (setter) s4o.print(",");
   112       if (setter) s4o.print(",");
   113       s4o.print("__step_list[");
   113       step_name->accept(*this);  // in the generated C code, the 'step_name' will have been previously #define'd as equiv to '__step_list[<step_number>]", so now we simply print out the name!
   114       s4o.print(SFC_STEP_ACTION_PREFIX);
   114       s4o.print(".");
   115       step_name->accept(*this);
       
   116       s4o.print("].");
       
   117       s4o.print(argument);
   115       s4o.print(argument);
   118     }
   116     }
   119 
   117 
   120     void print_action_argument(symbol_c *action_name, const char* argument, bool setter=false) {
   118     void print_action_argument(symbol_c *action_name, const char* argument, bool setter=false) {
   121       print_variable_prefix();
   119       print_variable_prefix();
   133 
   131 
   134     void print_reset_step(symbol_c *step_name) {
   132     void print_reset_step(symbol_c *step_name) {
   135       s4o.print(s4o.indent_spaces);
   133       s4o.print(s4o.indent_spaces);
   136       s4o.print(SET_VAR);
   134       s4o.print(SET_VAR);
   137       s4o.print("(");
   135       s4o.print("(");
   138       print_step_argument(step_name, "state", true);
   136       print_step_argument(step_name, "X", true);
   139       s4o.print(",,0);\n");
   137       s4o.print(",,0);\n");
   140     }
   138     }
   141     
   139     
   142     void print_set_step(symbol_c *step_name) {
   140     void print_set_step(symbol_c *step_name) {
   143       s4o.print(s4o.indent_spaces);
   141       s4o.print(s4o.indent_spaces);
   144       s4o.print(SET_VAR);
   142       s4o.print(SET_VAR);
   145       s4o.print("(");
   143       s4o.print("(");
   146       print_step_argument(step_name, "state", true);
   144       print_step_argument(step_name, "X", true);
   147       s4o.print(",,1);\n" + s4o.indent_spaces);
   145       s4o.print(",,1);\n" + s4o.indent_spaces);
   148       print_step_argument(step_name, "elapsed_time");
   146       print_step_argument(step_name, "elapsed_time");
   149       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   147       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   150     }
   148     }
   151     
   149     
   164             s4o.print(s4o.indent_spaces + "{\n");
   162             s4o.print(s4o.indent_spaces + "{\n");
   165             s4o.indent_right();
   163             s4o.indent_right();
   166             s4o.print(s4o.indent_spaces + "char activated = ");
   164             s4o.print(s4o.indent_spaces + "char activated = ");
   167             s4o.print(GET_VAR);
   165             s4o.print(GET_VAR);
   168             s4o.print("(");
   166             s4o.print("(");
   169             print_step_argument(current_step, "state");
   167             print_step_argument(current_step, "X");
   170             s4o.print(") && !");
   168             s4o.print(") && !");
   171             print_step_argument(current_step, "prev_state");
   169             print_step_argument(current_step, "prev_state");
   172             s4o.print(";\n");
   170             s4o.print(";\n");
   173             s4o.print(s4o.indent_spaces + "char desactivated = !");
   171             s4o.print(s4o.indent_spaces + "char desactivated = !");
   174             s4o.print(GET_VAR);
   172             s4o.print(GET_VAR);
   175             s4o.print("(");
   173             s4o.print("(");
   176             print_step_argument(current_step, "state");
   174             print_step_argument(current_step, "X");
   177             s4o.print(") && ");
   175             s4o.print(") && ");
   178             print_step_argument(current_step, "prev_state");
   176             print_step_argument(current_step, "prev_state");
   179             s4o.print(";\n");
   177             s4o.print(";\n");
   180             s4o.print(s4o.indent_spaces + "char active = ");
   178             s4o.print(s4o.indent_spaces + "char active = ");
   181             s4o.print(GET_VAR);
   179             s4o.print(GET_VAR);
   182             s4o.print("(");
   180             s4o.print("(");
   183             print_step_argument(current_step, "state");
   181             print_step_argument(current_step, "X");
   184             s4o.print(");\n");
   182             s4o.print(");\n");
   185             symbol->action_association_list->accept(*this);
   183             symbol->action_association_list->accept(*this);
   186             s4o.indent_left();
   184             s4o.indent_left();
   187             s4o.print(s4o.indent_spaces + "}\n\n");
   185             s4o.print(s4o.indent_spaces + "}\n\n");
   188           }
   186           }
   205             s4o.indent_right();
   203             s4o.indent_right();
   206             s4o.print(s4o.indent_spaces + "char activated, desactivated, active;\n");
   204             s4o.print(s4o.indent_spaces + "char activated, desactivated, active;\n");
   207             s4o.print(s4o.indent_spaces + "activated = ");
   205             s4o.print(s4o.indent_spaces + "activated = ");
   208             s4o.print(GET_VAR);
   206             s4o.print(GET_VAR);
   209             s4o.print("(");
   207             s4o.print("(");
   210             print_step_argument(current_step, "state");
   208             print_step_argument(current_step, "X");
   211             s4o.print(") && !");
   209             s4o.print(") && !");
   212             print_step_argument(current_step, "prev_state");
   210             print_step_argument(current_step, "prev_state");
   213             s4o.print(";\n");
   211             s4o.print(";\n");
   214             s4o.print(s4o.indent_spaces + "desactivated = !");
   212             s4o.print(s4o.indent_spaces + "desactivated = !");
   215             s4o.print(GET_VAR);
   213             s4o.print(GET_VAR);
   216             s4o.print("(");
   214             s4o.print("(");
   217             print_step_argument(current_step, "state");
   215             print_step_argument(current_step, "X");
   218             s4o.print(") && ");
   216             s4o.print(") && ");
   219             print_step_argument(current_step, "prev_state");
   217             print_step_argument(current_step, "prev_state");
   220             s4o.print(";\n");
   218             s4o.print(";\n");
   221             s4o.print(s4o.indent_spaces + "active = ");
   219             s4o.print(s4o.indent_spaces + "active = ");
   222             s4o.print(GET_VAR);
   220             s4o.print(GET_VAR);
   223             s4o.print("(");
   221             s4o.print("(");
   224             print_step_argument(current_step, "state");
   222             print_step_argument(current_step, "X");
   225             s4o.print(");\n");
   223             s4o.print(");\n");
   226             symbol->action_association_list->accept(*this);
   224             symbol->action_association_list->accept(*this);
   227             s4o.indent_left();
   225             s4o.indent_left();
   228             s4o.print(s4o.indent_spaces + "}\n\n");
   226             s4o.print(s4o.indent_spaces + "}\n\n");
   229           }
   227           }
   435       if (symbol->step_name != NULL) {
   433       if (symbol->step_name != NULL) {
   436         switch (wanted_sfcgeneration) {
   434         switch (wanted_sfcgeneration) {
   437           case transitiontest_sg:
   435           case transitiontest_sg:
   438             s4o.print(GET_VAR);
   436             s4o.print(GET_VAR);
   439             s4o.print("(");
   437             s4o.print("(");
   440             print_step_argument(symbol->step_name, "state");
   438             print_step_argument(symbol->step_name, "X");
   441             s4o.print(")");
   439             s4o.print(")");
   442             break;
   440             break;
   443           case stepset_sg:
   441           case stepset_sg:
   444             print_set_step(symbol->step_name);
   442             print_set_step(symbol->step_name);
   445             break;
   443             break;
   460       switch (wanted_sfcgeneration) {
   458       switch (wanted_sfcgeneration) {
   461         case transitiontest_sg:
   459         case transitiontest_sg:
   462           for(int i = 0; i < symbol->n; i++) {
   460           for(int i = 0; i < symbol->n; i++) {
   463             s4o.print(GET_VAR);
   461             s4o.print(GET_VAR);
   464             s4o.print("(");
   462             s4o.print("(");
   465             print_step_argument(symbol->elements[i], "state");
   463             print_step_argument(symbol->elements[i], "X");
   466             s4o.print(")");
   464             s4o.print(")");
   467             if (i < symbol->n - 1) {
   465             if (i < symbol->n - 1) {
   468               s4o.print(" && ");
   466               s4o.print(" && ");
   469             }
   467             }
   470           }
   468           }
   505           }
   503           }
   506           else {
   504           else {
   507             s4o.print(s4o.indent_spaces + "if (");
   505             s4o.print(s4o.indent_spaces + "if (");
   508             s4o.print(GET_VAR);
   506             s4o.print(GET_VAR);
   509             s4o.print("(");
   507             s4o.print("(");
   510             print_step_argument(current_step, "state");
   508             print_step_argument(current_step, "X");
   511             s4o.print(")) {\n");
   509             s4o.print(")) {\n");
   512             s4o.indent_right();
   510             s4o.indent_right();
   513             s4o.print(s4o.indent_spaces);
   511             s4o.print(s4o.indent_spaces);
   514             s4o.print(SET_VAR);
   512             s4o.print(SET_VAR);
   515             s4o.print("(");
   513             s4o.print("(");
   742       print_variable_prefix();
   740       print_variable_prefix();
   743       s4o.print("__step_list[i].prev_state = ");
   741       s4o.print("__step_list[i].prev_state = ");
   744       s4o.print(GET_VAR);
   742       s4o.print(GET_VAR);
   745       s4o.print("(");
   743       s4o.print("(");
   746       print_variable_prefix();
   744       print_variable_prefix();
   747       s4o.print("__step_list[i].state);\n");
   745       s4o.print("__step_list[i].X);\n");
   748       s4o.print(s4o.indent_spaces + "if (");
   746       s4o.print(s4o.indent_spaces + "if (");
   749       s4o.print(GET_VAR);
   747       s4o.print(GET_VAR);
   750       s4o.print("(");
   748       s4o.print("(");
   751       print_variable_prefix();
   749       print_variable_prefix();
   752       s4o.print("__step_list[i].state)) {\n");
   750       s4o.print("__step_list[i].X)) {\n");
   753       s4o.indent_right();
   751       s4o.indent_right();
   754       s4o.print(s4o.indent_spaces);
   752       s4o.print(s4o.indent_spaces);
   755       print_variable_prefix();
   753       print_variable_prefix();
   756 //      s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, ");
   754 //      s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, ");
   757 //      s4o.print("__step_list[i].elapsed_time = ADD_TIME(__BOOL_LITERAL(TRUE), NULL, ");
   755 //      s4o.print("__step_list[i].elapsed_time = ADD_TIME(__BOOL_LITERAL(TRUE), NULL, ");