Example Host software for integration of MAX3266x chips (, MAX32664GWEB) equipped with Heart Rate from Wrist Algorithm. This is “stand-alone” software that runs on the MAX32630 low-power microcontroller to display heart rate on the display of the MAXREFDES101 reference design. It is intended provide a simple example of how to initialize and communicate with the sensor hub. Windows and Android communications are not supported.

Dependencies:   Maxim_Sensor_Hub_Communications BMI160 whrmDemoUI max32630hsp3

Fork of Host_Software_MAX32664GWEB_HR_wrist by mehmet gok

Committer:
gmehmet
Date:
Mon Dec 17 10:34:32 2018 +0300
Revision:
0:ddc2fef69ef9
First Commit New Repo name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 0:ddc2fef69ef9 1 /***************************************************************************//**
gmehmet 0:ddc2fef69ef9 2 * @file LS013B7DH03.cpp
gmehmet 0:ddc2fef69ef9 3 * @brief Driver class for the Sharp LS013B7DH03 memory LCD on some kits.
gmehmet 0:ddc2fef69ef9 4 *******************************************************************************
gmehmet 0:ddc2fef69ef9 5 * @section License
gmehmet 0:ddc2fef69ef9 6 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
gmehmet 0:ddc2fef69ef9 7 *******************************************************************************
gmehmet 0:ddc2fef69ef9 8 *
gmehmet 0:ddc2fef69ef9 9 * Permission is granted to anyone to use this software for any purpose,
gmehmet 0:ddc2fef69ef9 10 * including commercial applications, and to alter it and redistribute it
gmehmet 0:ddc2fef69ef9 11 * freely, subject to the following restrictions:
gmehmet 0:ddc2fef69ef9 12 *
gmehmet 0:ddc2fef69ef9 13 * 1. The origin of this software must not be misrepresented; you must not
gmehmet 0:ddc2fef69ef9 14 * claim that you wrote the original software.
gmehmet 0:ddc2fef69ef9 15 * 2. Altered source versions must be plainly marked as such, and must not be
gmehmet 0:ddc2fef69ef9 16 * misrepresented as being the original software.
gmehmet 0:ddc2fef69ef9 17 * 3. This notice may not be removed or altered from any source distribution.
gmehmet 0:ddc2fef69ef9 18 *
gmehmet 0:ddc2fef69ef9 19 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
gmehmet 0:ddc2fef69ef9 20 * obligation to support this Software. Silicon Labs is providing the
gmehmet 0:ddc2fef69ef9 21 * Software "AS IS", with no express or implied warranties of any kind,
gmehmet 0:ddc2fef69ef9 22 * including, but not limited to, any implied warranties of merchantability
gmehmet 0:ddc2fef69ef9 23 * or fitness for any particular purpose or warranties against infringement
gmehmet 0:ddc2fef69ef9 24 * of any proprietary rights of a third party.
gmehmet 0:ddc2fef69ef9 25 *
gmehmet 0:ddc2fef69ef9 26 * Silicon Labs will not be liable for any consequential, incidental, or
gmehmet 0:ddc2fef69ef9 27 * special damages, or any other relief, or for any claim by any third party,
gmehmet 0:ddc2fef69ef9 28 * arising from your use of this Software.
gmehmet 0:ddc2fef69ef9 29 *
gmehmet 0:ddc2fef69ef9 30 ******************************************************************************/
gmehmet 0:ddc2fef69ef9 31
gmehmet 0:ddc2fef69ef9 32 #include "../screen/LS013B7DH03.h"
gmehmet 0:ddc2fef69ef9 33
gmehmet 0:ddc2fef69ef9 34 #include <mbed.h>
gmehmet 0:ddc2fef69ef9 35 #include "SPI.h"
gmehmet 0:ddc2fef69ef9 36 //#include "Peripherals.h"
gmehmet 0:ddc2fef69ef9 37
gmehmet 0:ddc2fef69ef9 38 /* LS013B7DH03 SPI commands */
gmehmet 0:ddc2fef69ef9 39 #define LS013B7DH03_CMD_UPDATE (0x01)
gmehmet 0:ddc2fef69ef9 40 #define LS013B7DH03_CMD_ALL_CLEAR (0x04)
gmehmet 0:ddc2fef69ef9 41
gmehmet 0:ddc2fef69ef9 42 /* Macro to switch endianness on char value */
gmehmet 0:ddc2fef69ef9 43 #define SWAP8(a) ((((a) & 0x80) >> 7) | (((a) & 0x40) >> 5) | (((a) & 0x20) >> 3) | (((a) & 0x10) >> 1) | (((a) & 0x08) << 1) | (((a) & 0x04) << 3) | (((a) & 0x02) << 5) | (((a) & 0x01) << 7))
gmehmet 0:ddc2fef69ef9 44
gmehmet 0:ddc2fef69ef9 45 namespace silabs {
gmehmet 0:ddc2fef69ef9 46
gmehmet 0:ddc2fef69ef9 47
gmehmet 0:ddc2fef69ef9 48 LS013B7DH03::LS013B7DH03(mbed::SPI * spi, DigitalOut * CS, const char *name) : BufferedDisplay( name ) {
gmehmet 0:ddc2fef69ef9 49 //Save pointer to ChipSelect pin
gmehmet 0:ddc2fef69ef9 50 _CS = CS;
gmehmet 0:ddc2fef69ef9 51 _CS->write(0);
gmehmet 0:ddc2fef69ef9 52 DigitalOut DISP(P6_6);
gmehmet 0:ddc2fef69ef9 53
gmehmet 0:ddc2fef69ef9 54 //Save pointer to ExtCom pin
gmehmet 0:ddc2fef69ef9 55 /// _EXTCOM = ExtCom;
gmehmet 0:ddc2fef69ef9 56 /// _EXTCOM->write(0);
gmehmet 0:ddc2fef69ef9 57
gmehmet 0:ddc2fef69ef9 58 DISP = 0;
gmehmet 0:ddc2fef69ef9 59 wait_ms(1);
gmehmet 0:ddc2fef69ef9 60 DISP = 1;
gmehmet 0:ddc2fef69ef9 61
gmehmet 0:ddc2fef69ef9 62 //Save pointer to spi peripheral
gmehmet 0:ddc2fef69ef9 63 _spi = spi;
gmehmet 0:ddc2fef69ef9 64 //_spi->frequency(600000);
gmehmet 0:ddc2fef69ef9 65 _spi->format( 8, 0 );
gmehmet 0:ddc2fef69ef9 66
gmehmet 0:ddc2fef69ef9 67 _internalEventCallback.attach(this, &LS013B7DH03::_cbHandler);
gmehmet 0:ddc2fef69ef9 68
gmehmet 0:ddc2fef69ef9 69 //Initialize
gmehmet 0:ddc2fef69ef9 70 //_spi->set_dma_usage((DMAUsage)DMA_USAGE_NEVER);
gmehmet 0:ddc2fef69ef9 71 _refreshCount = 0;
gmehmet 0:ddc2fef69ef9 72 _lcdPolarity = 0;
gmehmet 0:ddc2fef69ef9 73 _state = IDLE;
gmehmet 0:ddc2fef69ef9 74 _completionCallbackPtr = NULL;
gmehmet 0:ddc2fef69ef9 75 _rowCount = 0;
gmehmet 0:ddc2fef69ef9 76
gmehmet 0:ddc2fef69ef9 77 //Start toggling the EXTCOM pin
gmehmet 0:ddc2fef69ef9 78 //_displayToggler.attach(this, &LS013B7DH03::toggle, 0.008f);
gmehmet 0:ddc2fef69ef9 79 }
gmehmet 0:ddc2fef69ef9 80
gmehmet 0:ddc2fef69ef9 81 /**
gmehmet 0:ddc2fef69ef9 82 * Call this function at 55 ~ 65 Hz to keep the display up-to-date.
gmehmet 0:ddc2fef69ef9 83 */
gmehmet 0:ddc2fef69ef9 84 void LS013B7DH03::toggle() {
gmehmet 0:ddc2fef69ef9 85 // _EXTCOM->write(!_EXTCOM->read());
gmehmet 0:ddc2fef69ef9 86 // _refreshCount++;
gmehmet 0:ddc2fef69ef9 87 }
gmehmet 0:ddc2fef69ef9 88
gmehmet 0:ddc2fef69ef9 89 /**
gmehmet 0:ddc2fef69ef9 90 * Function to get internal refresh counter
gmehmet 0:ddc2fef69ef9 91 */
gmehmet 0:ddc2fef69ef9 92 uint32_t LS013B7DH03::getRefreshTicks() {
gmehmet 0:ddc2fef69ef9 93 return _refreshCount;
gmehmet 0:ddc2fef69ef9 94 }
gmehmet 0:ddc2fef69ef9 95
gmehmet 0:ddc2fef69ef9 96 /**
gmehmet 0:ddc2fef69ef9 97 * Call this function to push all changes to the display
gmehmet 0:ddc2fef69ef9 98 */
gmehmet 0:ddc2fef69ef9 99 int LS013B7DH03::update( cbptr_t callback ) {
gmehmet 0:ddc2fef69ef9 100 uint32_t rowCount = 0;
gmehmet 0:ddc2fef69ef9 101 bool update = false;
gmehmet 0:ddc2fef69ef9 102
gmehmet 0:ddc2fef69ef9 103 // Check if something actually changed in the pixelbuffer
gmehmet 0:ddc2fef69ef9 104 for(rowCount = 0; rowCount < DISPLAY_HEIGHT/DISPLAY_BUFFER_TYPE_SIZE; rowCount++) {
gmehmet 0:ddc2fef69ef9 105 if(_dirtyRows[rowCount] != 0) update = true;
gmehmet 0:ddc2fef69ef9 106 }
gmehmet 0:ddc2fef69ef9 107
gmehmet 0:ddc2fef69ef9 108 if(update == false) return LS013B7DH03_NO_ACTION;
gmehmet 0:ddc2fef69ef9 109
gmehmet 0:ddc2fef69ef9 110 // Watch out to not mess up a transfer
gmehmet 0:ddc2fef69ef9 111 if(_state != IDLE) return LS013B7DH03_ERROR_BUSY;
gmehmet 0:ddc2fef69ef9 112
gmehmet 0:ddc2fef69ef9 113 _completionCallbackPtr = callback;
gmehmet 0:ddc2fef69ef9 114
gmehmet 0:ddc2fef69ef9 115 // Take control
gmehmet 0:ddc2fef69ef9 116 _state = WAIT_WRITE;
gmehmet 0:ddc2fef69ef9 117 _rowCount = 0;
gmehmet 0:ddc2fef69ef9 118
gmehmet 0:ddc2fef69ef9 119 //Initialize the command vector
gmehmet 0:ddc2fef69ef9 120 _cmd[0] = (uint8_t)SWAP8(LS013B7DH03_CMD_UPDATE);
gmehmet 0:ddc2fef69ef9 121 _cmd[1] = SWAP8(1);
gmehmet 0:ddc2fef69ef9 122
gmehmet 0:ddc2fef69ef9 123 // Activate LCD
gmehmet 0:ddc2fef69ef9 124 _CS->write(1);
gmehmet 0:ddc2fef69ef9 125 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.01f);
gmehmet 0:ddc2fef69ef9 126
gmehmet 0:ddc2fef69ef9 127 return LS013B7DH03_OK;
gmehmet 0:ddc2fef69ef9 128 }
gmehmet 0:ddc2fef69ef9 129
gmehmet 0:ddc2fef69ef9 130 /**
gmehmet 0:ddc2fef69ef9 131 * Function to test display buffer
gmehmet 0:ddc2fef69ef9 132 */
gmehmet 0:ddc2fef69ef9 133 int LS013B7DH03::showDemo() {
gmehmet 0:ddc2fef69ef9 134 for(uint32_t i = 0; i < DISPLAY_BUFFER_ELEMENTS; i+=2) {
gmehmet 0:ddc2fef69ef9 135 _pixelBuffer[i] = 0x00555345;
gmehmet 0:ddc2fef69ef9 136 }
gmehmet 0:ddc2fef69ef9 137 memset((void*)_dirtyRows, 0x33, sizeof(_dirtyRows));
gmehmet 0:ddc2fef69ef9 138
gmehmet 0:ddc2fef69ef9 139 return LS013B7DH03_OK;
gmehmet 0:ddc2fef69ef9 140 }
gmehmet 0:ddc2fef69ef9 141
gmehmet 0:ddc2fef69ef9 142 /**
gmehmet 0:ddc2fef69ef9 143 * Call this function to immediately clear the display
gmehmet 0:ddc2fef69ef9 144 */
gmehmet 0:ddc2fef69ef9 145 int LS013B7DH03::clearImmediate( cbptr_t callback ) {
gmehmet 0:ddc2fef69ef9 146 // Watch out to not mess up a transfer
gmehmet 0:ddc2fef69ef9 147 if(_state != IDLE) return LS013B7DH03_ERROR_BUSY;
gmehmet 0:ddc2fef69ef9 148
gmehmet 0:ddc2fef69ef9 149 _state = WAIT_CLEAR;
gmehmet 0:ddc2fef69ef9 150 _completionCallbackPtr = callback;
gmehmet 0:ddc2fef69ef9 151
gmehmet 0:ddc2fef69ef9 152 // Clear out the pixel buffer
gmehmet 0:ddc2fef69ef9 153 memset((void*)_pixelBuffer, White, sizeof(_pixelBuffer));
gmehmet 0:ddc2fef69ef9 154 memset((void*)_dirtyRows, 0, sizeof(_dirtyRows));
gmehmet 0:ddc2fef69ef9 155
gmehmet 0:ddc2fef69ef9 156 _cmd[0] = (uint8_t)(SWAP8(LS013B7DH03_CMD_ALL_CLEAR | _lcdPolarity));
gmehmet 0:ddc2fef69ef9 157 _cmd[1] = 0;
gmehmet 0:ddc2fef69ef9 158
gmehmet 0:ddc2fef69ef9 159 // Wait for the ChipSelect line
gmehmet 0:ddc2fef69ef9 160 _CS->write(1);
gmehmet 0:ddc2fef69ef9 161 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.01f);
gmehmet 0:ddc2fef69ef9 162
gmehmet 0:ddc2fef69ef9 163 return LS013B7DH03_OK;
gmehmet 0:ddc2fef69ef9 164 }
gmehmet 0:ddc2fef69ef9 165
gmehmet 0:ddc2fef69ef9 166 void LS013B7DH03::_cbHandlerTimeout( void ) {
gmehmet 0:ddc2fef69ef9 167 this->_cbHandler(0);
gmehmet 0:ddc2fef69ef9 168 }
gmehmet 0:ddc2fef69ef9 169
gmehmet 0:ddc2fef69ef9 170 void LS013B7DH03::_cbHandler( int event ) {
gmehmet 0:ddc2fef69ef9 171 if((_state == WAIT_WRITE) || (_state == WRITING))
gmehmet 0:ddc2fef69ef9 172 {
gmehmet 0:ddc2fef69ef9 173 _state = WRITING;
gmehmet 0:ddc2fef69ef9 174 while(_rowCount < DISPLAY_HEIGHT) {
gmehmet 0:ddc2fef69ef9 175 // Determine the next line to send
gmehmet 0:ddc2fef69ef9 176 if((_dirtyRows[_rowCount / DISPLAY_BUFFER_TYPE_SIZE] & (1 << (_rowCount % DISPLAY_BUFFER_TYPE_SIZE))) != 0) {
gmehmet 0:ddc2fef69ef9 177
gmehmet 0:ddc2fef69ef9 178 // Row is dirty, send an update to the display
gmehmet 0:ddc2fef69ef9 179 _cmd[1] = (uint8_t)SWAP8(_rowCount + 1);
gmehmet 0:ddc2fef69ef9 180 memcpy((void*)&(_cmd[2]), (const void*)&(_pixelBuffer[_rowCount*(DISPLAY_WIDTH/DISPLAY_BUFFER_TYPE_SIZE)]), DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE));
gmehmet 0:ddc2fef69ef9 181
gmehmet 0:ddc2fef69ef9 182 if(_spi->write((const char*)_cmd, (2 + (DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE))) , (char*)NULL, 0/*, _internalEventCallback, SPI_EVENT_COMPLETE*/) != (2 + (DISPLAY_WIDTH / DISPLAY_BUFFER_TYPE_SIZE * sizeof(DISPLAY_BUFFER_TYPE)))) {
gmehmet 0:ddc2fef69ef9 183 // SPI is busy, with another transaction. This means the data to the LCD has been corrupted, so fail here.
gmehmet 0:ddc2fef69ef9 184 _state = DONE;
gmehmet 0:ddc2fef69ef9 185 //printf("Failed at _cbHandler\n");
gmehmet 0:ddc2fef69ef9 186 // Make sure the handler is called again
gmehmet 0:ddc2fef69ef9 187 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.1f);
gmehmet 0:ddc2fef69ef9 188 }else{ //sc...
gmehmet 0:ddc2fef69ef9 189 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.001f);
gmehmet 0:ddc2fef69ef9 190 }
gmehmet 0:ddc2fef69ef9 191
gmehmet 0:ddc2fef69ef9 192 // Transaction is in progress, so update row state
gmehmet 0:ddc2fef69ef9 193 _dirtyRows[_rowCount / DISPLAY_BUFFER_TYPE_SIZE] &= ~(1 << (_rowCount % DISPLAY_BUFFER_TYPE_SIZE));
gmehmet 0:ddc2fef69ef9 194 _rowCount++;
gmehmet 0:ddc2fef69ef9 195 return;
gmehmet 0:ddc2fef69ef9 196 }
gmehmet 0:ddc2fef69ef9 197
gmehmet 0:ddc2fef69ef9 198 // Row wasn't touched, so check the next row
gmehmet 0:ddc2fef69ef9 199 _rowCount++;
gmehmet 0:ddc2fef69ef9 200 }
gmehmet 0:ddc2fef69ef9 201
gmehmet 0:ddc2fef69ef9 202 // Done sending!
gmehmet 0:ddc2fef69ef9 203 _cmd[1] = 0xFF;
gmehmet 0:ddc2fef69ef9 204 _state = TRANSFERS_DONE;
gmehmet 0:ddc2fef69ef9 205 if(_spi->write((const char*)_cmd, 2, (char*)NULL, 0/*, _internalEventCallback, SPI_EVENT_COMPLETE*/) != 2) {
gmehmet 0:ddc2fef69ef9 206 // SPI is busy, with another transaction. This means the data to the LCD has been corrupted, so fail here.
gmehmet 0:ddc2fef69ef9 207 _state = DONE;
gmehmet 0:ddc2fef69ef9 208
gmehmet 0:ddc2fef69ef9 209 // Make sure the handler is called again
gmehmet 0:ddc2fef69ef9 210 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.1f);
gmehmet 0:ddc2fef69ef9 211 }else{ //sc...
gmehmet 0:ddc2fef69ef9 212 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.001f);
gmehmet 0:ddc2fef69ef9 213 }
gmehmet 0:ddc2fef69ef9 214 return;
gmehmet 0:ddc2fef69ef9 215 }
gmehmet 0:ddc2fef69ef9 216 else if (_state == WAIT_CLEAR)
gmehmet 0:ddc2fef69ef9 217 {
gmehmet 0:ddc2fef69ef9 218 _state = TRANSFERS_DONE;
gmehmet 0:ddc2fef69ef9 219 if(_spi->write((const char*)_cmd, 2, (char*)NULL, 0/*, _internalEventCallback, SPI_EVENT_COMPLETE*/) != 2) {
gmehmet 0:ddc2fef69ef9 220 // SPI is busy, with another transaction. This means the data to the LCD has been corrupted, so fail here.
gmehmet 0:ddc2fef69ef9 221 _state = DONE;
gmehmet 0:ddc2fef69ef9 222
gmehmet 0:ddc2fef69ef9 223 // Make sure the handler is called again
gmehmet 0:ddc2fef69ef9 224 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.1f);
gmehmet 0:ddc2fef69ef9 225 }else{ //sc...
gmehmet 0:ddc2fef69ef9 226 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.001f);
gmehmet 0:ddc2fef69ef9 227 }
gmehmet 0:ddc2fef69ef9 228 return;
gmehmet 0:ddc2fef69ef9 229 }
gmehmet 0:ddc2fef69ef9 230 else if (_state == TRANSFERS_DONE)
gmehmet 0:ddc2fef69ef9 231 {
gmehmet 0:ddc2fef69ef9 232 _state = DONE;
gmehmet 0:ddc2fef69ef9 233 _csTimeout.attach(this, &LS013B7DH03::_cbHandlerTimeout, 0.01f);
gmehmet 0:ddc2fef69ef9 234 return;
gmehmet 0:ddc2fef69ef9 235 }
gmehmet 0:ddc2fef69ef9 236 else if (_state == DONE)
gmehmet 0:ddc2fef69ef9 237 {
gmehmet 0:ddc2fef69ef9 238 _CS->write(0);
gmehmet 0:ddc2fef69ef9 239 _state = IDLE;
gmehmet 0:ddc2fef69ef9 240 if(_completionCallbackPtr != 0) _completionCallbackPtr();
gmehmet 0:ddc2fef69ef9 241 return;
gmehmet 0:ddc2fef69ef9 242 }
gmehmet 0:ddc2fef69ef9 243 }
gmehmet 0:ddc2fef69ef9 244
gmehmet 0:ddc2fef69ef9 245 } // namespace silabs