00001
00002
00003
00004
00005
00007
00009
00010
00011 #ifndef __OMax_date2state_MAX_API_
00012 #define __OMax_date2state_MAX_API_
00013
00014 #include "Oracle_data.hpp"
00015
00016 extern "C"
00017 {
00018
00019 #include "ext.h"
00020 #include "ext_obex.h"
00021 #include "jpatcher_api.h"
00022 #include "jgraphics.h"
00023
00024 #include "OMax.data.h"
00025
00030 typedef struct _OMax_date2state
00031 {
00032 t_object ob;
00033 t_symbol* oname;
00034 t_symbol* dataname;
00035 bool obound;
00036 O_DataType datatype;
00037 O_data* data;
00038 void* out;
00039 } t_OMax_date2state;
00040
00042
00044
00046
00047
00048 void *OMax_date2state_new(t_symbol *s, long argc, t_atom *argv);
00049 void OMax_date2state_free(t_OMax_date2state *x);
00050 void OMax_date2state_assist(t_OMax_date2state *x, void *b, long m, long a, char *s);
00051
00052
00053 void OMax_date2state_do(t_OMax_date2state *x, long date);
00054 void OMax_date2state_setname(t_OMax_date2state *x, t_symbol *newname);
00055
00056
00057 t_symbol * OMax_date2state_name(t_symbol * oname);
00058 bool OMax_date2state_bind(t_OMax_date2state *x);
00059
00060
00061 t_class *OMax_date2state_class;
00062
00064
00066
00067 int main(void)
00068 {
00069 t_class *c;
00070
00071 c = class_new("OMax.date2state", (method)OMax_date2state_new, (method)OMax_date2state_free, (long)sizeof(t_OMax_date2state),
00072 0L , A_GIMME, 0);
00073
00074
00075 class_addmethod(c, (method)OMax_date2state_assist,"assist",A_CANT, 0);
00076
00077
00078 class_addmethod(c, (method)OMax_date2state_do, "int", 0);
00079 class_addmethod(c, (method)OMax_date2state_setname, "set", A_DEFSYM, 0);
00080
00081 class_register(CLASS_BOX, c);
00082 OMax_date2state_class = c;
00083
00084 return 0;
00085 }
00086
00088
00089
00092 void *OMax_date2state_new(t_symbol *s, long argc, t_atom *argv)
00093 {
00094 t_OMax_date2state *x = NULL;
00095
00096
00097 if (x = (t_OMax_date2state *)object_alloc(OMax_date2state_class))
00098 {
00099
00100 x->out = intout(x);
00101
00103 x->obound = FALSE;
00104 if (argc == 0)
00105 object_error((t_object *)x,"Missing name of the Oracle data to read");
00106 else
00107 {
00108 if (argv->a_type != A_SYM)
00109 object_error((t_object *)x,"First argument must be a symbol (name of an existing Oracle)");
00110 else
00111 x->oname = atom_getsym(argv);
00112 }
00113
00114
00115 t_object *box;
00116 t_jrgba colorvals;
00117 jrgba_set(&colorvals, 0.30, 1.0, 0.15, 1.0);
00118 object_obex_lookup((t_object *)x, gensym("#B"), &box);
00119 jbox_set_color(box, &colorvals);
00120 }
00121 return (x);
00122 }
00123
00124
00127 void OMax_date2state_free(t_OMax_date2state *x)
00128 {
00129 ;
00130 }
00131
00134 void OMax_date2state_assist(t_OMax_date2state *x, void *b, long m, long a, char *s)
00135 {
00136 if (m == ASSIST_INLET) {
00137 sprintf(s, "date, set [symbol] changes sequence to read");
00138 }
00139 else {
00140 sprintf(s, "state number");
00141 }
00142 }
00143
00145
00147
00148
00151 t_symbol * OMax_date2state_name(t_symbol * oname)
00152 {
00153 char dataname[128];
00154 strcpy(dataname,oname->s_name);
00156 strcat(dataname,"_data");
00157 return gensym(dataname);
00158 }
00159
00162 bool OMax_date2state_bind(t_OMax_date2state *x)
00163 {
00165 if (x->obound == FALSE)
00166 {
00168 x->dataname = OMax_date2state_name(x->oname);
00169 if ((x->dataname->s_thing) && (ob_sym(x->dataname->s_thing) == gensym("OMax.data")))
00170 {
00171 x->data = &(((t_OMax_data*)(x->dataname->s_thing))->data);
00172
00173 x->obound = TRUE;
00175 x->datatype = ((t_OMax_data*)(x->dataname->s_thing))->datatype;
00176 }
00177 else
00178 {
00179 object_error((t_object *)x,"No data for Oracle %s declared", x->oname->s_name);
00180 }
00181 }
00182 return x->obound;
00183 }
00184
00186
00188
00189
00193 void OMax_date2state_do(t_OMax_date2state *x, long date)
00194 {
00195 if (OMax_date2state_bind(x))
00196 {
00197 ATOMIC_INCREMENT(&(((t_OMax_data *)(x->dataname->s_thing))->readcount));
00198 if(!(((t_OMax_data *)(x->dataname->s_thing))->wflag))
00199 {
00200 if (x->data->get_size()>0 && date>=0)
00201 {
00202 switch(x->datatype)
00203 {
00204 case LETTERS:
00205 outlet_int(x->out, date+1);
00206 break;
00207 default:
00208 outlet_int(x->out, x->data->get_state(date));
00209 break;
00210 }
00211 }
00212 }
00213 else
00214 object_error((t_object *)x,"Data of Oracle %s busy",x->oname->s_name);
00215 ATOMIC_DECREMENT(&(((t_OMax_data *)(x->dataname->s_thing))->readcount));
00216 }
00217 }
00218
00222 void OMax_date2state_setname(t_OMax_date2state *x, t_symbol *s)
00223 {
00224 x->oname = s;
00225 x->obound = FALSE;
00226 OMax_date2state_bind(x);
00227 }
00228
00230 }
00231
00232 #endif