master/fsm_foe.c
changeset 1901 2a1106b1d863
parent 1822 74e6ac2369f4
child 1921 d9cf40facbc4
equal deleted inserted replaced
1900:25f848e2fbf4 1901:2a1106b1d863
   102 void ec_fsm_foe_write_start(ec_fsm_foe_t *);
   102 void ec_fsm_foe_write_start(ec_fsm_foe_t *);
   103 void ec_fsm_foe_read_start(ec_fsm_foe_t *);
   103 void ec_fsm_foe_read_start(ec_fsm_foe_t *);
   104 
   104 
   105 /*****************************************************************************/
   105 /*****************************************************************************/
   106 
   106 
   107 /**
   107 /** Constructor.
   108    Constructor.
   108  */
   109 */
       
   110 
       
   111 void ec_fsm_foe_init(ec_fsm_foe_t *fsm, /**< finite state machine */
   109 void ec_fsm_foe_init(ec_fsm_foe_t *fsm, /**< finite state machine */
   112                      ec_datagram_t *datagram /**< datagram */
   110                      ec_datagram_t *datagram /**< datagram */
   113                      )
   111                      )
   114 {
   112 {
   115     fsm->state     = NULL;
   113     fsm->state     = NULL;
   116     fsm->datagram  = datagram;
   114     fsm->datagram  = datagram;
   117     fsm->rx_errors = 0;
   115 }
   118     fsm->tx_errors = 0;
   116 
   119 }
   117 /*****************************************************************************/
   120 
   118 
   121 /*****************************************************************************/
   119 /** Destructor.
   122 
   120  */
   123 /**
       
   124    Destructor.
       
   125 */
       
   126 
       
   127 void ec_fsm_foe_clear(ec_fsm_foe_t *fsm /**< finite state machine */)
   121 void ec_fsm_foe_clear(ec_fsm_foe_t *fsm /**< finite state machine */)
   128 {
   122 {
   129 }
   123 }
   130 
   124 
   131 /*****************************************************************************/
   125 /*****************************************************************************/
   132 
   126 
   133 /**
   127 /** Executes the current state of the state machine.
   134    Executes the current state of the state machine.
   128  * \return false, if state machine has terminated
   135    \return false, if state machine has terminated
   129  */
   136 */
       
   137 
       
   138 int ec_fsm_foe_exec(ec_fsm_foe_t *fsm /**< finite state machine */)
   130 int ec_fsm_foe_exec(ec_fsm_foe_t *fsm /**< finite state machine */)
   139 {
   131 {
   140     fsm->state(fsm);
   132     fsm->state(fsm);
   141 
   133 
   142     return fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error;
   134     return fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error;
   143 }
   135 }
   144 
   136 
   145 /*****************************************************************************/
   137 /*****************************************************************************/
   146 
   138 
   147 /**
   139 /** Returns, if the state machine terminated with success.
   148    Returns, if the state machine terminated with success.
   140  * \return non-zero if successful.
   149    \return non-zero if successful.
   141  */
   150 */
       
   151 
       
   152 int ec_fsm_foe_success(ec_fsm_foe_t *fsm /**< Finite state machine */)
   142 int ec_fsm_foe_success(ec_fsm_foe_t *fsm /**< Finite state machine */)
   153 {
   143 {
   154     return fsm->state == ec_fsm_foe_end;
   144     return fsm->state == ec_fsm_foe_end;
   155 }
   145 }
   156 
   146 
   174     }
   164     }
   175 }
   165 }
   176 
   166 
   177 /*****************************************************************************/
   167 /*****************************************************************************/
   178 
   168 
   179 /**
   169 /** State: ERROR.
   180    State: ERROR.
   170  */
   181 */
       
   182 
       
   183 void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */)
   171 void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */)
   184 {
   172 {
   185 #ifdef DEBUG_FOE
   173 #ifdef DEBUG_FOE
   186     printk("ec_fsm_foe_error()\n");
   174     printk("ec_fsm_foe_error()\n");
   187 #endif
   175 #endif
   188 }
   176 }
   189 
   177 
   190 /*****************************************************************************/
   178 /*****************************************************************************/
   191 
   179 
   192 /**
   180 /** State: END.
   193    State: END.
   181  */
   194 */
       
   195 
       
   196 void ec_fsm_foe_end(ec_fsm_foe_t *fsm /**< finite state machine */)
   182 void ec_fsm_foe_end(ec_fsm_foe_t *fsm /**< finite state machine */)
   197 {
   183 {
   198 #ifdef DEBUG_FOE
   184 #ifdef DEBUG_FOE
   199     printk("ec_fsm_foe_end\n");
   185     printk("ec_fsm_foe_end\n");
   200 #endif
   186 #endif
   201 }
   187 }
   202 
   188 
   203 /*****************************************************************************/
   189 /*****************************************************************************/
   204 /**
   190 
   205    Sends a file or the next fragment.
   191 /** Sends a file or the next fragment.
   206 */
   192  */
   207 
       
   208 int ec_foe_prepare_data_send(ec_fsm_foe_t *fsm)
   193 int ec_foe_prepare_data_send(ec_fsm_foe_t *fsm)
   209 {
   194 {
   210     size_t remaining_size, current_size;
   195     size_t remaining_size, current_size;
   211     uint8_t *data;
   196     uint8_t *data;
   212 
   197 
   236 
   221 
   237     return 0;
   222     return 0;
   238 }
   223 }
   239 
   224 
   240 /*****************************************************************************/
   225 /*****************************************************************************/
   241 /**
   226 
   242    Prepare a write request (WRQ) with filename
   227 /** Prepare a write request (WRQ) with filename
   243 */
   228  */
   244 
       
   245 int ec_foe_prepare_wrq_send(ec_fsm_foe_t *fsm)
   229 int ec_foe_prepare_wrq_send(ec_fsm_foe_t *fsm)
   246 {
   230 {
   247     size_t current_size;
   231     size_t current_size;
   248     uint8_t *data;
   232     uint8_t *data;
   249 
   233 
   530     fsm->retries = EC_FSM_RETRIES;
   514     fsm->retries = EC_FSM_RETRIES;
   531     fsm->state = ec_fsm_foe_state_ack_check;
   515     fsm->state = ec_fsm_foe_state_ack_check;
   532 }
   516 }
   533 
   517 
   534 /*****************************************************************************/
   518 /*****************************************************************************/
   535 /**
   519 
   536    Prepare a read request (RRQ) with filename
   520 /** Prepare a read request (RRQ) with filename
   537 */
   521  */
   538 
       
   539 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *fsm)
   522 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *fsm)
   540 {
   523 {
   541     size_t current_size;
   524     size_t current_size;
   542     uint8_t *data;
   525     uint8_t *data;
   543 
   526 
   558     }
   541     }
   559 
   542 
   560     return 0;
   543     return 0;
   561 }
   544 }
   562 
   545 
   563 
       
   564 /*****************************************************************************/
   546 /*****************************************************************************/
   565 
   547 
   566 /** Prepare to send an acknowledge.
   548 /** Prepare to send an acknowledge.
   567  */
   549  */
   568 int ec_foe_prepare_send_ack(
   550 int ec_foe_prepare_send_ack(
   651 {
   633 {
   652     size_t current_size;
   634     size_t current_size;
   653     ec_slave_t *slave = fsm->slave;
   635     ec_slave_t *slave = fsm->slave;
   654 
   636 
   655     fsm->rx_buffer_offset = 0;
   637     fsm->rx_buffer_offset = 0;
   656     fsm->rx_current_size = 0;
       
   657     fsm->rx_packet_no = 0;
       
   658     fsm->rx_expected_packet_no = 1;
   638     fsm->rx_expected_packet_no = 1;
   659     fsm->rx_last_packet = 0;
   639     fsm->rx_last_packet = 0;
   660 
   640 
   661     current_size = fsm->rx_filename_len;
   641     current_size = fsm->rx_filename_len;
   662 
   642 
   912 void ec_foe_set_tx_error(
   892 void ec_foe_set_tx_error(
   913         ec_fsm_foe_t *fsm, /**< FoE statemachine. */
   893         ec_fsm_foe_t *fsm, /**< FoE statemachine. */
   914         uint32_t errorcode /**< FoE error code. */
   894         uint32_t errorcode /**< FoE error code. */
   915         )
   895         )
   916 {
   896 {
   917     fsm->tx_errors++;
       
   918     fsm->request->result = errorcode;
   897     fsm->request->result = errorcode;
   919     fsm->state = ec_fsm_foe_error;
   898     fsm->state = ec_fsm_foe_error;
   920 }
   899 }
   921 
   900 
   922 /*****************************************************************************/
   901 /*****************************************************************************/
   926 void ec_foe_set_rx_error(
   905 void ec_foe_set_rx_error(
   927         ec_fsm_foe_t *fsm, /**< FoE statemachine. */
   906         ec_fsm_foe_t *fsm, /**< FoE statemachine. */
   928         uint32_t errorcode /**< FoE error code. */
   907         uint32_t errorcode /**< FoE error code. */
   929         )
   908         )
   930 {
   909 {
   931     fsm->rx_errors++;
       
   932     fsm->request->result = errorcode;
   910     fsm->request->result = errorcode;
   933     fsm->state = ec_fsm_foe_error;
   911     fsm->state = ec_fsm_foe_error;
   934 }
   912 }
   935 
   913 
   936 /*****************************************************************************/
   914 /*****************************************************************************/