Maxim Integrated
/
MAXREFDES99_demo
Demo for MAXREFDES99
Diff: maxrefdes99.cpp
- Revision:
- 0:6b0161c3e440
- Child:
- 2:9fdd01cf0f88
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/maxrefdes99.cpp Tue Jan 12 23:44:43 2016 +0000 @@ -0,0 +1,673 @@ +/******************************************************************//** +* @file maxrefdes99.cpp +* +* @author Justin Jordan +* +* @version 0.0 +* +* Started: 08JAN16 +* +* Updated: +* +* @brief Source file for maxrefdes99 demo +*********************************************************************** +* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +* OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of Maxim Integrated +* Products, Inc. shall not be used except as stated in the Maxim Integrated +* Products, Inc. Branding Policy. +* +* The mere transfer of this software does not imply any licenses +* of trade secrets, proprietary technology, copyrights, patents, +* trademarks, maskwork rights, or any other form of intellectual +* property whatsoever. Maxim Integrated Products, Inc. retains all +* ownership rights. +**********************************************************************/ + + +#include "maxrefdes99.h" + + +//5x7 character bit map +static const uint8_t font_5x7[95][6] = { + {0x00,0x00,0x00,0x00,0x00,0x00}, // SPACE + {0x00,0x00,0x00,0x4F,0x00,0x00}, // ! + {0x00,0x00,0x07,0x00,0x07,0x00}, // " + {0x00,0x14,0x7F,0x14,0x7F,0x14}, // # + {0x00,0x24,0x2A,0x7F,0x2A,0x12}, // $ + {0x00,0x23,0x13,0x08,0x64,0x62}, // % + {0x00,0x36,0x49,0x55,0x22,0x50}, // & + {0x00,0x00,0x05,0x03,0x00,0x00}, // ' + {0x00,0x00,0x1C,0x22,0x41,0x00}, // ( + {0x00,0x00,0x41,0x22,0x1C,0x00}, // ) + {0x00,0x14,0x08,0x3E,0x08,0x14}, // * + {0x00,0x08,0x08,0x3E,0x08,0x08}, // + + {0x00,0x00,0x50,0x30,0x00,0x00}, // , + {0x00,0x08,0x08,0x08,0x08,0x08}, // - + {0x00,0x00,0x60,0x60,0x00,0x00}, // . + {0x00,0x20,0x10,0x08,0x04,0x02}, // / + {0x00,0x3E,0x51,0x49,0x45,0x3E}, // 0 + {0x00,0x00,0x42,0x7F,0x40,0x00}, // 1 + {0x00,0x42,0x61,0x51,0x49,0x46}, // 2 + {0x00,0x21,0x41,0x45,0x4B,0x31}, // 3 + {0x00,0x18,0x14,0x12,0x7F,0x10}, // 4 + {0x00,0x27,0x45,0x45,0x45,0x39}, // 5 + {0x00,0x3C,0x4A,0x49,0x49,0x30}, // 6 + {0x00,0x01,0x71,0x09,0x05,0x03}, // 7 + {0x00,0x36,0x49,0x49,0x49,0x36}, // 8 + {0x00,0x06,0x49,0x49,0x29,0x1E}, // 9 + {0x00,0x36,0x36,0x00,0x00,0x00}, // : + {0x00,0x56,0x36,0x00,0x00,0x00}, // ; + {0x00,0x08,0x14,0x22,0x41,0x00}, // < + {0x00,0x14,0x14,0x14,0x14,0x14}, // = + {0x00,0x00,0x41,0x22,0x14,0x08}, // > + {0x00,0x02,0x01,0x51,0x09,0x06}, // ? + {0x00,0x30,0x49,0x79,0x41,0x3E}, // @ + {0x00,0x7E,0x11,0x11,0x11,0x7E}, // A + {0x00,0x7F,0x49,0x49,0x49,0x36}, // B + {0x00,0x3E,0x41,0x41,0x41,0x22}, // C + {0x00,0x7F,0x41,0x41,0x22,0x1C}, // D + {0x00,0x7F,0x49,0x49,0x49,0x41}, // E + {0x00,0x7F,0x09,0x09,0x09,0x01}, // F + {0x00,0x3E,0x41,0x49,0x49,0x7A}, // G + {0x00,0x7F,0x08,0x08,0x08,0x7F}, // H + {0x00,0x00,0x41,0x7F,0x41,0x00}, // I + {0x00,0x20,0x40,0x41,0x3F,0x01}, // J + {0x00,0x7F,0x08,0x14,0x22,0x41}, // K + {0x00,0x7F,0x40,0x40,0x40,0x40}, // L + {0x00,0x7F,0x02,0x0C,0x02,0x7F}, // M + {0x00,0x7F,0x04,0x08,0x10,0x7F}, // N + {0x00,0x3E,0x41,0x41,0x41,0x3E}, // O + {0x00,0x7F,0x09,0x09,0x09,0x06}, // P + {0x00,0x3E,0x41,0x51,0x21,0x5E}, // Q + {0x00,0x7F,0x09,0x19,0x29,0x46}, // R + {0x00,0x46,0x49,0x49,0x49,0x31}, // S + {0x00,0x01,0x01,0x7F,0x01,0x01}, // T + {0x00,0x3F,0x40,0x40,0x40,0x3F}, // U + {0x00,0x1F,0x20,0x40,0x20,0x1F}, // V + {0x00,0x3F,0x40,0x30,0x40,0x3F}, // W + {0x00,0x63,0x14,0x08,0x14,0x63}, // X + {0x00,0x07,0x08,0x70,0x08,0x07}, // Y + {0x00,0x61,0x51,0x49,0x45,0x43}, // Z + {0x00,0x00,0x7F,0x41,0x41,0x00}, // [ + {0x00,0x02,0x04,0x08,0x10,0x20}, // backslash + {0x00,0x00,0x41,0x41,0x7F,0x00}, // ] + {0x00,0x04,0x02,0x01,0x02,0x04}, // ^ + {0x00,0x40,0x40,0x40,0x40,0x40}, // _ + {0x00,0x00,0x01,0x02,0x04,0x00}, // ` + {0x00,0x20,0x54,0x54,0x54,0x78}, // a + {0x00,0x7F,0x50,0x48,0x48,0x30}, // b + {0x00,0x38,0x44,0x44,0x44,0x20}, // c + {0x00,0x38,0x44,0x44,0x48,0x7F}, // d + {0x00,0x38,0x54,0x54,0x54,0x18}, // e + {0x00,0x08,0x7E,0x09,0x01,0x02}, // f + {0x00,0x0C,0x52,0x52,0x52,0x3E}, // g + {0x00,0x7F,0x08,0x04,0x04,0x78}, // h + {0x00,0x00,0x44,0x7D,0x40,0x00}, // i + {0x00,0x20,0x40,0x44,0x3D,0x00}, // j + {0x00,0x7F,0x10,0x28,0x44,0x00}, // k + {0x00,0x00,0x41,0x7F,0x40,0x00}, // l + {0x00,0x78,0x04,0x58,0x44,0x78}, // m + {0x00,0x7C,0x08,0x04,0x04,0x78}, // n + {0x00,0x38,0x44,0x44,0x44,0x38}, // o + {0x00,0x7C,0x14,0x14,0x14,0x08}, // p + {0x00,0x08,0x14,0x14,0x18,0x7C}, // q + {0x00,0x7C,0x08,0x04,0x04,0x08}, // r + {0x00,0x48,0x54,0x54,0x54,0x20}, // s + {0x00,0x04,0x3F,0x44,0x40,0x20}, // t + {0x00,0x3C,0x40,0x40,0x20,0x7C}, // u + {0x00,0x1C,0x20,0x40,0x20,0x1C}, // v + {0x00,0x3C,0x40,0x30,0x40,0x3C}, // w + {0x00,0x44,0x28,0x10,0x28,0x44}, // x + {0x00,0x0C,0x50,0x50,0x50,0x3C}, // y + {0x00,0x44,0x64,0x54,0x4C,0x44}, // z + {0x00,0x00,0x08,0x36,0x41,0x00}, // { + {0x00,0x00,0x00,0x7F,0x00,0x00}, // | + {0x00,0x00,0x41,0x36,0x08,0x00}, // } + {0x00,0x0C,0x02,0x0C,0x10,0x0C} // ~ +}; + + +static uint8_t display_buff[256]; +static uint8_t temp_buff[256]; + +static const uint8_t DISPLAY_BUFF_START = 112; +static const uint8_t DISPLAY_BUFF_END = 143; + +static const uint32_t MAX_STRING_LENGTH = 32; +static char str[MAX_STRING_LENGTH]; + + +//********************************************************************* +void get_5x7_character(char c, uint8_t *char_buff) +{ + uint16_t temp_data; + uint8_t idx, idy; + + for(idx = 0; idx < 6; idx++) + { + //get byte of char from map and flip it, bit 0 becomes bit 7 and so on + temp_data = (0x00FF & (font_5x7[c - 0x20][idx])); + for(idy = 0; idy < 8; idy++) + { + temp_data = (temp_data | (((temp_data & (1 << idy)) << (15 - (idy*2))))); + } + temp_data = ((temp_data >> 8) & 0x00FF); + + char_buff[idx] = ((uint8_t) temp_data); + } +} + + +//********************************************************************* +void print_char(Max7219 *p_display, uint8_t position, char c) +{ + uint8_t idx; + uint8_t wrap_device; + uint8_t wrap_idx; + uint8_t char_buff[6]; + uint8_t device; + uint8_t display_buff_idx = 0; + + get_5x7_character(c, char_buff); + + //get device and device_position + if(position > 8) + { + if(position%8) + { + device = ((position/8) + 1); + position = position%8; + } + else + { + device = position/8; + position = 8; + } + } + else + { + device = 1; + } + + //check for dispaly wrap around + //(moving to next 8x8 grid cause character doesn't fit on current one) + if(position > 3) + { + wrap_idx = (9 - position); + if(device < 4) + { + wrap_device = (device + 1); + } + else + { + wrap_device = 1; + } + } + else + { + wrap_idx = 6; //make bigger than idx, not used + wrap_device = 0; //not used + } + + //print character to position + for(idx = 0; idx < 6; idx++) + { + //check for wrap + if(idx >= wrap_idx) + { + p_display->write_digit(wrap_device, ((idx - wrap_idx) + 1), char_buff[idx]); + } + else + { + p_display->write_digit(device, (position + idx), char_buff[idx]); + } + + //get index for display buffer, keeps image of display for shifting + display_buff_idx = (((device - 1) * 8) + (position - 1) + idx + DISPLAY_BUFF_START); + //wrap buff back around + if(display_buff_idx > 255) + { + display_buff_idx = display_buff_idx - 256; + } + display_buff[display_buff_idx] = char_buff[idx]; + } +} + + +//********************************************************************* +void print_string(Max7219 *p_display, uint8_t position, const char *s) +{ + uint8_t idx = 0; + + while(s[idx] != '\0') + { + print_char(p_display, (position + (idx*6)), s[idx]); + idx++; + } +} + + +//********************************************************************* +void shift_display_right(Max7219 *p_display, uint8_t count, uint8_t delay) +{ + uint16_t idx, idy; + uint8_t position; + + for(idx = 0; idx < count; idx++) + { + for(idy = 0; idy < 256; idy++) + { + if(idy == 255) + { + temp_buff[0] = display_buff[idy]; + } + else + { + temp_buff[idy + 1] = display_buff[idy]; + } + } + + for(idy = 0; idy < 256; idy++) + { + //save shifted display in buffer + display_buff[idy] = temp_buff[idy]; + + if((idy >= DISPLAY_BUFF_START) && ( idy <= DISPLAY_BUFF_END)) + { + position = ((idy - DISPLAY_BUFF_START) + 1); + if(position > 24) + { + if(position % 8) + { + position = position % 8; + } + else + { + position = 8; + } + p_display->write_digit(4, position, display_buff[idy]); + } + else if(position > 16) + { + if(position % 8) + { + position = position % 8; + } + else + { + position = 8; + } + p_display->write_digit(3, position, display_buff[idy]); + } + else if(position > 8) + { + if(position % 8) + { + position = position % 8; + } + else + { + position = 8; + } + p_display->write_digit(2, position, display_buff[idy]); + } + else + { + p_display->write_digit(1, position, display_buff[idy]); + } + } + } + + wait_ms(delay); + } +} + + +void shift_display_left(Max7219 *p_display, uint8_t count, uint8_t delay) +{ + uint16_t idx, idy; + uint8_t position; + + for(idx = 0; idx < count; idx++) + { + for(idy = 0; idy < 256; idy++) + { + if(idy == 0) + { + temp_buff[255] = display_buff[idy]; + } + else + { + temp_buff[idy - 1] = display_buff[idy]; + } + } + + for(idy = 0; idy < 256; idy++) + { + //save shifted display in buffer + display_buff[idy] = temp_buff[idy]; + + if((idy >= DISPLAY_BUFF_START) && ( idy <= DISPLAY_BUFF_END)) + { + position = ((idy - DISPLAY_BUFF_START) + 1); + if(position > 24) + { + if(position % 8) + { + position = position % 8; + } + else + { + position = 8; + } + p_display->write_digit(4, position, display_buff[idy]); + } + else if(position > 16) + { + if(position % 8) + { + position = position % 8; + } + else + { + position = 8; + } + p_display->write_digit(3, position, display_buff[idy]); + } + else if(position > 8) + { + if(position % 8) + { + position = position % 8; + } + else + { + position = 8; + } + p_display->write_digit(2, position, display_buff[idy]); + } + else + { + p_display->write_digit(1, position, display_buff[idy]); + } + } + } + + wait_ms(delay); + } +} + + +//********************************************************************* +void quad_all_on(Max7219 *p_display, uint8_t quad) +{ + if(quad > 1) + { + for(uint8_t idx = 0; idx < 8; idx++) + { + display_buff[((quad - 1)*8) + DISPLAY_BUFF_START + idx] = 0xFF; + } + } + else + { + for(uint8_t idx = 0; idx < 8; idx++) + { + display_buff[idx + DISPLAY_BUFF_START] = 0xFF; + } + } + + p_display->device_all_on(quad); +} + + +//********************************************************************* +void quad_all_off(Max7219 *p_display, uint8_t quad) +{ + if(quad > 1) + { + for(uint8_t idx = 0; idx < 8; idx++) + { + display_buff[((quad - 1)*8) + DISPLAY_BUFF_START + idx] = 0; + } + } + else + { + for(uint8_t idx = 0; idx < 8; idx++) + { + display_buff[idx + DISPLAY_BUFF_START] = 0; + } + } + + p_display->device_all_off(quad); +} + + +//********************************************************************* +void all_on(Max7219 *p_display) +{ + for(uint16_t idx = 0; idx < 256; idx++) + { + display_buff[idx] = 0xFF; + } + + p_display->display_all_on(); +} + + +//********************************************************************* +void all_off(Max7219 *p_display) +{ + for(uint16_t idx = 0; idx < 256; idx++) + { + display_buff[idx] = 0; + } + + p_display->display_all_off(); +} + + +//********************************************************************* +void demo(Max7219 *display, max7219_configuration_t display_config, bool endless_loop) +{ + uint8_t position = 1; + uint8_t idx = 0; + + do + { + all_off(display); + + if(position > 25) + { + position = 1; + } + printf("\nPosition = %d\n", position); + + for(idx = 0x20; idx < 0x7F; idx++) + { + print_char(display, position, (char) idx); + wait(0.25); + } + position = (position + 8); + + all_on(display); + + for(idx = 0; idx < 16; idx++) + { + display_config.intensity = 15 - idx; + display->init_display(display_config); + wait_ms(50); + } + + for(idx = 0; idx < 16; idx++) + { + display_config.intensity = idx; + display->init_display(display_config); + wait_ms(100); + } + + wait_ms(100); + all_off(display); + wait_ms(100); + + quad_all_on(display, 1); + wait_ms(500); + shift_display_right(display, 32, 100); + shift_display_left(display, 32, 100); + all_off(display); + wait_ms(100); + + print_string(display, 1, "Maxim"); + wait_ms(100); + shift_display_right(display, 32, 100); + shift_display_left(display, 32, 100); + wait_ms(100); + } + while(endless_loop); +} + + +//********************************************************************* +void endless_scroll_display(Max7219 *display, uint32_t scroll_right) +{ + if(scroll_right) + { + printf("\nScrolling Right\n"); + while(1) + { + shift_display_right(display, 1, 100); + } + } + else + { + printf("\nScrolling Left\n"); + while(1) + { + shift_display_left(display, 1, 100); + } + } +} + + +//********************************************************************* +uint32_t print_menu(void) +{ + uint32_t user_input; + + printf("\nPlease select an option below:\n"); + printf("%t1. Set Brightness\n"); + printf("%t2. Print a characther to given position\n"); + printf("%t3. Print a string to position\n");//TODO fix this case + printf("%t4. Shift display given number of position and direction\n"); //TODO fix this case + printf("%t5. Clear display\n"); + printf("%t6. Run the Demo Rotuine\n"); + printf("%t7. Run the Demo Rotuine In Endless Loop\n"); + printf("%t8. Scroll Display In Endless Loop, left or right\n"); + printf("%t9. Quit\n\n"); + + user_input = get_user_input(NULL, 9); + + return(user_input); +} + + +//********************************************************************* +uint32_t get_user_input(char *msg, uint32_t max_val) +{ + uint32_t user_input; + + do + { + printf(msg); + + //get user input + fgets(str, MAX_STRING_LENGTH, stdin); + + //Remove trailing newline and CR, if there. + if((strlen(str) > 0 ) && (str[strlen(str) - 1] == 0x0A) && (str[strlen(str) - 2] == 0x0D)) + { + str[strlen(str) - 1] = '\0'; + str[strlen(str) - 1] = '\0'; + } + + user_input = strtoul(str, NULL, 0); + + printf("\nYou entered = %d\n", user_input); + + if(user_input > max_val) + { + printf("\nOut of range\n"); + } + + } + while(user_input > max_val); + + return(user_input); +} + + +//********************************************************************* +char get_user_char(char *msg) +{ + + do + { + printf(msg); + + //get user input + fgets(str, 2, stdin); + + //Remove trailing newline and CR, if there. + if((strlen(str) > 0 ) && (str[strlen(str) - 1] == 0x0A) && (str[strlen(str) - 2] == 0x0D)) + { + str[strlen(str) - 1] = '\0'; + str[strlen(str) - 1] = '\0'; + } + + printf("\nYou entered = %c\n", str[0]); + + if((str[0] < 0x20) || (str[0] > 0x7E)) + { + printf("\nOut of range\n"); + } + } + while((str[0] < 0x20) || (str[0] > 0x7E)); + + return(str[0]); +} + + +//********************************************************************* +char * get_user_string(char *msg) +{ + printf(msg); + //get user input + fgets(str, MAX_STRING_LENGTH, stdin); + //Remove trailing newline and CR, if there. + if((strlen(str) > 0 ) && (str[strlen(str) - 1] == 0x0A) && (str[strlen(str) - 2] == 0x0D)) + { + str[strlen(str) - 1] = '\0'; + str[strlen(str) - 1] = '\0'; + } + + return(str); +} +