Ejemplo n.º 1
0
EventWrapper DataFileIndexer::EventsIterator::getNextEvent() {
    EventWrapper event;
    
    while (current_event_block < matching_event_blocks.size()) {
        if ((current_relative_event == dfi.events_per_block) || (current_datum == NULL)) {
            // Advance to the next block
            scarab_seek(dfi.session, matching_event_blocks[current_event_block]->blockOffset(), SEEK_SET);
            current_relative_event = 0;
        }
        
        // Read through the event block
		while (event.empty() && (current_relative_event < dfi.events_per_block) && (current_datum = scarab_read(dfi.session)))
        {
            if (!DataFileUtilities::isScarabEvent(current_datum)) {
                // Skip invalid events
                scarab_free_datum(current_datum);
                continue;
            }
            
			MWTime event_time = DataFileUtilities::getScarabEventTime(current_datum);
			
            // Check the time criterion
            if (event_time >= lower_bound && event_time <= upper_bound) {
				unsigned int event_code = DataFileUtilities::getScarabEventCode(current_datum);
				
                // Check if the event code matches
                if (event_codes_to_match.empty() ||
                    (event_codes_to_match.find(event_code) != event_codes_to_match.end()))
                {
                    event = EventWrapper(current_datum);
                }
			}
			
			scarab_free_datum(current_datum);
			current_relative_event++;
		}
        
        if ((current_relative_event == dfi.events_per_block) || (current_datum == NULL))
            current_event_block++;
        
        if (!event.empty())
            return event;
    }
    
    return event;
}
Ejemplo n.º 2
0
void DataFileIndexer::getEvents(std::vector<EventWrapper> &return_vector,
                                const std::set<unsigned int> &event_codes_to_match,
                                MWTime lower_bound,
                                MWTime upper_bound) const
{
    EventsIterator ei = getEventsIterator(event_codes_to_match, lower_bound, upper_bound);
    while (true) {
        EventWrapper event = ei.getNextEvent();
        if (event.empty())
            break;
        return_vector.push_back(event);
    }
}
Ejemplo n.º 3
0
BEGIN_NAMESPACE_MW_MATLAB


void getEvents(MEXInputs &inputs, MEXOutputs &outputs)
{
    boost::filesystem::path filename;
    std::set<unsigned int> event_codes;
    MWTime lower_bound, upper_bound;
    
    inputs >> filename >> event_codes >> lower_bound >> upper_bound;
    
    std::vector<int> codes;
    std::vector<MWTime> times;
    boost::container::vector<ArrayPtr> values;
    
    try {
        dfindex dfi(filename);
        DataFileIndexer::EventsIterator ei = dfi.getEventsIterator(event_codes, lower_bound,  upper_bound);
        while (true) {
            EventWrapper event = ei.getNextEvent();
            if (event.empty())
                break;
            codes.push_back(event.getEventCode());
            times.push_back(event.getTime());
            values.push_back(convertDatumToArray(scarabDatumToDatum(event.getPayload())));
        }
    } catch (const DataFileIndexerError &e) {
        throwMATLABError("MWorks:DataFileIndexerError", e.what());
    }
    
    if (outputs.count() == 3) {
        outputs << codes;
        outputs << times;
        outputs << values;
    } else {
        const char *fieldNames[] = {"event_code", "time_us", "data"};
        ArrayPtr result(throw_if_null, mxCreateStructMatrix(1, int(codes.size()), 3, fieldNames));
        
        for (std::size_t i = 0; i < codes.size(); i++) {
            mxSetFieldByNumber(result.get(), i, 0, Array::createScalar(codes[i]).release());
            mxSetFieldByNumber(result.get(), i, 1, Array::createScalar(times[i]).release());
            mxSetFieldByNumber(result.get(), i, 2, values[i].release());
        }
        
        outputs << std::move(result);
    }
    
}