Exemple #1
0
t_osc_err osc_bundle_u_addressExists(t_osc_bndl_u *bndl, char *address, int fullmatch, int *res)
{
	*res = 0;
	t_osc_bndl_it_u *it = osc_bndl_it_u_get(bndl);
	while(osc_bndl_it_u_hasNext(it)){
		t_osc_msg_u *m = osc_bndl_it_u_next(it);
		int po, ao;
		char *a = osc_message_u_getAddress(m);
		if(!a){
			continue;
		}
		int r = osc_match(address, osc_message_u_getAddress(m), &po, &ao);
		if(fullmatch){
			if(r != (OSC_MATCH_ADDRESS_COMPLETE | OSC_MATCH_PATTERN_COMPLETE)){
				continue;
			}
		}else{
			if(r == 0 || (((r & OSC_MATCH_PATTERN_COMPLETE) == 0) && address[po] != '/')){
				continue;
			}
		}
		*res = 1;
		break;
	}
	osc_bndl_it_u_destroy(it);
	return OSC_ERR_NONE;
}
Exemple #2
0
int OSCMessage::match(const char * pattern, int addr_offset){
	int pattern_offset;
	int address_offset;
	int ret = osc_match((char *) msgData + addr_offset, pattern, &address_offset, &pattern_offset);
	char * next = (char *) msgData + addr_offset + address_offset;
	if (*next == '\0' || *next == '/'){
		if (ret) {
			return address_offset;
		}
	} else {
		return 0;
	}
}
Exemple #3
0
t_osc_msg_ar_u *osc_bundle_u_lookupAddress(t_osc_bndl_u *bndl, const char *address, int fullmatch)
{
	int matchbuflen = 16, n = 0;
	//t_osc_msg_u **matches = osc_mem_alloc(matchbuflen * sizeof(t_osc_msg_u *));
	t_osc_msg_ar_u *ar = osc_message_array_u_alloc(matchbuflen);
	osc_array_clear(ar);
	//memset(matches, '\0', matchbuflen * sizeof(t_osc_msg_u *));
	t_osc_bndl_it_u *it = osc_bndl_it_u_get(bndl);
	while(osc_bndl_it_u_hasNext(it)){
		if(n >= matchbuflen){
			//matches = osc_mem_resize(matches, (matchbuflen + 16) * sizeof(t_osc_msg_u *));
			t_osc_err e = osc_array_resize(ar, matchbuflen + 16);
			if(e){
				return NULL;
			}
			matchbuflen += 16;
		}
		t_osc_msg_u *current_message = osc_bndl_it_u_next(it);
		int po, ao;
		int r = osc_match(address, osc_message_u_getAddress(current_message), &po, &ao);
		if(fullmatch){
			if(r != (OSC_MATCH_ADDRESS_COMPLETE | OSC_MATCH_PATTERN_COMPLETE)){
				continue;
			}
		}else{
			if(r == 0 || (((r & OSC_MATCH_PATTERN_COMPLETE) == 0) && address[po] != '/')){
				continue;
			}
		}
		//osc_message_u_copy(matches + n++, current_message);
		t_osc_msg_u *p = osc_array_get(ar, n++);
		osc_message_u_deepCopy(&p, current_message);
	}
	osc_bndl_it_u_destroy(it);
	osc_array_resize(ar, n);
	return ar;
}
Exemple #4
0
bool OSCMessage::fullMatch(const char * pattern, int addr_offset){
	int pattern_offset;
	int address_offset;
	int ret = osc_match((char *) msgData + addr_offset, pattern, &address_offset, &pattern_offset);
	return (ret==3);
}
Exemple #5
0
void cheapCommRcv::update(){
	while(myosc.hasWaitingMessages()){
		// get the next message
		ofxOscMessage m;
		myosc.getNextMessage(&m);
		// check for mouse moved message
        //cout << m.getAddress()<<endl;
        
        //((testApp*)ofGetAppPtr());
        
        int pattrOffset =  0;
        int addrOffset  =  0;
        int matchResult1 = 0;
        int matchResult2 = 0;
        char* addr = (char*)(m.getAddress()).c_str();

   /*ir a escena */
        string pattern="/sync/*/start_event";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
        //cout << "matchresult aa"<< matchResult1 << endl;
        if(matchResult1==3){
            if(m.getAddress()=="/sync/electromagnetism/start_event")
                ((testApp*)ofGetAppPtr())->toScene(EM);
            if(m.getAddress()=="/sync/gravity/start_event")
                ((testApp*)ofGetAppPtr())->toScene(GRAVEDAD);
            if(m.getAddress()=="/sync/weak_nuclear/start_event")
                ((testApp*)ofGetAppPtr())->toScene(NUCLEAR_DEBIL);
            if(m.getAddress()=="/sync/strong_nuclear/start_event")
                ((testApp*)ofGetAppPtr())->toScene(NUCLEAR_FUERTE);
            if(m.getAddress()=="/sync/menu/start_event")
                ((testApp*)ofGetAppPtr())->toScene(MENU);
            //return;
           /* pattrOffset =  0;            addrOffset  =  0;            matchResult1 = 0;            matchResult2 = 0;
             addr = (char*)(m.getAddress()).c_str();
            myosc.getNextMessage(&m);
            */
        }
        
        pattern="/sync/*/end_event";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
        //cout << "matchresult aa"<< matchResult1 << endl;
        if(matchResult1==3){
            if(m.getAddress()=="/sync/electromagnetism/end_event")
                ((testApp*)ofGetAppPtr())->endScene(EM);
            if(m.getAddress()=="/sync/gravity/end_event")
                ((testApp*)ofGetAppPtr())->endScene(GRAVEDAD);
            if(m.getAddress()=="/sync/weak_nuclear/end_event")
                ((testApp*)ofGetAppPtr())->endScene(NUCLEAR_DEBIL);
            if(m.getAddress()=="/sync/strong_nuclear/end_event")
                ((testApp*)ofGetAppPtr())->endScene(NUCLEAR_FUERTE);
            if(m.getAddress()=="/sync/menu/end_event")
                ((testApp*)ofGetAppPtr())->endScene(MENU);
            //return;
        }
        
        /** si no dentro de cada escena recibe lo suyo **/
        
         pattern="/sync/electromagnetism";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
        if(matchResult1==2) {
            ((testApp*)ofGetAppPtr())->parseEmOsc(m.getAddress().substr(addrOffset),m );
            //return;
        }
        pattern="/sync/weak_nuclear";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
        if(matchResult1==2){ ((testApp*)ofGetAppPtr())->parseWeakOsc(m.getAddress().substr(addrOffset),m);
            //return;
        }
        
        pattern="/sync/strong_nuclear";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
        if(matchResult1==2){
            ((testApp*)ofGetAppPtr())->parseStrongOsc(m.getAddress().substr(addrOffset),m);
            //return;
        }
        
        pattern="/sync/gravity";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
        if(matchResult1==2){
            ((testApp*)ofGetAppPtr())->parseGravityOsc(m.getAddress().substr(addrOffset),m);
            //return;
        }
        
        pattern="/sync/menu";
        matchResult1 = osc_match(pattern.c_str(), addr, &pattrOffset, &addrOffset);
            if(matchResult1==2){
                ((testApp*)ofGetAppPtr())->parseMenuOsc(m.getAddress().substr(addrOffset),m);
                //return;
            }
     /*   cout << "matchresult"<< matchResult1 << endl;
        cout << "addrOffset"<< addrOffset << "     ";
        cout << "pattrOffset"<< m.getAddress().substr(addrOffset) << endl;
*/
    }
}
Exemple #6
0
void omax_object_createIOReport(t_object *x, t_symbol *msg, int argc, t_atom *argv, long *buflen, char **buf)
{
	t_symbol *classname = object_classname(x);
	if(!classname){
		return;
	}
	t_hashtab *ht = omax_class_getHashtab(classname->s_name);
	if(!ht){
		return;
	}
	long nkeys = 0;
	t_symbol **keys = NULL;
	hashtab_getkeys(ht, &nkeys, &keys);

	t_osc_bndl_u *bndl_u = osc_bundle_u_alloc();
	int i;
	for(i = 0; i < nkeys; i++){
		if(!osc_error_validateAddress(keys[i]->s_name)){
			int j;

			for(j = 0; j < argc; j++){
				t_atom *a = argv + j;
				if(atom_gettype(a) == A_SYM){
					int ret = 0;
					int ao, po;
					if(atom_getsym(a) == gensym("/*")){
						ret = OSC_MATCH_ADDRESS_COMPLETE;
					}else{
						ret = osc_match(atom_getsym(a)->s_name, keys[i]->s_name, &po, &ao);
					}
					if(ret && OSC_MATCH_ADDRESS_COMPLETE){
						t_omax_method *m = NULL;
						hashtab_lookup(ht, keys[i], (t_object **)(&m));
						if(!m){
							continue;
						}
						if(m->type == OMAX_PARAMETER){
							t_object *attr = object_attr_get(x, m->sym);
							long argc = 0;
							t_atom *argv = NULL;
							//m->m.m_fun(ob, attr, &argc, &argv);
							char getter[128];
							sprintf(getter, "get%s", m->sym->s_name);
							long get;
							method f = object_attr_method(x, gensym(getter), (void **)(&attr), &get);
							if(f){
								f(x, attr, &argc, &argv);
								if(argv){
									char address[128];
									sprintf(address, "/%s", m->sym->s_name);
									t_atom a[argc + 1];
									atom_setsym(a, gensym(address));
									memcpy(a + 1, argv, argc * sizeof(t_atom));

									t_osc_msg_u *msg_u = NULL;
									t_osc_err e = omax_util_maxAtomsToOSCMsg_u(&msg_u, ps_oscioreport, argc + 1, a);
									if(e){
										object_error((t_object *)x, "%s", osc_error_string(e));
										if(bndl_u){
											osc_bundle_u_free(bndl_u);
										}
										return;
									}
									osc_bundle_u_addMsg(bndl_u, msg_u);
									sysmem_freeptr(argv);
								}
							}
						}
					}
				}
			}
		}
	}
	//*buflen = pos;
	t_osc_bndl_s *bs = osc_bundle_u_serialize(bndl_u);
	if(bs){
		*buflen = osc_bundle_s_getLen(bs);
		*buf = osc_bundle_s_getPtr(bs);
		osc_bundle_s_free(bs);
	}
	if(bndl_u){
		osc_bundle_u_free(bndl_u);
	}
}
Exemple #7
0
void omax_FullPacketCallback(t_osc_msg_s *msg, void *context)
{
	t_context *c = (t_context *)context;
	int ao, po;
	char *msg_address = osc_message_s_getAddress(msg);
	int msg_argc = osc_message_s_getArgCount(msg);
	char *msg_ptr = osc_message_s_getPtr(msg);
	int msg_size = osc_message_s_getSize(msg);
	//if(osc_match(msg.address, c->osc_classname->s_name, &po, &ao)){
	if(1){
		// the first part of the address matches our class name, so this message is meant for us
		// now iterate through all of our message names and see if we get a match
		t_hashtab *ht = omax_class_getHashtab(c->classname->s_name);
		if(!ht){
			// oops...
			return;
		}
		long nkeys;
		t_symbol **keys = NULL;		
		hashtab_getkeys(ht, &nkeys, &keys);		
		int i;
		int matched = 0;
		for(i = 0; i < nkeys; i++){
			int r = osc_match(msg_address, keys[i]->s_name, &po, &ao);
			if(r == (OSC_MATCH_ADDRESS_COMPLETE | OSC_MATCH_PATTERN_COMPLETE)){
				matched++;
				// match
				// t_max_err object_method_typed(void *x, t_symbol *s, long ac, t_atom *av, t_atom *rv);
				t_atom rv;
				t_omax_method *m = NULL;
				long argc = 0;
				hashtab_lookup(ht, keys[i], (t_object **)(&m));
				if(m){
					switch(m->type){
					case OMAX_METHOD:
						{
							t_atom argv[msg_argc + 1];
							omax_util_oscMsg2MaxAtoms(msg, argv);
							object_method_typedfun(c->ob, (t_messlist *)(m->thing), ((t_messlist *)(m->thing))->m_sym, argc - 1, argv + 1, &rv);
						}
						break;
					case OMAX_PARAMETER:
						{
							t_object *attr = NULL;
							long get;
							method f = object_attr_method(c->ob, m->sym, (void **)(&attr), &get);
							t_atom argv[msg_argc + 1];
							omax_util_oscMsg2MaxAtoms(msg, argv);
							f(c->ob, attr, msg_argc, argv + 1);
							c->should_output_state = 1;
						}
						break;
					}
				}
			}
		}
		if(!matched){
			memcpy(c->buf + c->bufpos, msg_ptr, msg_size + 4);
			c->bufpos += (msg_size + 4);
		}
	}else{
		memcpy(c->buf + c->bufpos, msg_ptr, msg_size + 4);
		c->bufpos += (msg_size + 4);
	}
	
}