int main(){ circular_array *c = createArray(7); for(int i = 0; i < 7; ++i){ ca_set(c, i, i); } int isCorrect = 0; //Check for(int i = 0; i < 7; ++i){ if(ca_get(c, i) != i){ isCorrect = 1; printf("Failure in Circular array, piecewise, function access. Should be %d, is %f\n", i, ca_get(c, i)); } if(c->arr[i] != i){ isCorrect = 1; printf("Failure in Circular array, piecewise, raw access. Should be %d, is %f\n", i, ca_get(c, i)); } } for(int i = 7; i < 14; ++i){ double testVal = i - 7.0; if(ca_get(c, i) != testVal){ isCorrect = 1; printf("Failure in Circular array, piecewise, function access, overflow. Should be %f, is %f\n", testVal, ca_get(c, i)); } } return isCorrect; }
int readtag(cUINT utype, chid searchID) { cUINT type; switch(utype) { case T_CIP_INT: type = DBR_INT; ca_get(type, searchID, &iDATA); break; case T_CIP_DINT: type = DBR_DOUBLE; ca_get(type, searchID, &dblDATA); break; case T_CIP_REAL: type = DBR_FLOAT; ca_get(type, searchID, &fltDATA); break; case T_CIP_BITS: type = T_CIP_DINT; ca_get(type, searchID, &fltDATA); break; } istatus = ca_pend_io(0.1); if(istatus != 1) return 0; return 1; }
void print_integral(Integral integral) { int plus = 0; unsigned i; if (ratfun_zero(integral.integrand)) { printf("0\n"); return; } if (!ratfun_zero(integral.rational_part)){ print_ratfun(integral.rational_part); plus = 1; } if (!coef_zero(integral.poly_part)) { if (plus) { printf(" + "); } print_coefficient(integral.poly_part); plus = 1; } /* print explicit sums */ if (integral.QiS.size > 0) { for (i = 0; i < integral.QiS.size; ++i) { if (plus) { printf(" + "); } if (!coef_one(ca_get(&integral.QiS, i))) { print_coefficient(ca_get(&integral.QiS, i)); printf("*ln("); } else { printf("ln("); } print_coefficient(ca_get(&integral.SiS, i)); printf(")"); plus = 1; } } /* print sums over roots */ if (integral.Qi.size > 0) { for (i = 0; i < integral.Qi.size; ++i) { if (plus) { printf(" + "); } printf("sum(%c | ", integral.newvar); print_coefficient(ca_get(&integral.Qi, i)); printf(" = 0) %c*ln(", integral.newvar); print_coefficient(ca_get(&integral.Si, i)); printf(")"); plus = 1; } } printf("\n"); }
int main(int argc,char **argv) { int indval,field; SEVCHK(ca_task_initialize(),"ca_task_initialize"); SEVCHK(ca_search("enumCputDTYP",&putCchid[0]),"ca_search failure"); SEVCHK(ca_search("enumCputPRIO",&putCchid[1]),"ca_search failure"); SEVCHK(ca_search("enumCputVAL" ,&putCchid[2]),"ca_search failure"); SEVCHK(ca_search("enumMDbputDTYP",&putMDbchid[0]),"ca_search failure"); SEVCHK(ca_search("enumMDbputPRIO",&putMDbchid[1]),"ca_search failure"); SEVCHK(ca_search("enumMDbputVAL" ,&putMDbchid[2]),"ca_search failure"); SEVCHK(ca_search("enumMCaputDTYP",&putMCachid[0]),"ca_search failure"); SEVCHK(ca_search("enumMCaputPRIO",&putMCachid[1]),"ca_search failure"); SEVCHK(ca_search("enumMCaputVAL" ,&putMCachid[2]),"ca_search failure"); SEVCHK(ca_search("enumCmbbi.DTYP" ,&getCchid[0]),"ca_search failure"); SEVCHK(ca_search("enumCmbbi.PRIO" ,&getCchid[1]),"ca_search failure"); SEVCHK(ca_search("enumCmbbi.VAL" ,&getCchid[2]),"ca_search failure"); SEVCHK(ca_search("enumMDbmbbi.DTYP" ,&getMDbchid[0]),"ca_search failure"); SEVCHK(ca_search("enumMDbmbbi.PRIO" ,&getMDbchid[1]),"ca_search failure"); SEVCHK(ca_search("enumMDbmbbi.VAL" ,&getMDbchid[2]),"ca_search failure"); SEVCHK(ca_search("enumMCambbi.DTYP" ,&getMCachid[0]),"ca_search failure"); SEVCHK(ca_search("enumMCambbi.PRIO" ,&getMCachid[1]),"ca_search failure"); SEVCHK(ca_search("enumMCambbi.VAL" ,&getMCachid[2]),"ca_search failure"); SEVCHK(ca_pend_io(5.0),"ca_pend_io failure"); for(indval=0; indval<2; indval++) { SEVCHK(ca_put(DBR_STRING,putCchid[0],dtypValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putCchid[1],prioValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putCchid[2],valValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putMDbchid[0],dtypValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putMDbchid[1],prioValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putMDbchid[2],valValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putMCachid[0],dtypValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putMCachid[1],prioValue[indval]),"ca_put"); SEVCHK(ca_put(DBR_STRING,putMCachid[2],valValue[indval]),"ca_put"); /*Wait until evertthing updated*/ ca_pend_event(2.0); for(field=0; field<3; field++) { SEVCHK(ca_get(DBR_STRING,getCchid[field],&getCvalue[field]), "ca_get"); SEVCHK(ca_get(DBR_STRING,getMDbchid[field],&getMDbvalue[field]), "ca_get"); SEVCHK(ca_get(DBR_STRING,getMCachid[field],&getMCavalue[field]), "ca_get"); } SEVCHK(ca_pend_io(5.0),"ca_pend_io failure"); printReport(indval); } return(0); }
void * steal(ws_deque *q) { long int t = (long int) g_atomic_pointer_get(&(q->top)); long int b = q->bottom; circular_array * a = q->active_array; long int size = b - t; if( size <= 0 ) { return NULL; } void *value = ca_get(a, t); long int new_t = t + 1; // top stuff gboolean cas = g_atomic_pointer_compare_and_exchange((void * volatile*)&(q->top), (void*)t, (void*)new_t); if( !cas ) { return NULL; } return value; }
static int CACommand(string strcmd) { #if 0 //In event callback function, It' dosen't work ca_get() function. I don't understand the reason. struct dbr_time_long shotdata; chid shot_id; ca_create_channel("CCS_SHOT_NUMBER",NULL, NULL,20,&shot_id); ca_pend_io(1.0); int state = ca_state(shot_id); printf("State:%d\n", state); ca_get(DBR_TIME_LONG, shot_id, (void *)&shotdata); int status = ca_pend_io(1.0); if(status != ECA_NORMAL) { fprintf(stdout, "SHOT number: %s denied access\n",ca_name(shot_id)); return; }; fprintf(stdout, "%s:%d\n",ca_name(shot_id),shotdata.value); #else FILE *fp= popen (strcmd.c_str(), "r"); char buf[20]; while (fgets (buf, sizeof(buf), fp) ) {}; pclose(fp); return ((strcmd.compare("ShotNum")== 0)?atoi(buf):0); #endif }
static void ca_read_process(MSFilter *f){ CAData *d = (CAData *) f->data; mblk_t *m; while((m=ca_get(d))!=NULL){ ms_queue_put(f->outputs[0],m); } }
circular_array * ca_grow(circular_array *a, long int b, long int t) { circular_array *na = ca_build(a->log_size + 1); for (long int i = t; i < b; i++) { ca_put(na, i, ca_get(a, i)); } return na; }
void * pop_bottom(ws_deque *q) { long int b = q->bottom; circular_array *a = q->active_array; b = b - 1; q->bottom = b; long int t = (long int) g_atomic_pointer_get(&(q->top)); long int size = b - t; long int zero = 0; if(size < zero) { q->bottom = t; return NULL; } void *value = ca_get(a, b); if(size > 0) { return value; } // this is the case for exactly one element, this is now the top so act accordingly long int new_t = t+1; gboolean cas = g_atomic_pointer_compare_and_exchange((void * volatile*)&(q->top), (void*)t, (void*)new_t); if( !cas ) { value = NULL; } q->bottom = t+1; return value; }
void print_integral_LaTeX(Integral integral) { int plus = 0; unsigned i; printf("\\int \\! "); print_ratfun_LaTeX(integral.integrand); printf(" \\, d%c = ", integral.var); if (ratfun_zero(integral.integrand)) { printf("0\n"); return; } if (!ratfun_zero(integral.rational_part)){ print_ratfun_LaTeX(integral.rational_part); plus = 1; } if (!coef_zero(integral.poly_part)) { if (plus) { printf(" + "); } print_coefficient_LaTeX(integral.poly_part); plus = 1; } /* print explicit sums */ if (integral.QiS.size > 0) { for (i = 0; i < integral.QiS.size; ++i) { if (plus) { if (!coef_neg(ca_get(&integral.QiS, i))) { printf(" + "); } else { printf(" - "); } } if (!coef_one2(ca_get(&integral.QiS, i))) { print_coefficient_LaTeX2(ca_get(&integral.QiS, i), 1); printf("\\ln("); } else if (coef_neg(ca_get(&integral.QiS, i)) && coef_one2(ca_get(&integral.QiS, i))) { printf("-\\ln("); } else { printf("\\ln("); } print_coefficient_LaTeX(ca_get(&integral.SiS, i)); printf(")"); plus = 1; } } /* print sums over roots */ if (integral.Qi.size > 0) { for (i = 0; i < integral.Qi.size; ++i) { if (plus) { printf(" + "); } printf("\\sum_{%c | ", integral.newvar); print_coefficient_LaTeX(ca_get(&integral.Qi, i)); printf(" = 0} %c \\ln(", integral.newvar); print_coefficient_LaTeX(ca_get(&integral.Si, i)); printf(")"); plus = 1; } } printf("\n"); }
void IntegrateRationalFunction(node_type *root, char var, char newvar, int trace) { RatFun A, h, content; Coefficient R = {special}, rat_part = {rational}, solution = {special}; Coefficient *Qit = NULL, *Sit = NULL; Coefficient Qit2 = {special}, Sit2 = {special}; Integral integral; unsigned i; init_ratfun(&A); init_ratfun(&h); init_ratfun(&content); init_bigrat(&rat_part.u.rat); init_integral(&integral); if (root->type != ratfun_type) { printf("Error! IntegrateRationalFunction" "requires a rational function.\n"); return; } copy_ratfun(&integral.integrand, root->u.ratfun); integral.var = var; integral.newvar = newvar; if (ratfun_zero(integral.integrand)) { goto print; } /* make numerator and denominator primitive */ coef_content(&content.num, root->u.ratfun.num, var); exact_div_coefficients(&root->u.ratfun.num, root->u.ratfun.num, content.num); coef_content(&content.den, root->u.ratfun.den, var); exact_div_coefficients(&root->u.ratfun.den, root->u.ratfun.den, content.den); if (trace) { printf("Computing rational part of integral using " "Hermite reduction...\n"); WAIT; } HermiteReduce(&integral.rational_part, &h, root->u.ratfun, var, trace); /* put contents back on */ /* PRINTR(content); */ mul_ratfuns(&integral.rational_part, integral.rational_part, content); mul_ratfuns(&h, h, content); /* PRINTR(h); */ if (trace) { printf("Found rational part:\t\t"); print_ratfun(integral.rational_part); printf("\n"); printf("\nHermite reduction leaves:\t"); print_ratfun(h); printf("\n"); WAIT; printf("Remove polynomial part...\n"); WAIT; } polydiv_coefficients(&integral.poly_part, &R, h.num, h.den); if (trace) { printf("Polynomial part:\t\t"); print_coefficient(integral.poly_part); printf("\n"); } coef_integrate(&integral.poly_part, integral.poly_part, var); if (trace) { printf("Integrate it:\t\t\t"); print_coefficient(integral.poly_part); printf("\n"); WAIT; printf("Left over:\t\t\t"); print_coefficient(R); printf("/"); print_coefficient(h.den); printf("\n"); } if (!coef_zero(R) && coef_deg(h.den, var) > coef_deg(R, var)) { if (trace) { printf("\nComputing logarithmic part using " "Lazard-Rioboo-Trager algorithm...\n"); WAIT; } IntRationalLogPart(&integral.Qi, &integral.Si, R, h.den, var, newvar, trace); /* make Qi and Si primitive */ for (i = 0; i < integral.Qi.size; ++i) { Qit = ca_get2(&integral.Qi, i); Sit = ca_get2(&integral.Si, i); rat_part.u.rat = coef_rat_part(*Qit); mul_coefficients(Qit, *Qit, rat_part); free_bigrat(&rat_part.u.rat); /* rat_part.u.rat = coef_rat_part(*Sit); */ /* mul_coefficients(Sit, *Sit, rat_part); */ /* free_bigrat(&rat_part.u.rat); */ coef_pp(Qit, *Qit, newvar); /* coef_pp(Sit, *Sit, var); */ } if (trace) { printf("Found logarithmic part.\n"); printf("%d sum(s) over roots:\t\t", integral.Qi.size); if (integral.Qi.size > 0) { for (i = 0; i < integral.Qi.size; ++i) { printf("sum(%c | ", integral.newvar); print_coefficient(ca_get(&integral.Qi, i)); printf(" = 0) %c*ln(", integral.newvar); print_coefficient(ca_get(&integral.Si, i)); printf(")"); if (i < integral.Qi.size-1) { printf(" + "); } } } printf("\n"); WAIT; printf("Solve the linear univariate Qis to get explicit sums...\n"); } /* solve linear univariate Qis */ for (i = 0; i < integral.Qi.size; ++i) { if (coef_deg(ca_get(&integral.Qi, i), newvar) != 1 || !poly_univar(ca_get(&integral.Qi, i).u.poly)) { continue; } solve_linear_poly(&solution, ca_get(&integral.Qi, i).u.poly); subst_var_coef(ca_get2(&integral.Si, i), solution, newvar); /* move to solved arrays */ ca_push_back(&integral.QiS, solution); ca_push_back(&integral.SiS, ca_get(&integral.Si, i)); /* remove from normal arrays */ Qit2 = ca_remove(&integral.Qi, i); Sit2 = ca_remove(&integral.Si, i); free_coefficient(&Qit2); free_coefficient(&Sit2); --i; } /* make SiS primitive */ for (i = 0; i < integral.SiS.size; ++i) { Sit = ca_get2(&integral.SiS, i); rat_part.u.rat = coef_rat_part(*Sit); mul_coefficients(Sit, *Sit, rat_part); free_bigrat(&rat_part.u.rat); coef_pp(Sit, *Sit, var); } if (trace) { printf("Found %d explicit sum(s):\t", integral.QiS.size); if (integral.QiS.size > 0) { for (i = 0; i < integral.QiS.size; ++i) { if (!coef_one(ca_get(&integral.QiS, i))) { print_coefficient(ca_get(&integral.QiS, i)); printf("*ln("); } else { printf("ln("); } print_coefficient(ca_get(&integral.SiS, i)); printf(")"); if (i < integral.QiS.size-1) { printf(" + "); } } } printf("\n"); WAIT; } } else if (coef_deg(h.den, var) == 0) { /* this is actually just a poly over a constant, * so integrate it trivially */ coef_integrate(&R, R, var); /* move this to the numerator of h */ free_coefficient(&h.num); h.num = R; R.type = special; /* add h to the rational part of integral */ add_ratfuns(&integral.rational_part, integral.rational_part, h); } else { /* this shouldn't happen */ printf("Error! Invalid ratfun following Hermite reduction!\n"); PRINTR(h); printf("\n"); PRINTC(R); printf("\n"); } print: if (trace) { printf("\nFinal answer:\n"); } print_integral(integral); printf("\nLaTeX format:\n"); print_integral_LaTeX(integral); free_ratfun(&A); free_ratfun(&h); free_ratfun(&content); free_coefficient(&R); free_integral(&integral); }
void SinglePlotThread::run() { #if 0 // event gathering //printchannel(); //for Debug mutex.lock(); mynode.plot = m_plot; chid unit_chid; dbr_string_t units; QString unitch = m_pvname + ".EGU"; ca_create_channel(unitch.toStdString().c_str(), 0, 0, 0, &unit_chid); ca_pend_io(0.1); ca_get(DBR_STRING, unit_chid, (void *)&units); ca_pend_io(0.1); m_plot->SetUnit(units); ca_create_channel(m_pvname.toStdString().c_str(), connectionCallback, &mynode, 0, (oldChannelNotify**)&mynode.mychid); ca_replace_access_rights_event(mynode.mychid, accessRightsCallback); ca_create_subscription (DBR_TIME_DOUBLE, 0, mynode.mychid, DBE_VALUE|DBE_ALARM, eventCallback, &mynode, &mynode.myevid); //ca_add_event(DBR_GR_DOUBLE, mynode.mychid, eventCallback, &mynode, &mynode.myevid); mutex.unlock(); ca_pend_event(0.0); #else //periodic gathering mutex.lock(); chid unit_chid, val_chid; dbr_string_t units; QString unitch = m_pvname + ".EGU"; ca_create_channel(unitch.toStdString().c_str(), 0, 0, 0, &unit_chid); ca_pend_io(0.2); ca_get(DBR_STRING, unit_chid, (void *)&units); ca_pend_io(0.2); m_plot->SetUnit(units); struct dbr_time_double data; ca_create_channel(m_pvname.toStdString().c_str(), 0, 0, 0, &val_chid); ca_pend_io(0.2); epicsTime stamp; struct local_tm_nano_sec tm; int totsec = 0; //for periodic single plot local time int year, month, day, hour, min, sec; int factor = 1; switch(mperiodic) { case PointOne: factor *= 0.1; break; case PointFive: factor *= 0.5; break; case FiveSec: factor *= 5; break; case TenSec: factor *= 10; break; case OneSec: default: break; }; while(getStop()==false) { ca_get(DBR_TIME_DOUBLE, val_chid, (void *)&data); ca_pend_io(0.2); //qDebug("%s : %f\n",ca_name(val_chid), data.value); Epoch2Datetime(year, month, day, hour, min, sec); #if 0 stamp = data.stamp; tm = (local_tm_nano_sec) stamp; totsec = tm.ansi_tm.tm_hour*3600+tm.ansi_tm.tm_min*60+tm.ansi_tm.tm_sec; m_plot->GetValue(data.value, totsec,tm.ansi_tm.tm_year,tm.ansi_tm.tm_mon, tm.ansi_tm.tm_mday ); #else totsec = hour*3600+min*60+sec; m_plot->GetValue(data.value, totsec, year, month, day); #endif usleep(1000000*factor); }; //ca_clear_channel(unit_chid); //ca_clear_channel(val_chid); ca_context_destroy(); mutex.unlock(); exit(); qDebug("SinglePlot Exit"); #endif }