Example #1
0
qeo_retcode_t qeo_json_state_change_reader_enable(qeo_json_state_change_reader_t *reader)
{
    qeo_retcode_t     ret         = QEO_EINVAL;
    qeojson_reader_t  *jsonreader = (qeojson_reader_t *) reader;

    do {
        if (reader == NULL) {
            break;
        }

        ret = qeocore_reader_enable(jsonreader->reader);
        if (ret != QEO_OK) {
            break;
        }

        ret = QEO_OK;
    } while (0);

    return ret;
}
Example #2
0
int main(int argc, const char **argv)
{
    qeo_factory_t *factory;
    qeocore_type_t *type;
    qeocore_reader_t *reader;
    qeocore_reader_listener_t listener = { .on_data = on_data_available };
    qeocore_writer_t *writer;
    int i = 0;

    /* initialize */
    sem_init(&_sync, 0, 0);
    sem_init(&_sync_nodata, 0, 0);
    assert(NULL != (factory = qeocore_factory_new(QEO_IDENTITY_DEFAULT)));
    init_factory(factory);
    assert(NULL != (type = qeocore_type_register_tsm(factory, org_qeo_dynamic_qdm_test_TypeWithStructs_type, org_qeo_dynamic_qdm_test_TypeWithStructs_type[0].name)));
    assert(NULL != (reader = qeocore_reader_open(factory, type, NULL, QEOCORE_EFLAG_EVENT_DATA, &listener, NULL)));
    assert(NULL != (writer = qeocore_writer_open(factory, type, NULL, QEOCORE_EFLAG_EVENT_DATA, NULL, NULL)));
    /* test late enabling of readers/writers */
    assert(QEO_OK == qeocore_reader_enable(reader));
    assert(QEO_OK == qeocore_writer_enable(writer));
    /* send structure */
    for(i = 0; i < 20; i++){
        log_verbose("testing with %d", i);
        assert(QEO_OK == write_generated_data(writer, i));
        log_verbose("waiting for data");
        /* wait for reception */
        sem_wait(&_sync);
        sem_wait(&_sync_nodata);
    }

    /* clean up */
    qeocore_writer_close(writer);
    qeocore_reader_close(reader);
    qeocore_type_free(type);
    qeocore_factory_close(factory);
    sem_destroy(&_sync);
}
int main(int argc, const char **argv)
{

    pid_t pid;

    pid = fork();

    if (pid == -1) {
       perror("fork failed");
       exit(EXIT_FAILURE);
    }
    else if (pid == 0) {
       log_verbose("=================== WRITER of type 1 \n");

       qeo_factory_t *factory;
       qeocore_type_t *type1;
       qeocore_writer_t *writer;

       /* initialize */
       assert(NULL != (factory = qeocore_factory_new(QEO_IDENTITY_DEFAULT)));
       init_factory(factory);
       log_verbose(" =================== c qeocore_type_register_tsm(factory, _tsm_type_qdm_version1, _tsm_type_qdm_version1[0].name) \n");
       assert(NULL != (type1 = qeocore_type_register_tsm(factory, _tsm_type_qdm_version1, _tsm_type_qdm_version1[0].name)));
       log_verbose(" =================== c qeocore_writer_open(factory, type1, NULL, QEOCORE_EFLAG_EVENT_DATA, NULL, NULL) \n");
       assert(NULL != (writer = qeocore_writer_open(factory, type1, NULL, QEOCORE_EFLAG_EVENT_DATA, NULL, NULL)));
       /* test late enabling of readers/writers */
       log_verbose(" =================== c qeocore_writer_enable(writer) \n");
       assert(QEO_OK == qeocore_writer_enable(writer));
       /* send structure */
       sleep(2);
       log_verbose(" =================== c qeocore_writer_write(writer, &_type_qdm_version1) \n");
       assert(QEO_OK == qeocore_writer_write(writer, &_type_qdm_version1));
       sleep(2);
       /* clean up */
       qeocore_writer_close(writer);
       qeocore_type_free(type1);
       qeocore_factory_close(factory);
       _exit(EXIT_SUCCESS);
    }
    else {
       log_verbose("=================== READER of type 2 \n");

       qeo_factory_t *factory;
       qeocore_type_t *type2;
       qeocore_reader_t *reader;
       qeocore_reader_listener_t listener = { .on_data = on_data_available };

       /* initialize */
       sem_init(&_sync, 0, 0);
       sem_init(&_sync_nodata, 0, 0);
       assert(NULL != (factory = qeocore_factory_new(QEO_IDENTITY_DEFAULT)));
       init_factory(factory);
       log_verbose(" =================== p qeocore_type_register_tsm(factory, _tsm_type_qdm_version2, _tsm_type_qdm_version2[0].name) \n");
       assert(NULL != (type2 = qeocore_type_register_tsm(factory, _tsm_type_qdm_version2, _tsm_type_qdm_version2[0].name)));
       log_verbose(" =================== p qeocore_reader_open(factory, type2, NULL, QEOCORE_EFLAG_EVENT_DATA, &listener, NULL)  \n");
       assert(NULL != (reader = qeocore_reader_open(factory, type2, NULL, QEOCORE_EFLAG_EVENT_DATA, &listener, NULL)));
       /* test late enabling of readers/writers */
       log_verbose(" =================== p qeocore_reader_enable(reader) \n");
       assert(QEO_OK == qeocore_reader_enable(reader));
       /* wait for reception */
       log_verbose(" =================== p sem_wait(&_sync) \n");
       sem_wait(&_sync);
       log_verbose(" =================== p sem_wait(&_sync_nodata) \n");
       sem_wait(&_sync_nodata);
       /* clean up */
       qeocore_reader_close(reader);
       qeocore_type_free(type2);
       qeocore_factory_close(factory);
       sem_destroy(&_sync);

       int status;
       (void)waitpid(pid, &status, 0);
    }
    return EXIT_SUCCESS;



}
Example #4
0
static void client_state_machine_eval_ul(qeo_factory_t *factory,
                                         client_state_events_t event,
                                         qeo_mgmt_client_locator_t *locator,
                                         int64_t device_id)
{
    qeo_log_i("received event %s in state %s", client_event_to_str(event),
              client_state_to_str(factory->fwd.u.client.state));
    switch (factory->fwd.u.client.state) {
        case FWD_CLIENT_STATE_INIT:
            switch (event) {
                case CLIENT_EVENT_START:
                    factory->fwd.device_id = -1;
                    if (QEO_OK == client_start_timer(factory, 1)) {
                        factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT;
                    }
                    if (QEO_OK != qeocore_reader_enable(factory->fwd.reader)) {
                        qeo_log_e("error enabling forwarder topic reader");
                    }
                    if (QEO_OK != fwd_get_list(factory)) {
                        qeo_log_e("error requesting list of forwarders");
                    }
                    break;
                default:
                    qeo_log_e("unexpected event %s in state %s", client_event_to_str(event),
                              client_state_to_str(factory->fwd.u.client.state));
                    break;
            }
            break;
        case FWD_CLIENT_STATE_WAIT:
            switch (event) {
                case CLIENT_EVENT_TIMEOUT:
                    if (QEO_OK == client_start_timer(factory, 0)) {
                        factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT;
                    }
                    if (QEO_OK != fwd_get_list(factory)) {
                        qeo_log_e("error requesting list of forwarders");
                    }
                    break;
                case CLIENT_EVENT_LOC_SRV_DATA_RECEIVED:
                    fwd_client_reconfig(factory, locator, device_id);
                    factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT_READER;
                    break;
                case CLIENT_EVENT_FWD_DATA_RECEIVED:
                    fwd_client_reconfig(factory, locator, device_id);
                    DDS_Timer_stop(factory->fwd.timer);
                    factory->fwd.u.client.state = FWD_CLIENT_STATE_READY;
                    break;
                default:
                    qeo_log_e("unexpected event %s in state %s", client_event_to_str(event),
                              client_state_to_str(factory->fwd.u.client.state));
                    break;
            }
            break;
        case FWD_CLIENT_STATE_WAIT_READER:
            switch (event) {
                case CLIENT_EVENT_TIMEOUT:
                    if (QEO_OK == client_start_timer(factory, 0)) {
                        factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT;
                    }
                    fwd_locator_destroy(factory);
                    factory->fwd.device_id = -1;
                    if (QEO_OK != fwd_get_list(factory)) {
                        qeo_log_e("error requesting list of forwarders");
                    }
                    break;
                case CLIENT_EVENT_FWD_DATA_RECEIVED:
                    DDS_Timer_stop(factory->fwd.timer);
                    factory->fwd.u.client.state = FWD_CLIENT_STATE_READY;
                    if (factory->fwd.device_id != device_id) {
                        fwd_client_reconfig(factory, locator, device_id);
                    }
                    break;
                default:
                    qeo_log_e("unexpected event %s in state %s", client_event_to_str(event),
                              client_state_to_str(factory->fwd.u.client.state));
                    break;
            }
            break;
        case FWD_CLIENT_STATE_READY:
            switch (event) {
                case CLIENT_EVENT_FWD_DATA_REMOVED:
                    if (QEO_OK == client_start_timer(factory, 1)) {
                        factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT;
                    }
                    fwd_locator_destroy(factory);
                    factory->fwd.device_id = -1;
                    if (QEO_OK != fwd_get_list(factory)) {
                        qeo_log_e("error requesting list of forwarders");
                    }
                    break;
                default:
                    qeo_log_e("unexpected event %s in state %s", client_event_to_str(event),
                              client_state_to_str(factory->fwd.u.client.state));
                    break;
            }
            break;
    }
    qeo_log_i("new state %s", client_state_to_str(factory->fwd.u.client.state));
}
Example #5
0
/**
 * \pre This should be called with the factory lock taken.
 *
 * param[in] num_local Number of local forwarders discovered, -1 if not counted
 * param[in] timeout   True if a timeout occurred
 */
static qeo_retcode_t fwd_server_state_machine_eval_ul(qeo_factory_t *factory,
                                                      int num_local,
                                                      bool timeout,
                                                      bool public_ip_available)
{
    qeo_retcode_t rc = QEO_OK;

    qeo_log_i("old state %s : local fwd count = %d, timeout = %s, public ip available = %s",
              server_state_to_str(factory->fwd.u.server.state), num_local, bool2str(timeout), bool2str(public_ip_available));
    switch (factory->fwd.u.server.state) {
        case FWD_STATE_INIT: {
            /* done with initialization */
            int timeout = qeocore_parameter_get_number("FWD_WAIT_LOCAL_FWD");

            rc = ddsrc_to_qeorc(DDS_Timer_start(factory->fwd.timer, timeout, (uintptr_t)factory,
                                                fwd_server_timeout));
            if (QEO_OK != rc) {
                qeo_log_e("failed to start forwarder timer");
                break;
            }
            rc = qeocore_reader_enable(factory->fwd.reader);
            if (QEO_OK != rc) {
                qeo_log_e("failed to enable forwarder reader");
                break;
            }
            factory->fwd.u.server.state = FWD_STATE_WAIT_LOCAL;
            break;
        }
        case FWD_STATE_WAIT_LOCAL:
            /* done waiting for local forwarder */
            if (timeout) {
                /* no local forwarders found, try start forwarding ourselves */
                factory->fwd.u.server.state = FWD_STATE_STARTING;
                unlock(&factory->mutex);
                factory->listener.on_fwdfactory_get_public_locator(factory);
                lock(&factory->mutex);
            }
            else if (num_local > 0) {
                /* local forwarder(s) available stop timer */
                DDS_Timer_stop(factory->fwd.timer);
                factory->fwd.u.server.state = FWD_STATE_DISABLED;
            }
            break;
        case FWD_STATE_STARTING:
            /* done waiting for publicly available locator */
            if (num_local > 0) {
                factory->fwd.u.server.state = FWD_STATE_DISABLED;
            }
            else if (public_ip_available) {
                if (QEO_OK == fwd_server_start_forwarding(factory)) {
                    factory->fwd.u.server.state = FWD_STATE_ENABLED;
                }
                else {
                    /* failed to start */
                    factory->fwd.u.server.state = FWD_STATE_DISABLED;
                }
            }
            break;
        case FWD_STATE_ENABLED:
            if (public_ip_available) {
                if (QEO_OK == fwd_server_start_forwarding(factory)) {
                    factory->fwd.u.server.state = FWD_STATE_ENABLED;
                }
                else {
                    /* failed to start */
                    factory->fwd.u.server.state = FWD_STATE_DISABLED;
                }
            }
            break;
        case FWD_STATE_DISABLED:
            if (0 == num_local) {
                /* no local forwarders anymore, try start forwarding ourselves */
                factory->fwd.u.server.state = FWD_STATE_STARTING;
                unlock(&factory->mutex);
                factory->listener.on_fwdfactory_get_public_locator(factory);
                lock(&factory->mutex);
            }
            break;
    }
    qeo_log_i("new state %s", server_state_to_str(factory->fwd.u.server.state));
    return rc;
}