PmReturn_t nat_sample_init(pPmFrame_t *ppframe) { /* Set port A pins as all outputs */ DDRA = 0xFF; NATIVE_SET_TOS(PM_NONE); return PM_RET_OK; }
/*----------------------------------------------------------------------------*/ PmReturn_t tres_pm_get_state(pPmFrame_t *ppframe) { PmReturn_t retv = PM_RET_OK; pPmObj_t pobj; pPmObj_t pobj_new; pPmInstance_t pcli; pPmDict_t pdict; int16_t index; float fval; int32_t ival; if(NATIVE_GET_NUM_ARGS() != 1) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } pobj = NATIVE_GET_LOCAL(0); if(OBJ_GET_TYPE(pobj) != OBJ_TYPE_CLI) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } pcli = (pPmInstance_t)pobj; pdict = pcli->cli_attrs; if(*tres_pm_io.state_len > 0) { // restore each attribute of the object for(index = pdict->length - 1; index >= 0; index--) { seglist_getItem(pdict->d_keys, index, &pobj); retv = seglist_getItem(pdict->d_vals, index, &pobj); PM_RETURN_IF_ERROR(retv); switch (OBJ_GET_TYPE(pobj)) { case OBJ_TYPE_INT: //pop int pop_int(&ival); retv = int_new(ival, &pobj_new); break; case OBJ_TYPE_FLT: //pop float pop_float(&fval); retv = float_new(fval, &pobj_new); break; default: /* Raise TypeError */ PM_RAISE(retv, PM_RET_EX_TYPE); } if (retv == PM_RET_OK) { seglist_setItem(pdict->d_vals, pobj_new, index); } } } NATIVE_SET_TOS((pPmObj_t)pcli); return retv; }
PmReturn_t nat_t002_push42(pPmFrame_t *ppframe) { pPmObj_t pint = C_NULL; PmReturn_t retval; retval = int_new((int32_t)42, &pint); NATIVE_SET_TOS(pint); return retval; }
/*----------------------------------------------------------------------------*/ PmReturn_t tres_pm_get_input_tag(pPmFrame_t *ppframe) { PmReturn_t retv = PM_RET_OK; pPmObj_t r_pstring; char **paddr; paddr = &tres_pm_io.tag; retv = string_new(paddr, &r_pstring); NATIVE_SET_TOS(r_pstring); return retv; }
// FIXME: this function will be be removed when JSON will be used PmReturn_t tres_pm_get_int_input(pPmFrame_t *ppframe) { PmReturn_t retv = PM_RET_OK; pPmObj_t r_pint; int32_t val; val = (int32_t)strtol(tres_pm_io.in, NULL, 10); retv = int_new(val, &r_pint); NATIVE_SET_TOS(r_pint); return retv; }
// FIXME: this function will be be removed when JSON will be used PmReturn_t tres_pm_get_float_input(pPmFrame_t *ppframe) { PmReturn_t retv = PM_RET_OK; pPmObj_t r_pflt; float val; val = simple_atof(tres_pm_io.in); //val = (float) strtod(tres_pm_io.in, NULL); retv = float_new(val, &r_pflt); NATIVE_SET_TOS(r_pflt); return retv; }
/*----------------------------------------------------------------------------*/ PmReturn_t tres_pm_state_pop(pPmFrame_t *ppframe) { PmReturn_t retv = PM_RET_OK; pPmObj_t r_pflt; pPmObj_t pa; float fval; int32_t ival; int pop_retv; /* Raise TypeError if wrong number of args */ pa = NATIVE_GET_LOCAL(0); if(NATIVE_GET_NUM_ARGS() != 1) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } switch (OBJ_GET_TYPE(pa)) { //case OBJ_TYPE_STR: // ptr = (char const *)&(((pPmString_t)pa)->val); // // TODO: unimplemented // break; case OBJ_TYPE_INT: pop_retv = pop_int(&ival); if(pop_retv != TRES_ERR_NONE) { ival = ((pPmInt_t) pa)->val; } retv = int_new(ival, &r_pflt); break; case OBJ_TYPE_FLT: pop_retv = pop_float(&fval); if(pop_retv != TRES_ERR_NONE) { fval = ((pPmFloat_t) pa)->val; } retv = float_new(fval, &r_pflt); break; default: /* Raise TypeError */ PM_RAISE(retv, PM_RET_EX_TYPE); } NATIVE_SET_TOS(r_pflt); return retv; }
/*----------------------------------------------------------------------------*/ PmReturn_t tres_pm_set_output(pPmFrame_t *ppframe) { const char *ptr; int32_t ival; float fval; PmReturn_t retv = PM_RET_OK; pPmObj_t pa; /* Raise TypeError if wrong number of args */ if(NATIVE_GET_NUM_ARGS() != 1) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } pa = NATIVE_GET_LOCAL(0); switch (OBJ_GET_TYPE(pa)) { case OBJ_TYPE_STR: ptr = (char const *)&(((pPmString_t) pa)->val); snprintf(tres_pm_io.out, REST_MAX_CHUNK_SIZE, "%s", ptr); break; case OBJ_TYPE_INT: ival = ((pPmInt_t) pa)->val; snprintf(tres_pm_io.out, REST_MAX_CHUNK_SIZE, "%" PRId32, ival); break; case OBJ_TYPE_FLT: fval = ((pPmFloat_t) pa)->val; // we cannot use snprintf: float are not supported //snprintf(tres_pm_io.out, REST_MAX_CHUNK_SIZE, "%f", fval); //therefore we use pymite sli_ftoa, which, however requires a buffer => 15 if(REST_MAX_CHUNK_SIZE >= 15) { sli_ftoa(fval, (uint8_t *)tres_pm_io.out, REST_MAX_CHUNK_SIZE); } break; default: /* Raise TypeError */ PM_RAISE(retv, PM_RET_EX_TYPE); } tres_pm_io.output_set = 1; NATIVE_SET_TOS(PM_NONE); return retv; }
/*----------------------------------------------------------------------------*/ PmReturn_t tres_pm_save_state(pPmFrame_t *ppframe) { PmReturn_t retv = PM_RET_OK; pPmObj_t pobj; pPmInstance_t pcli; pPmDict_t pdict; uint16_t index; if(NATIVE_GET_NUM_ARGS() != 1) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } pobj = NATIVE_GET_LOCAL(0); if(OBJ_GET_TYPE(pobj) != OBJ_TYPE_CLI) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } pcli = (pPmInstance_t)pobj; pdict = pcli->cli_attrs; // store each attribute of the object for(index = 0; index < pdict->length; index++) { seglist_getItem(pdict->d_keys, index, &pobj); retv = seglist_getItem(pdict->d_vals, index, &pobj); PM_RETURN_IF_ERROR(retv); switch (OBJ_GET_TYPE(pobj)) { case OBJ_TYPE_INT: push_int(((pPmInt_t) pobj)->val); break; case OBJ_TYPE_FLT: push_float(((pPmFloat_t) pobj)->val); break; } } NATIVE_SET_TOS(PM_NONE); return retv; }
/*----------------------------------------------------------------------------*/ PmReturn_t tres_pm_state_push(pPmFrame_t *ppframe) { //const char *ptr; int32_t ival; float fval; PmReturn_t retv = PM_RET_OK; pPmObj_t pa; /* Raise TypeError if wrong number of args */ pa = NATIVE_GET_LOCAL(0); if(NATIVE_GET_NUM_ARGS() != 1) { PM_RAISE(retv, PM_RET_EX_TYPE); return retv; } switch (OBJ_GET_TYPE(pa)) { //case OBJ_TYPE_STR: // ptr = (char const *)&(((pPmString_t)pa)->val); // // TODO: unimplemented // break; case OBJ_TYPE_INT: ival = ((pPmInt_t) pa)->val; push_int(ival); break; case OBJ_TYPE_FLT: fval = ((pPmFloat_t) pa)->val; push_float(fval); break; default: /* Raise TypeError */ PM_RAISE(retv, PM_RET_EX_TYPE); } NATIVE_SET_TOS(PM_NONE); return retv; }