void Chunk::deleteBlock(Vec3i localCoords) { if(localCoords.x < 0) localCoords.x += 16; if(localCoords.y < 0) localCoords.y += 16; int index = getBlockIndexByBlockCoords(localCoords); int topIndex = getBlockIndexByBlockCoords(Vec3i(localCoords.x,localCoords.y,localCoords.z+1)); if(m_block[index].m_type == PUMPKIN) m_pumpkinCount--; if((m_block[topIndex].m_flagsAndLighting & SKY_MASK) == SKY_MASK) { for(int z = localCoords.z; z > 0; z--) { m_block[getBlockIndexByBlockCoords(Vec3i(localCoords.x,localCoords.y,z))].m_flagsAndLighting |= SKY_MASK; if((m_block[getBlockIndexByBlockCoords(Vec3i(localCoords.x,localCoords.y,z-1))].m_flagsAndLighting & SOLID_MASK) == SOLID_MASK) break; } } m_block[index].m_type = AIR; m_block[index].m_flagsAndLighting &= ~SOLID_MASK; m_block[index].m_flagsAndLighting |= DIRTY_MASK; m_isDirty = true; m_lightDirtyIndex.push_back(index); markAdjacentBlockAsLightDirty(localCoords,m_lightDirtyIndex); calculateLighting(); }
void Chunk::addBlock(Vec3i localCoords,char blockType) { if(localCoords.x < 0) localCoords.x += 16; if(localCoords.y < 0) localCoords.y += 16; int index = getBlockIndexByBlockCoords(localCoords); m_block[index].m_type = blockType; m_block[index].m_flagsAndLighting |= SOLID_MASK; m_block[index].m_flagsAndLighting |= DIRTY_MASK; m_block[index].m_flagsAndLighting &= ~LIGHT_MASK; m_isDirty = true; if(blockType == GLOW || blockType == PUMPKIN) { m_block[index].m_flagsAndLighting |= GLOW_LIGHTING_LEVEL; } for(int z = localCoords.z; z > 0; z--) { m_block[getBlockIndexByBlockCoords(Vec3i(localCoords.x,localCoords.y,z))].m_flagsAndLighting &= ~SKY_MASK; if((m_block[getBlockIndexByBlockCoords(Vec3i(localCoords.x,localCoords.y,z-1))].m_flagsAndLighting & SOLID_MASK) == SOLID_MASK) break; } markAdjacentBlockAsLightDirty(localCoords,m_lightDirtyIndex); calculateLighting(); }
void Chunk::render(int maximumDrawingBlock) { if(m_isDirty) { calculateLighting(); sendList(maximumDrawingBlock); } glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, g_worldSprites->m_textureID); glPushMatrix(); glBindBuffer( GL_ARRAY_BUFFER, m_vboID ); glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_COLOR_ARRAY ); glEnableClientState( GL_TEXTURE_COORD_ARRAY ); glVertexPointer( 3, GL_FLOAT, sizeof( BlockVertex ), (const GLvoid*) offsetof( BlockVertex, m_position ) ); glColorPointer( 4, GL_FLOAT, sizeof( BlockVertex ), (const GLvoid*) offsetof( BlockVertex, m_color ) ); glTexCoordPointer( 2, GL_FLOAT, sizeof( BlockVertex ), (const GLvoid*) offsetof( BlockVertex, m_texCoords ) ); glDrawArrays( GL_QUADS, 0, m_vertexesSize ); glDisableClientState( GL_VERTEX_ARRAY ); glDisableClientState( GL_COLOR_ARRAY ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); glPopMatrix(); glDisable(GL_TEXTURE_2D); }
void Chunk::initialLightLevel() { for(int highestLayerIndex = BLOCKS_IN_A_CHUNK - 1; highestLayerIndex >= BLOCKS_IN_A_CHUNK - BLOCKS_IN_A_LAYER; highestLayerIndex--) { int currentColumn = highestLayerIndex; bool isSky = true; while(currentColumn >= 0) { if( (m_block[currentColumn].m_flagsAndLighting & SOLID_MASK) == SOLID_MASK ) { isSky = false; m_block[currentColumn].m_flagsAndLighting &= ~LIGHT_MASK; if(m_block[currentColumn].m_type == GLOW || m_block[currentColumn].m_type == PUMPKIN) { m_block[currentColumn].m_flagsAndLighting |= GLOW_LIGHTING_LEVEL; markAdjacentBlockAsLightDirty(getBlockCoordsByBlockIndex(currentColumn),m_lightDirtyIndex); } } else { m_block[currentColumn].m_flagsAndLighting &= ~LIGHT_MASK; m_block[currentColumn].m_flagsAndLighting &= NIGHT_LIGHTING_LEVEL; } if(isSky) { m_block[currentColumn].m_flagsAndLighting |= SKY_MASK; m_block[currentColumn].m_flagsAndLighting |= NIGHT_LIGHTING_LEVEL; //DAY_LIGHTING_LEVEL; // } else if((m_block[currentColumn].m_flagsAndLighting & SOLID_MASK) != SOLID_MASK) { m_block[currentColumn].m_flagsAndLighting &= ~SKY_MASK; m_block[currentColumn].m_flagsAndLighting |= DIRTY_MASK; m_block[currentColumn].m_flagsAndLighting &= ~LIGHT_MASK; m_lightDirtyIndex.push_back(currentColumn); } currentColumn -= BLOCKS_IN_A_LAYER; } } calculateLighting(); }
void GetLightValue(uint16_t *luxValue,int8_t *lightIndex) { int err = 0; int16_t photoGain = 1.0, photoOffset = -1450.0; photoGain = 1.0; photoOffset = -1450.0; memset(resultsBuffer, 0, sizeof(resultsBuffer)); resultsBuffer = MAP_ADC14_getResult(ADC_MEM0); //MAP_ADC14_getMultiSequenceResult(resultsBuffer); photoRAW = resultsBuffer; photoCON[0] = (photoGain*((3.3*1000)/((photoRAW)*3.3/16384)) * 1.3) + photoOffset; calculateLighting(photoCON[0], lightString, &index[0]); *luxValue = photoCON[0]; *lightIndex = index[0]; return err; }
void ScanConverter::operator()(const acl::Object<> &object, const acl::Triangle<> &triangle) { // get triangle vertex positions const acl::Vertex<> &v1 = triangle.getVertex(object.getMesh(), 0); const acl::Vertex<> &v2 = triangle.getVertex(object.getMesh(), 1); const acl::Vertex<> &v3 = triangle.getVertex(object.getMesh(), 2); acl::Matrix<1, 4> vpos[] = { v1.getPositionInScreen(), v2.getPositionInScreen(), v3.getPositionInScreen() }; // clip triangle if behind the camera if(clip && (vpos[0][2] >= 0 || vpos[1][2] >= 0 || vpos[2][2] >= 0)) return; // perform perspective divide for(int i = 0; i < 3; i++) { vpos[i][0] /= vpos[i][3]; vpos[i][1] /= vpos[i][3]; } // sort vertices from lowest to highest by y coordinate int index[] = {0, 1, 2}; if(vpos[index[0]][1] > vpos[index[1]][1]) {std::swap(index[0], index[1]);} if(vpos[index[1]][1] > vpos[index[2]][1]) {std::swap(index[1], index[2]);} if(vpos[index[0]][1] > vpos[index[1]][1]) {std::swap(index[0], index[1]);} // clip triangle if less than one pixel tall const int yminscreen = std::max(static_cast<int>(vpos[index[0]][1]), 0); const int ymaxscreen = std::min(static_cast<int>(vpos[index[2]][1]), frameBuffer.height()); if(ymaxscreen <= yminscreen) return; // calculate triangle vertex lighting and set pixel properties acl::Color<> vertexColors[3]; calculateVertexLighting(object, triangle, vertexColors); const Pixel pixels[] = { {vpos[0], v1.getPositionInWorld(), v1.getNormalInWorld(), triangle.getVertexMaterial(object, 0), vertexColors[0]}, {vpos[1], v2.getPositionInWorld(), v2.getNormalInWorld(), triangle.getVertexMaterial(object, 1), vertexColors[1]}, {vpos[2], v3.getPositionInWorld(), v3.getNormalInWorld(), triangle.getVertexMaterial(object, 2), vertexColors[2]} }; // interpolate along edges edgePairs.resize(frameBuffer.height()); interpolateEdge(pixels[index[0]], pixels[index[2]], true); interpolateEdge(pixels[index[0]], pixels[index[1]], false); interpolateEdge(pixels[index[1]], pixels[index[2]], false); // scan convert and interpolate between x coordinate pairs for(int y = yminscreen; y < ymaxscreen; y++) { const EdgePair &edgePair = edgePairs[y]; const int xleft = static_cast<int>(edgePair.left.positionInScreen[0]); const int xright = static_cast<int>(edgePair.right.positionInScreen[0]); const int xleftscreen = std::max(xleft, 0); const int xrightscreen = std::min(xright, frameBuffer.width()); for(int x = xleftscreen; x < xrightscreen; x++) { const double t = static_cast<double>(x - xleft) / (xright - xleft); const Pixel interpPixel = edgePair.left.interpolate(edgePair.right, t, shading); const acl::Color<> color = (shading == Shading::Phong) ? calculateLighting(interpPixel) : interpPixel.color; frameBuffer.blendPixel(x, y, interpPixel.positionInScreen[2], color.alpha(), color); } } }
//----------------------------------------------------------------------- // // THIS CODE HAS THE MANUAL CHIP SELECT FOR THE DISPLAY // int main (void) { //============== Local Variables ===================== int encoderValue = 0; int16_t temp0, temp2, temp3; unsigned int temp1; int refreshValues = YES, i, t = 0, h = 0; double temptemp1, temptemp2; screen = 2; tempFormat = CEL; tempCharacter[0] = 'C'; // Turning off watch dog timer MAP_WDT_A_holdTimer(); //Configuring pins for peripheral/crystal usage. CS_setExternalClockSourceFrequency(32768,48000000); MAP_PCM_setCoreVoltageLevel(PCM_VCORE1); MAP_FlashCtl_setWaitState(FLASH_BANK0, 2); MAP_FlashCtl_setWaitState(FLASH_BANK1, 2); CS_startHFXT(false); //Setting other clocks to speeds needed throughout the project MAP_CS_initClockSignal(CS_MCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1); MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4); MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ, GPIO_PIN3 | GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION); //Initialization functions for variable peripherals InitFunction(); err = DisplayInit(); err |= InitOneWire(); err |= RF_Init(); if(err) { printf("ERROR occured in initialization functions.\n"); } //Setting variables to initial values temperatureOUT[0] = 250; temperatureOUT[1] = 251; temperatureIN[0] = 220; temperatureIN[1] = 221; humidityOUT[0] = 440; humidityOUT[1] = 441; humidityIN[0] = 330; humidityIN[1] = 331; pressure[0] = 60; pressure[1] = 61; lux[0] = 9000; lux[1] = 9001; lightIndex[0] = 1; lightIndex[1] = 2; //Enable interupts and set the interupt for the One-Wire to have highest priority MAP_Interrupt_enableMaster(); MAP_Interrupt_setPriority(INT_TA0_0, 0x00); //Keep process in infinite loop while(1) { while(!Setup) //'Setup' controls whether or not the user is view the data from //the remote system, or is editing the time for the RTC { if (status) //'status' is set high when the IQR pin is set high -- meaning there is a packet //available to be read in from the RF chip { status = 0; r_rx_payload((uint8_t)PACKET_SIZE, &data); //retrieve data sscanf(data, "<T%dP%dH%dL%d>", &temp0, &temp1, &temp2, &temp3); //parse data temperatureOUT[0] = temp0; pressure[0] = temp1; humidityOUT[0] = temp2; lux[0] = temp3; calculateLighting(lux[0], lightIndexString[0], &lightIndex[0]); //Figure out the lighting condition //Convert to F if 'tempFormat' is set high when tempFormat is set high, indicating that there needs to be a //C to F convserion. The data is C from the sensors. if(tempFormat == FAR) { //C to F convserion temptemp2 = ((float)temperatureOUT[0]); temperatureOUT[0] = (int)((temptemp2 * 1.8)); temperatureOUT[0] += 320; } } //Tick is set high every second from the RTC interupt if(tick) { i = 0; MAP_SysTick_disableModule(); // disable the systick interupt during while getting the // temperature and humidity data from sensor //Getting the temp and humidity data __delay_cycles(100); dht_start_read(); t = dht_get_temp(); h = dht_get_rh(); MAP_SysTick_enableModule(); //Enable the systick interupt again __delay_cycles(100); //put the humidity and temperature values in the needed variables humidityIN[0] = h; temperatureIN[0] = t; //Convert to F if 'tempFormat' is set high when tempFormat is set high, indicating that there needs to be a //C to F convserion. The data is C from the sensors. if(tempFormat == FAR) { //C to F conversion temptemp1 = ((float)temperatureIN[0]); temperatureIN[0] = (int)((temptemp1 * 1.8)); temperatureIN[0] += 320; } } //'screen' is either set to the value of 1 or 2. // screen == 1 is the main screen with only the temperatures and lighting condition displayed if(screen == 1) { //If the time has been updated or the screen has been switched, update the string if(tick || refreshValues) { tick = 0; //Create the time and date strings sprintf(dateString, "%s %02X, %X", months[newTime.month], newTime.dayOfmonth, newTime.year); sprintf(timeString, "%02X:%02X:%02X", newTime.hours, newTime.minutes, newTime.seconds); //Write "IN:" in the lower part of the screen to indicate to the user which temperature is the //inside tempterature if(refreshValues == YES) { ST7735_DrawStringHorizontal(50, 140, "IN:", ST7735_Color565(255, 255, 255), 1); } //Printing the time for(i = 0; i < strlen(timeString); i++) { ST7735_DrawChar(22+(11*i), 10, timeString[i], timeStringColor[i], 0x0000, 2); } //Printing the date for(i = 0; i < strlen(dateString); i++) { ST7735_DrawChar(30+(6*i), 30, dateString[i], dateStringColor[i], 0x0000, 1); } } //If the new data value is different than the previous value, or the screen has been changes, update display if((temperatureOUT[0] != temperatureOUT[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%02d.%.1d", temperatureOUT[1]/10, temperatureOUT[1]%10); ST7735_DrawStringHorizontal(20, 80, tempString, ST7735_Color565(0, 0, 0), 4); ST7735_DrawCharS((20 + strlen(tempString)*4*6), 80, tempCharacter[1], ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%02d.%.1d", temperatureOUT[0]/10, temperatureOUT[0]%10); ST7735_DrawStringHorizontal(20, 80, tempString, ST7735_Color565(255, 0, 0), 4); ST7735_DrawCharS((20 + strlen(tempString)*4*6), 80, tempCharacter[0], ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); temperatureOUT[1] = temperatureOUT[0]; tempCharacter[1] = tempCharacter[0]; } //If the new data value is different than the previous value, or the screen has been changes, update display if((temperatureIN[0] != temperatureIN[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%02d.%.1d", temperatureIN[1]/10, temperatureIN[1]%10); ST7735_DrawStringHorizontal(70, 130, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawCharS((70 + strlen(tempString)*2*6), 130, tempCharacter, ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%02d.%.1d", temperatureIN[0]/10, temperatureIN[0]%10); ST7735_DrawStringHorizontal(70, 130, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawCharS((70 + strlen(tempString)*2*6), 130, tempCharacter, ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); temperatureIN[1] = temperatureIN[0]; tempCharacter[1] = tempCharacter[0]; } //If the new data value is different than the previous value, or the screen has been changes, update display if((lightIndex[0] != lightIndex[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%s", lightIndexString[1]); ST7735_DrawStringVertical(0, 60, tempString, ST7735_Color565(0, 0, 0), 2); //Write the new string sprintf(tempString, "%s", lightIndexString[0]); ST7735_DrawStringVertical(0, 60, tempString, ST7735_Color565(0, 255, 0), 2); memcpy(lightIndexString[1], lightIndexString[0], sizeof(lightIndexString[0])); lightIndex[1] = lightIndex[0]; } //Reset the refreshValues variable. This variable will be set high when the user swithces screen by turning the knob refreshValues = NO; } //'screen' equalling 2 is the screen that displays all the data to the user if(screen == 2) { //If the time has been updated or the screen has been switched, update the string if(time || refreshValues) { tick = 0; //Create the time string that will be written sprintf(timeString, "%02X:%02X:%02X", newTime.hours, newTime.minutes, newTime.seconds); //Write the new time string for(i = 0; i < strlen(timeString); i++) { ST7735_DrawChar(35+(6*i), 5, timeString[i], ST7735_Color565(0, 0, 0), ST7735_Color565(255, 255, 255), 1); } } //When update the items on the screen that will remain constant when the screen is changed. if(refreshValues == YES) { sprintf(tempString, "Inside"); ST7735_DrawStringVertical(0, 10, tempString, ST7735_Color565(0, 255, 0), 1); sprintf(tempString, "Outside"); ST7735_DrawStringVertical(120, 90, tempString, ST7735_Color565(0, 255, 0), 1); sprintf(tempString, "_______________________"); ST7735_DrawStringHorizontal(0, 55, tempString, ST7735_Color565(255, 255, 255), 1); } //If the new data value is different than the previous value, or the screen has been changes, update display if((temperatureIN[0] != temperatureIN[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%02d.%.1d", temperatureIN[1]/10, temperatureIN[1]%10); ST7735_DrawStringHorizontal(12, 30, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawCharS((12 + strlen(tempString)*2*6), 25, tempCharacter, ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%02d.%.1d", temperatureIN[0]/10, temperatureIN[0]%10); ST7735_DrawStringHorizontal(12, 30, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawCharS((12 + strlen(tempString)*2*6), 25, tempCharacter, ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); temperatureIN[1] = temperatureIN[0]; tempCharacter[1] = tempCharacter[0]; } //If the new data value is different than the previous value, or the screen has been changes, update display if((humidityIN[0] != humidityIN[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%02d.%.1d", humidityIN[1]/10, humidityIN[1]%10); ST7735_DrawStringHorizontal(74, 30, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawCharS((74 + strlen(tempString)*2*6), 27, '%', ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%02d.%.1d", humidityIN[0]/10, humidityIN[0]%10); ST7735_DrawStringHorizontal(74, 30, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawCharS((74 + strlen(tempString)*2*6), 27, '%', ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); humidityIN[1] = humidityIN[0]; } //========================================================================================================================== //If the new data value is different than the previous value, or the screen has been changes, update display if((temperatureOUT[0] != temperatureOUT[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%02d.%.1d", temperatureOUT[1]/10, temperatureOUT[1]%10); ST7735_DrawStringHorizontal(0, 70, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawCharS((0 + strlen(tempString)*2*6), 68, tempCharacter, ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%02d.%.1d", temperatureOUT[0]/10, temperatureOUT[0]%10); ST7735_DrawStringHorizontal(0, 70, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawCharS((0 + strlen(tempString)*2*6), 68, tempCharacter, ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); temperatureOUT[1] = temperatureOUT[0]; tempCharacter[1] = tempCharacter[0]; } //If the new data value is different than the previous value, or the screen has been changes, update display if((humidityOUT[0] != humidityOUT[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%02d.%.1d", humidityOUT[1]/10, humidityOUT[1]%10); ST7735_DrawStringHorizontal(0, 90, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawCharS((0 + strlen(tempString)*2*6), 87, '%', ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%02d.%.1d", humidityOUT[0]/10, humidityOUT[0]%10); ST7735_DrawStringHorizontal(0, 90, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawCharS((0 + strlen(tempString)*2*6), 87, '%', ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); humidityOUT[1] = humidityOUT[0]; } if((lux[0] != lux[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%d", lux[1]); ST7735_DrawStringHorizontal(0, 112, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawCharS((0 + strlen(tempString)*2*6), 112, 'L', ST7735_Color565(0, 0, 0), ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%d", lux[0]); ST7735_DrawStringHorizontal(0, 112, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawCharS((0 + strlen(tempString)*2*6), 112, 'L', ST7735_Color565(255, 0, 0), ST7735_Color565(255, 0, 0), 1); lux[1] = lux[0]; } //If the new data value is different than the previous value, or the screen has been changes, update display if((pressure[0] != pressure[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%d", pressure[1]); ST7735_DrawStringHorizontal(0, 135, tempString, ST7735_Color565(0, 0, 0), 2); ST7735_DrawStringHorizontal((0 + strlen(tempString)*2*6), 135, "Pa", ST7735_Color565(0, 0, 0), 1); //Write the new string sprintf(tempString, "%d", pressure[0]); ST7735_DrawStringHorizontal(0, 135, tempString, ST7735_Color565(255, 0, 0), 2); ST7735_DrawStringHorizontal((0 + strlen(tempString)*2*6), 135, "Pa", ST7735_Color565(255, 0, 0), 1); pressure[1] = pressure[0]; } //If the new data value is different than the previous value, or the screen has been changes, update display if((lightIndex[0] != lightIndex[1]) || refreshValues == YES) { //Re-write the last string in black (the same color as the backgruond) to cover it up so that the // new value is not written overtop. sprintf(tempString, "%s", lightIndexString[1]); ST7735_DrawStringVertical(105, 70, tempString, ST7735_Color565(0, 0, 0), 2); //Write the new string sprintf(tempString, "%s", lightIndexString[0]); ST7735_DrawStringVertical(105, 70, tempString, ST7735_Color565(0, 0, 255), 2); memcpy(lightIndexString[1], lightIndexString[0], sizeof(lightIndexString[0])); lightIndex[1] = lightIndex[0]; } refreshValues = NO; } //Check to see in the knob has been changed at all encoderValue = EncoderDecipher(&Encoder1, &Encoder2, &PushButton); //If encoder has been held, this indicates enting the setting of the RTC time if(encoderValue == HOLD) { Setup = YES; //Now that is this set high, the process will exit the while loop above //Set all varaibles to what is needed for editing the time and date memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); dateStringColor[0] = ST7735_Color565(255, 0, 0); dateStringColor[1] = ST7735_Color565(255, 0, 0); dateStringColor[2] = ST7735_Color565(255, 0, 0); //Getting the current RTC values and put them into variables that will then used to manipulate sprintf(temp, "%x, %x, %x, %x, %x, %x", newTime.month, newTime.dayOfmonth, newTime.year, newTime.hours, newTime.minutes, newTime.seconds); sscanf(temp, "%d, %d, %d, %d, %d, %d", &date[0], &date[1], &date[2], &time[0], &time[1], &time[2]); //Fill the screen in all black ST7735_FillScreen(0); //Variable controlling the whether editing the time or date Top = YES; } //If the user turns the knob, change the screen variable and set the refreshValues high so that the screen will change for the user else if (encoderValue == RIGHT || encoderValue == LEFT) { if(screen == 1) { screen = 2; ST7735_FillScreen(0); //Clear screen refreshValues = YES; } else if(screen == 2) { screen = 1; ST7735_FillScreen(0); //Clear screen refreshValues = YES; } } //If the user just pressed the encoder (not holds it) change the temperature to be displayed in the opposite type else if(encoderValue == PRESS) { if(tempFormat == CEL) { tempFormat = FAR; tempCharacter[0] = 'F'; } else { tempFormat = CEL; tempCharacter[0] = 'C'; } } } //Keep process inside this loop while the encoder is not being touched while(!movement) { if(encoderRefresh) { //Getting the movement of the encoder movement = EncoderDecipher(Encoder1, Encoder2, PushButton); encoderRefresh = 0; } if(flag) { flag = 0; //Write the date and time strings for(i = 0; i < strlen(dateString); i++) { ST7735_DrawChar((11*i), 10, dateString[i], dateStringColor[i], 0x0000, 2); } for(i = 0; i < strlen(timeString); i++) { ST7735_DrawChar(22+(11*i), 40, timeString[i], timeStringColor[i], 0x0000, 2); } } } //Is user turned the knob right, increment withever value the user is editing if(movement == RIGHT) { flag = 1; if(Top) // Up { if(dateStringColor[1] == 31) { if(++date[0] > 11) date[0] = 0; } else if(dateStringColor[4] == 31) { if(++date[1] > 31) date[1] = 0; } else { if(++date[2] > 2050) date[2] = 1950; } } else { if(timeStringColor[1] == 31) { if(++time[0] > 24) time[0] = 0; } else if(timeStringColor[4] == 31) { if(++time[1] > 59) time[1] = 0; } else { if(++time[2] > 59) time[2] = 0; } } } //Is user turned the knob left, decrement withever value the user is editing if(movement == LEFT) { flag = 1; if(Top) // Up { if(dateStringColor[1] == 31) { if(--date[0] < 0) date[0] = 11; } else if(dateStringColor[4] == 31) { if(--date[1] < 0) date[1] = 31; } else { if(--date[2] < 1950) date[2] = 2050; } } else { if(timeStringColor[1] == 31) { if(--time[0] < 0) time[0] = 23; } else if(timeStringColor[4] == 31) { if(--time[1] < 0) time[1] = 59; } else { if(--time[2] < 0) time[2] = 59; } } } //Is user presses the right, swith which what is highlighted, to indicate to the user //what is being edited if(movement == PRESS) { flag = 1; if(Top) // XXX XX XXXX { if(dateStringColor[1] == 31) { memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); dateStringColor[4] = ST7735_Color565(255, 0, 0); dateStringColor[5] = ST7735_Color565(255, 0, 0); } else if(dateStringColor[4] == 31) { memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); dateStringColor[7] = ST7735_Color565(255, 0, 0); dateStringColor[8] = ST7735_Color565(255, 0, 0); dateStringColor[9] = ST7735_Color565(255, 0, 0); dateStringColor[10] = ST7735_Color565(255, 0, 0); } else if(dateStringColor[8] == 31) { memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); timeStringColor[0] = ST7735_Color565(255, 0, 0); timeStringColor[1] = ST7735_Color565(255, 0, 0); Top = NO; } } else //XX XX XX { if(timeStringColor[1] == 31) { memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); timeStringColor[3] = ST7735_Color565(255, 0, 0); timeStringColor[4] = ST7735_Color565(255, 0, 0); } else if(timeStringColor[4] == 31) { memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); timeStringColor[6] = ST7735_Color565(255, 0, 0); timeStringColor[7] = ST7735_Color565(255, 0, 0); } else if(timeStringColor[7] == 31) { memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); dateStringColor[0] = ST7735_Color565(255, 0, 0); dateStringColor[1] = ST7735_Color565(255, 0, 0); dateStringColor[2] = ST7735_Color565(255, 0, 0); Top = YES; } } } //Update the new time and date strings sprintf(dateString, "%s %02d,%d", months[date[0]], date[1], date[2]); sprintf(timeString, "%02d:%02d:%02d", time[0], time[1], time[2]); //If used holds the encoder down, the time and date will be written to the RTC and the process will return //to the top where the temp, humid... data is diplayed. Editing the time/date is exited. if(movement == HOLD) { if(!Setup) { //Setting new time Setup = 1; flag = 1; if(dateStringColor[0] == 31 || dateStringColor[4] == 31 || dateStringColor[8] == 31 || timeStringColor[0] == 31 || timeStringColor[4] == 31 || timeStringColor[7] == 31) { memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); } else { memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); dateStringColor[0] = ST7735_Color565(255, 0, 0); dateStringColor[1] = ST7735_Color565(255, 0, 0); dateStringColor[2] = ST7735_Color565(255, 0, 0); Top = YES; } } else //Exiting setup { //Setup new time into system. Exiting setup Setup = 0; tick = 1; memset(dateStringColor, 0xFFFF, sizeof(dateStringColor)); memset(timeStringColor, 0xFFFF, sizeof(timeStringColor)); //Set the values (in the correct type) back into the RTC structure so that it can be updated. sprintf(temp, "%d, %d, %d, %d, %d, %d", date[0], date[1], date[2], time[0], time[1], time[2]); sscanf(temp, "%x, %x, %x, %x, %x, %x", &setTime.month, &setTime.dayOfmonth, &setTime.year, &setTime.hours, &setTime.minutes, &setTime.seconds); //Set the RTC with the values the uset chose MAP_RTC_C_initCalendar(&setTime, RTC_C_FORMAT_BCD); MAP_RTC_C_startClock(); //Clear screen ST7735_FillScreen(0); } } movement = NONE; } }