void SetTelliepulser(client *c, int argc, sds *argv) { float rate=0, length=0; uint32_t nPulse=0; safe_strtof(argv[1],&rate); safe_strtof(argv[2],&length); safe_strtoul(argv[3],&nPulse); int ret= Pulser(rate,length,nPulse,MappedTPulserBaseAddress); if(ret == 0) addReplyStatus(c, "+OK"); else addReplyError(c, tubii_err);; }
void SetMZHappyPulser(client *c, int argc, sds *argv) { // For Ian's debugging purposes, MZHappy can also be used as a pulser float rate=0, length=0; uint32_t nPulse=0; safe_strtof(argv[1],&rate); safe_strtof(argv[2],&length); safe_strtoul(argv[3],&nPulse); int ret= Pulser(rate,length,nPulse,MappedHappyBaseAddress); if(ret == 0) addReplyStatus(c, "+OK"); else addReplyError(c, tubii_err); }
void gtdelay(client *c, int argc, sds *argv) { float length=0; safe_strtof(argv[1],&length); u32 delay = length*ns; int ret= Delay(delay,MappedGTDelayBaseAddress); if(ret == 0) addReplyStatus(c, "+OK"); else addReplyError(c, tubii_err); }
void SetPrescaleTrigger(client *c, int argc, sds *argv) { float rate; uint32_t bit; safe_strtof(argv[1],&rate); safe_strtoul(argv[2],&bit); if(prescaleTrig(rate,bit) == 0) addReplyStatus(c, "+OK"); else addReplyError(c, tubii_err); }
void SetTrigWordDelay(client *c, int argc, sds *argv) { float length=0; safe_strtof(argv[1],&length); u32 delay = length*ns; int ret= TrigWordDelay(delay); if(ret!=0){ addReplyError(c, tubii_err); return; } addReplyStatus(c, "+OK"); }
// ELLIE commands void SetGenericpulser(client *c, int argc, sds *argv) { // Need to sync. create pulse and delay it async. float rate=0, length=0; uint32_t nPulse=0; safe_strtof(argv[1],&rate); safe_strtof(argv[2],&length); safe_strtoul(argv[3],&nPulse); // 1. Create Pulse int ret1= Pulser(rate,length,nPulse,MappedPulserBaseAddress); if(ret1!=0){ addReplyError(c, tubii_err); return; } // 2. Delay Pulse /*int ret2= Muxer("4"); int ret3= LoadShift(argv[1]); */ addReplyStatus(c, "+OK"); }
void SetGenericdelay(client *c, int argc, sds *argv) { // 1. Need to split argument into the sync part and async part // Something like multiples of 10 go to sync and ones go to async float length=0; safe_strtof(argv[1],&length); u32 delay = length*ns; // 2. Sync part int ret1= Delay(delay,MappedDelayBaseAddress); if(ret1 != 0){ addReplyError(c, tubii_err); return; } // 3. Async part to shift reg: //int ret2= Muxer("5"); //int ret3= LoadShift(argv[1]); addReplyStatus(c, "+OK"); }
char* FloatToBuffer(float value, char* buffer) { // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all // platforms these days. Just in case some system exists where FLT_DIG // is significantly larger -- and risks overflowing our buffer -- we have // this assert. GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big); if (value == numeric_limits<double>::infinity()) { strcpy(buffer, "inf"); return buffer; } else if (value == -numeric_limits<double>::infinity()) { strcpy(buffer, "-inf"); return buffer; } else if (IsNaN(value)) { strcpy(buffer, "nan"); return buffer; } int snprintf_result = snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG, value); // The snprintf should never overflow because the buffer is significantly // larger than the precision we asked for. GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize); float parsed_value; if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) { int snprintf_result = snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG+2, value); // Should never overflow; see above. GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize); } DelocalizeRadix(buffer); return buffer; }