コード例 #1
0
void __ubmodem_substate_start_disconnect_network(struct ubmodem_s *modem)
{
  struct modem_sub_setup_network_s *sub = &modem->sub.setup_network;
  int err;

  MODEM_DEBUGASSERT(modem, modem->level == UBMODEM_LEVEL_NETWORK ||
                           modem->level == UBMODEM_LEVEL_GPRS);

  /*
   * Disconnect network sequence is:
   *
   * 1. Send "AT+COPS=2".
   * 2. Send "AT+CFUN=0".
   *
   */

  __ubmodem_network_cleanup(modem);

  /* Reset sub-state data and initiate sub-state machine work. */

  memset(sub, 0, sizeof(*sub));
  sub->network_state = NETWORK_SETUP_DISCONNECTING;

  /* Disable network. */

  err = __ubmodem_send_cmd(modem, &cmd_ATpCOPS, set_ATpCOPS_off_handler, sub,
                           "%s", "=2");
  MODEM_DEBUGASSERT(modem, err == OK);
}
コード例 #2
0
static int network_register_timer_handler(struct ubmodem_s *modem,
                                          const int timer_id, void * const arg)
{
  const char *reason;

  if (timer_id != -1)
    {
      /* One-shot timer, not registered anymore. */

      modem->creg_timer_id = -1;
    }

  /* Could not register in time. Disable RF. */

  if (timer_id == -1)
    reason = "NETWORK: Denied.";
  else
    reason = "NETWORK: Timeout.";

  /* Mark for retry, 'level transition failed' can modify the actual target
   * level. */

  __ubmodem_network_cleanup(modem);
  __ubmodem_retry_current_level(modem, UBMODEM_LEVEL_SIM_ENABLED);

  /* Failed to connect network. */

  __ubmodem_level_transition_failed(modem, "%s", reason);

  return OK;
}
コード例 #3
0
static int network_register_timeout_handler(struct ubmodem_s *modem,
                                            const int timer_id,
                                            void * const arg)
{
  struct modem_sub_setup_network_s *sub = &modem->sub.setup_network;
  struct timespec curr_ts;
  const char *reason;
  int ret;

  MODEM_DEBUGASSERT(modem, modem->creg_timer_id == timer_id);

  if (timer_id != -1)
    {
      /* One-shot timer, not registered anymore. */

      modem->creg_timer_id = -1;

      ubmodem_pm_set_activity(modem, UBMODEM_PM_ACTIVITY_HIGH, false);
    }

  (void)clock_gettime(CLOCK_MONOTONIC, &curr_ts);

  if (curr_ts.tv_sec - sub->net_reg_start_ts.tv_sec <=
      MODEM_CMD_NETWORK_REGISTRATION_TIMEOUT / 10)
    {
      /* Too soon, reregister timer. */

      ret = __ubmodem_set_timer(modem, NETWORK_REGISTRATION_CHECK_SECS * 1000,
                                &network_register_timeout_handler, sub);
      MODEM_DEBUGASSERT(modem, ret != ERROR);

      modem->creg_timer_id = ret;

      ubmodem_pm_set_activity(modem, UBMODEM_PM_ACTIVITY_HIGH, true);

      return OK;
    }

  /* Could not register in time. Disable RF. */

  if (timer_id == -1)
    reason = "NETWORK: Denied.";
  else
    reason = "NETWORK: Timeout.";

  /* Mark for retry, 'level transition failed' can modify the actual target
   * level. */

  __ubmodem_network_cleanup(modem);
  __ubmodem_retry_current_level(modem, UBMODEM_LEVEL_SIM_ENABLED);

  /* Failed to connect network. */

  __ubmodem_level_transition_failed(modem, "%s", reason);

  return OK;
}
コード例 #4
0
static int retry_network_through_sim(struct ubmodem_s *modem, void *priv)
{
  ubdbg("\n");

  /* Go to SIM enabled level from current and then retry current. */

  __ubmodem_network_cleanup(modem);
  __ubmodem_retry_current_level(modem, UBMODEM_LEVEL_SIM_ENABLED);

  /* Return error to tell task starter that task did not start new work on
   * state machine. */

  return ERROR;
}
コード例 #5
0
static int reregister_network_failed(struct ubmodem_s *modem, void *priv)
{
  ubdbg("\n");

  /* Mark for retry, 'level transition failed' can modify the actual target
   * level. */

  __ubmodem_network_cleanup(modem);
  __ubmodem_retry_current_level(modem, UBMODEM_LEVEL_SIM_ENABLED);

  /* Could not reregister, shutdown modem. */

  __ubmodem_level_transition_failed(modem, "%s", "NETWORK: Lost connection.");

  /* Return error to tell task starter that task did not start new work on
   * state machine. */

  return ERROR;
}