void setup() { serial_t Serial; // configure ADC to take temperature samples see [2] ADC10CTL0 = 0; ADC10CTL1 = INCH_10 | ADC10DIV_3; ADC10CTL0 = SREF_1 | ADC10SHT_3 | REFON | ADC10ON | ADC10IE; Serial.begin(9600); unsigned sample; while(1) { // enable ADC sample, sleep till complete ADC10CTL0 |= (ENC |ADC10SC); __bis_SR_register(LPM3_bits | GIE); __nop(); // make debugger happy see [1] sample = ADC10MEM; //Serial << "RAW=" << sample << " "; // output F and C temps #ifdef USE_FIX16 // working variables for calculations // convert sample to C = sample*0.413 - 277.75 Fix16 c = (Fix16(int16_t(sample)) * Fix16(0.14663/0.355)) - Fix16(277.75); Serial << _FIX16(c + 0.005f, 2) << "C" << " "; // convert sample to F = C*9/5 + 32 Fix16 f = (c * Fix16(9.0/5.0)) + Fix16(32); Serial << _FIX16(f + 0.0005f, 3) << "F" << endl; #endif #ifdef USE_INTEGER_MATH int conversion; conversion = ((27069L * sample) - 18169625L) >> 16; Serial << conversion << "C "; conversion = ((48724L * sample ) - 30634388L) >> 16; Serial << conversion << "F" << endl; #endif delay(5000); } }
Fix16 cosd() { return Fix16(fix16_cos(fix16_deg_to_rad(value))); }
Fix16 sind() { return Fix16(fix16_sin(fix16_deg_to_rad(value))); }
Fix16 sqrt() { return Fix16(fix16_sqrt(value)); }
Fix16 atan2(const Fix16 &inY) { return Fix16(fix16_atan2(value, inY.value)); }
Fix16 atan() { return Fix16(fix16_atan(value)); }
Fix16 acos() { return Fix16(fix16_acos(value)); }
Fix16 asin() { return Fix16(fix16_asin(value)); }
Fix16 tan() { return Fix16(fix16_tan(value)); }
Fix16 cos() { return Fix16(fix16_cos(value)); }
Fix16 sin() { return Fix16(fix16_sin(value)); }
// --------------------------------------------------------------------------------------------------------------------- bool cube_tick(const FrameInput& input, FrameOutput& output, FXState& state) { EffectData* data = (EffectData*)state.store; output.fade(3); Fix16 dial2((int16_t)input.dialChange[2]); dial2 *= fix16_from_float(1.75f); data->rotY += dial2; data->rotX -= dial2 * fix16_pt_five; data->delta += Fix16((int16_t)input.dialChange[1]) * fix16_from_float(0.05f); if (data->delta > fix16_one) data->delta = fix16_one; if (data->delta < fix16_zero) data->delta = fix16_zero; Fxp3D pj[8]; Fix16 fov(9.0f), dist; dist = dist.cos(data->distPulse); dist *= 0.5f; dist += 2.2f; for (int i=0; i<8; i++) { pj[i] = verts[i].eulerProject(data->rotX, data->rotY, data->rotZ, fov, dist); } data->rotX += Fix16(0.6f) * data->delta; data->rotY += Fix16(1.7f) * data->delta; data->rotZ += Fix16(0.3f) * data->delta; data->distPulse += Fix16(0.04f) * data->delta; for (int f=0; f<6; f++) { int bi = (f * 4); draw::WuLine(output.frame, pj[ faces[bi + 0] ].x, pj[ faces[bi + 0] ].y, pj[ faces[bi + 1] ].x, pj[ faces[bi + 1] ].y, data->ccCycle); draw::WuLine(output.frame, pj[ faces[bi + 1] ].x, pj[ faces[bi + 1] ].y, pj[ faces[bi + 2] ].x, pj[ faces[bi + 2] ].y, data->ccCycle); draw::WuLine(output.frame, pj[ faces[bi + 2] ].x, pj[ faces[bi + 2] ].y, pj[ faces[bi + 3] ].x, pj[ faces[bi + 3] ].y, data->ccCycle); draw::WuLine(output.frame, pj[ faces[bi + 3] ].x, pj[ faces[bi + 3] ].y, pj[ faces[bi + 0] ].x, pj[ faces[bi + 0] ].y, data->ccCycle); } return true; }
// --------------------------------------------------------------------------------------------------------------------- bool tick(const FrameInput& input, FXState& state, FrameOutput& output) { switch (gCurrentInterfaceStage) { case InterfaceStage::IS_GUI: { output.clear(); if (input.dialChange[1] == 0) ticksSinceAdjust ++; else ticksSinceAdjust = 0; const int16_t radioLen = sizeof(radioGUI) / sizeof(gui_entry); Fix16 max_target = fix16_from_int(radioLen); Fix16 max_value = fix16_from_int(radioLen - 1); Fix16 dial16 = fix16_from_int( input.dialChange[1] ); Fix16 pt05 = fix16_from_float(-1.0f); vTargetA += dial16 * fix16_from_float(0.2f); if (vTargetA < fix16_neg_one) vTargetA = fix16_neg_one; if (vTargetA > max_target) vTargetA = max_target; vCurA += (vTargetA - vCurA) * fix16_from_float(0.035f); if (vCurA < fix16_zero) vCurA = fix16_zero; if (vCurA > max_value) vCurA = max_value; if (ticksSinceAdjust > 30) { vTargetA -= fpart(vTargetA); } int16_t off = ipart(vCurA).asInt(); if (off < 0) off = 0; if (off > radioLen - 1) off = radioLen - 1; const gui_entry* guient[3] = {&radioGUI[off], &radioGUI[off], &radioGUI[off]}; if (off - 1 >= 0) guient[2] = &radioGUI[off - 1]; if (off + 1 <= radioLen - 1) guient[1] = &radioGUI[off + 1]; Fix16 charASlide = fpart(vCurA); charASlide *= Fix16(-16.0f); int16_t slideAInt = charASlide.asInt(); IconGlyph(output.frame, guient[0]->gly, slideAInt, 0, true); IconGlyph(output.frame, guient[1]->gly, 16 + slideAInt, 0, false); if (off > 0) IconGlyph(output.frame, guient[2]->gly, slideAInt - 16, 0, false); if (fadeTick < 15) { fadeTick ++; output.fade(15 - fadeTick); } if (input.dialClick) { gCurrentInterfaceStage = InterfaceStage::IS_FADETO; gNextDisplayMode = guient[0]->mode; } } break; case InterfaceStage::IS_FADETO: { output.fade(1); fadeTick --; if (fadeTick <= 0) { vTargetA = vCurA; gCurrentDisplayMode = gNextDisplayMode; for(int i = 0; i < Constants::MemoryPool; ++i) state.store[i] = 0xFF; DisplayMode::doInitFor(gCurrentDisplayMode, state); fadeTick = 0; gCurrentInterfaceStage = InterfaceStage::IS_FX; } } break; case InterfaceStage::IS_FX: { DisplayMode::doTickFor(gCurrentDisplayMode, input, output, state); if (fadeTick < 15) { fadeTick ++; output.fade(15 - fadeTick); } if (input.dialClick) { gCurrentInterfaceStage = InterfaceStage::IS_FADEFROM; } } break; case InterfaceStage::IS_FADEFROM: { DisplayMode::doTickFor(gCurrentDisplayMode, input, output, state); output.fade(15 - fadeTick); fadeTick --; if (fadeTick <= 0) { gCurrentInterfaceStage = InterfaceStage::IS_GUI; fadeTick = 0; } } break; } // /* dial --; if (dial <= 0) { // clear the frame output.clear(); for (int y=0; y<Constants::FrameHeight; y++) { for (int x=0; x<Constants::FrameWidth; x++) { int32_t RR = state.rng.genInt32(-4, 4); if (RR<0) RR =0; int32_t GG = state.rng.genInt32(-4, 4); if (GG<0) GG =0; setLED(output.frame, x, y, RR, GG); } } dial = 6; } */ /* byte red, green; for (int y=0; y<Constants::FrameHeight; y++) { for (int x=0; x<Constants::FrameWidth; x++) { pixel &LEDpixel = output.frame[y * Constants::FrameWidth + x]; DecodeByte(LEDpixel, red, green); if (red > 0) red --; if (green > 0) green --; LEDpixel = red | (green << 4); } } vTargetA += fix16_from_int( input.dialChange[1] ); vTargetB += fix16_from_int( input.dialChange[2] ); vCurA += (vTargetA - vCurA) * fix16_from_float(0.05f); vCurB += (vTargetB - vCurB) * fix16_from_float(0.05f); Fix16 xo = fix16_from_float(8.0f); Fix16 yo = fix16_from_float(8.0f); Fix16 ss1 = fix16_sin(vCurA * fix16_from_float(0.1f)); Fix16 cc1 = fix16_cos(vCurA * fix16_from_float(0.1f)); Fix16 ss2 = fix16_sin(vCurB * fix16_from_float(0.1f)); Fix16 cc2 = fix16_cos(vCurB * fix16_from_float(0.1f)); Fix16 rad1(-2.0f), rad2(12.0f); draw::WuLine( output.frame, xo + (ss1 * rad1), yo + (cc1 * rad1), xo + (ss1 * rad2), yo + (cc1 * rad2), Red); draw::WuLine( output.frame, xo + (ss2 * rad1), yo + (cc2 * rad1), xo + (ss2 * rad2), yo + (cc2 * rad2), Green); */ return true; }