Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
main.cpp@41:5a436163dddf, 2018-10-22 (annotated)
- Committer:
- FCH_31
- Date:
- Mon Oct 22 09:37:50 2018 +0000
- Revision:
- 41:5a436163dddf
- Parent:
- 21:8524d815c587
avec radio;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
FCH_31 | 8:cd489b7c49a0 | 1 | /* |
FCH_31 | 8:cd489b7c49a0 | 2 | * MISNet |
FCH_31 | 8:cd489b7c49a0 | 3 | * |
FCH_31 | 8:cd489b7c49a0 | 4 | * Main TERMINAL VERSION HALF DUPLEX |
FCH_31 | 8:cd489b7c49a0 | 5 | * |
FCH_31 | 8:cd489b7c49a0 | 6 | * Created on: August 17, 2018 Author: Francis CHATAIN |
FCH_31 | 8:cd489b7c49a0 | 7 | * |
FCH_31 | 8:cd489b7c49a0 | 8 | */ |
FCH_31 | 8:cd489b7c49a0 | 9 | |
GregCr | 1:22e02d1cfbca | 10 | #include "mbed.h" |
GregCr | 1:22e02d1cfbca | 11 | #include "sx1280-hal.h" |
FCH_31 | 3:3adb454ba1d2 | 12 | #include "stdio.h" |
FCH_31 | 8:cd489b7c49a0 | 13 | #include <string> |
GregCr | 1:22e02d1cfbca | 14 | |
FCH_31 | 8:cd489b7c49a0 | 15 | #include "main.h" |
patrick_duc | 21:8524d815c587 | 16 | #include "Controller.hpp" |
FCH_31 | 7:1d890cab51bd | 17 | |
FCH_31 | 41:5a436163dddf | 18 | #include "Radio.h" |
FCH_31 | 41:5a436163dddf | 19 | |
FCH_31 | 7:1d890cab51bd | 20 | |
FCH_31 | 8:cd489b7c49a0 | 21 | using namespace std; |
patrick_duc | 20:b0281e8a375a | 22 | using namespace misnet; |
GregCr | 1:22e02d1cfbca | 23 | |
patrick_duc | 21:8524d815c587 | 24 | // INSTANCE of CONTROLLER OBJECT |
GregCr | 1:22e02d1cfbca | 25 | |
FCH_31 | 41:5a436163dddf | 26 | Controller controller ; // Core of controller start also |
FCH_31 | 41:5a436163dddf | 27 | |
FCH_31 | 41:5a436163dddf | 28 | // --------------------- A mettre dans la database |
FCH_31 | 41:5a436163dddf | 29 | RadioParameter radioParam ; // Serial Read |
FCH_31 | 41:5a436163dddf | 30 | RadioParameter radioParamFactory ; // Contain Factory |
FCH_31 | 41:5a436163dddf | 31 | RadioParameter radioParamEmitter ; // Contain Config Emet |
FCH_31 | 41:5a436163dddf | 32 | RadioParameter radioParamReceiver ; // Contain Config Receiver |
FCH_31 | 41:5a436163dddf | 33 | ModeParameter modeParam ; // Mission Mode |
FCH_31 | 41:5a436163dddf | 34 | |
FCH_31 | 41:5a436163dddf | 35 | |
FCH_31 | 41:5a436163dddf | 36 | // A deplacer |
FCH_31 | 41:5a436163dddf | 37 | static char *print_double ( char* str, double v, int decimalDigits=2) ; |
FCH_31 | 2:57f098de07c7 | 38 | |
FCH_31 | 2:57f098de07c7 | 39 | |
FCH_31 | 8:cd489b7c49a0 | 40 | //****************************************************************************** |
lo | 15:9c1c4368670f | 41 | // Timers |
FCH_31 | 8:cd489b7c49a0 | 42 | //****************************************************************************** |
FCH_31 | 8:cd489b7c49a0 | 43 | uint16_t TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening = 0L ; |
FCH_31 | 41:5a436163dddf | 44 | volatile uint32_t listenFlag=0, syncFlag=0, goodHealthFlag=0, payloadFlag=0, irqFlag=0, statPayLoadCounter = 0 ; |
lo | 15:9c1c4368670f | 45 | |
FCH_31 | 8:cd489b7c49a0 | 46 | LowPowerTicker wakeUpPayload ; // normal wake up |
FCH_31 | 8:cd489b7c49a0 | 47 | void wakeUpPayloadCallback (void) ; |
FCH_31 | 7:1d890cab51bd | 48 | |
FCH_31 | 8:cd489b7c49a0 | 49 | LowPowerTicker wakeUpGoodhealth ; // GoodHealth wake up |
FCH_31 | 8:cd489b7c49a0 | 50 | void wakeUpGoodhealthCallback (void) ; |
FCH_31 | 7:1d890cab51bd | 51 | |
FCH_31 | 8:cd489b7c49a0 | 52 | LowPowerTicker wakeUpSynchro ; // Synchro wake up (Mode B) |
FCH_31 | 8:cd489b7c49a0 | 53 | void wakeUpSynchroCallback (void) ; |
FCH_31 | 7:1d890cab51bd | 54 | |
FCH_31 | 8:cd489b7c49a0 | 55 | LowPowerTicker wakeUpListening ; // Listening wake up (Mode C) |
FCH_31 | 8:cd489b7c49a0 | 56 | void wakeUpListeningCallback (void) ; |
FCH_31 | 7:1d890cab51bd | 57 | |
FCH_31 | 8:cd489b7c49a0 | 58 | void setup () ; // Init Terminal |
FCH_31 | 8:cd489b7c49a0 | 59 | void loop () ; // Main Loop |
FCH_31 | 10:1b37e3b41947 | 60 | void wakeUpIrqTacSwitch () ; // IRQ Tac Switch |
FCH_31 | 7:1d890cab51bd | 61 | |
FCH_31 | 7:1d890cab51bd | 62 | |
FCH_31 | 8:cd489b7c49a0 | 63 | // ============================================================================ Main |
FCH_31 | 8:cd489b7c49a0 | 64 | int main( ) { setup () ; loop () ; } |
FCH_31 | 8:cd489b7c49a0 | 65 | // ============================================================================ |
FCH_31 | 7:1d890cab51bd | 66 | |
FCH_31 | 7:1d890cab51bd | 67 | |
FCH_31 | 8:cd489b7c49a0 | 68 | // ============================================================================ Setup |
FCH_31 | 2:57f098de07c7 | 69 | void setup () { |
GregCr | 1:22e02d1cfbca | 70 | |
FCH_31 | 41:5a436163dddf | 71 | controller.start (); // Start controller |
FCH_31 | 8:cd489b7c49a0 | 72 | |
FCH_31 | 8:cd489b7c49a0 | 73 | // -------------------------------------------------- Scheduler by IRQ or watch dog |
FCH_31 | 8:cd489b7c49a0 | 74 | |
FCH_31 | 41:5a436163dddf | 75 | controller.getScheduling (TimerPayload, TimerGoodhealth, TimerSynchro, TimerListening) ; // What mode ? |
FCH_31 | 8:cd489b7c49a0 | 76 | |
FCH_31 | 10:1b37e3b41947 | 77 | wakeUpPayload.attach (&wakeUpPayloadCallback, (float)TimerPayload ) ; // Mode A + All Mode |
FCH_31 | 10:1b37e3b41947 | 78 | wakeUpGoodhealth.attach (&wakeUpGoodhealthCallback, (float)TimerGoodhealth) ; // Mode A + All Mode |
FCH_31 | 8:cd489b7c49a0 | 79 | |
FCH_31 | 8:cd489b7c49a0 | 80 | if ( TimerSynchro !=0) |
FCH_31 | 10:1b37e3b41947 | 81 | wakeUpSynchro.attach (&wakeUpSynchroCallback, (float)TimerSynchro) ; // Mode B |
FCH_31 | 8:cd489b7c49a0 | 82 | |
FCH_31 | 8:cd489b7c49a0 | 83 | if ( TimerSynchro !=0) |
FCH_31 | 10:1b37e3b41947 | 84 | wakeUpListening.attach (&wakeUpListeningCallback,(float)TimerListening) ; // Mode C |
FCH_31 | 10:1b37e3b41947 | 85 | |
FCH_31 | 10:1b37e3b41947 | 86 | |
FCH_31 | 41:5a436163dddf | 87 | // TODO : Associer l'IRQ du TAC switch au handler d'exception wakeUpIrqTacSwitch |
FCH_31 | 10:1b37e3b41947 | 88 | |
FCH_31 | 41:5a436163dddf | 89 | |
FCH_31 | 41:5a436163dddf | 90 | // ============================ A mettre dans l'init de la database et de la radio |
FCH_31 | 41:5a436163dddf | 91 | radioParamFactory.modulation = PACKET_TYPE_LORA ; |
FCH_31 | 41:5a436163dddf | 92 | radioParamFactory.spreadingFactor = 2 ; |
FCH_31 | 41:5a436163dddf | 93 | radioParamFactory.bandWidth = 1 ; |
FCH_31 | 41:5a436163dddf | 94 | radioParamFactory.codingRate = 0 ; |
FCH_31 | 41:5a436163dddf | 95 | radioParamFactory.frequency = 2400000000UL ; |
FCH_31 | 41:5a436163dddf | 96 | radioParamFactory.outputPower = -18 ; |
FCH_31 | 41:5a436163dddf | 97 | |
FCH_31 | 41:5a436163dddf | 98 | radioParamReceiver = radioParamFactory ; |
FCH_31 | 41:5a436163dddf | 99 | radioParam = radioParamFactory ; |
FCH_31 | 41:5a436163dddf | 100 | radioParamFactory.outputPower = 0 ; |
FCH_31 | 41:5a436163dddf | 101 | radioParamEmitter = radioParamFactory ; |
FCH_31 | 41:5a436163dddf | 102 | |
FCH_31 | 41:5a436163dddf | 103 | modeParam.addrType = 1 ; |
FCH_31 | 41:5a436163dddf | 104 | modeParam.terminalAddr = 1 ; |
FCH_31 | 41:5a436163dddf | 105 | modeParam.subnetAddr = 0 ; |
FCH_31 | 41:5a436163dddf | 106 | modeParam.raw[0] = GENERIC_MODE ; |
FCH_31 | 41:5a436163dddf | 107 | modeParam.raw[1] = 0x01 ; |
FCH_31 | 41:5a436163dddf | 108 | |
FCH_31 | 41:5a436163dddf | 109 | uint16_t FIRMWARE_Radio = 0 ; |
FCH_31 | 41:5a436163dddf | 110 | bool radioStatus ; // Status I/F |
FCH_31 | 41:5a436163dddf | 111 | radioStatus = radioSelfTest (&FIRMWARE_Radio) ; // Radio Test |
FCH_31 | 41:5a436163dddf | 112 | |
FCH_31 | 41:5a436163dddf | 113 | if (radioStatus) printf ("*** MAIN *** RADIO OK \r\n"); else printf ("*** MAIN *** RADIO NOK \r\n") ; |
FCH_31 | 41:5a436163dddf | 114 | |
FCH_31 | 41:5a436163dddf | 115 | radioInitEmitter ( radioParamEmitter ) ; |
FCH_31 | 41:5a436163dddf | 116 | radioInitReceiver ( radioParamReceiver) ; |
FCH_31 | 41:5a436163dddf | 117 | radioInitRadio () ; |
FCH_31 | 41:5a436163dddf | 118 | //radioStartReceive (radioParamReceiver) ; |
FCH_31 | 41:5a436163dddf | 119 | |
FCH_31 | 41:5a436163dddf | 120 | printf ("*** MAIN *** SETUP End \r\n"); |
FCH_31 | 10:1b37e3b41947 | 121 | |
FCH_31 | 8:cd489b7c49a0 | 122 | } |
FCH_31 | 8:cd489b7c49a0 | 123 | //============================================================================== |
FCH_31 | 4:41a92fbf702a | 124 | |
FCH_31 | 7:1d890cab51bd | 125 | |
FCH_31 | 8:cd489b7c49a0 | 126 | // ============================================================================= LOOP |
FCH_31 | 8:cd489b7c49a0 | 127 | void loop () { |
FCH_31 | 41:5a436163dddf | 128 | |
FCH_31 | 41:5a436163dddf | 129 | // A deplacer |
FCH_31 | 41:5a436163dddf | 130 | #define FRAME_SIZE 100 |
FCH_31 | 41:5a436163dddf | 131 | uint8_t frame[FRAME_SIZE] ; |
FCH_31 | 41:5a436163dddf | 132 | char message[FRAME_SIZE], buffer1[FRAME_SIZE] ; |
FCH_31 | 41:5a436163dddf | 133 | uint8_t _len ; |
FCH_31 | 41:5a436163dddf | 134 | int8_t _rssi ; |
FCH_31 | 41:5a436163dddf | 135 | int8_t _snr ; |
FCH_31 | 41:5a436163dddf | 136 | |
FCH_31 | 8:cd489b7c49a0 | 137 | while(1) { |
FCH_31 | 41:5a436163dddf | 138 | |
lo | 15:9c1c4368670f | 139 | if(listenFlag){ // Listen radio |
FCH_31 | 41:5a436163dddf | 140 | printf ("*** MAIN *** LOOP : wakeUpListeningCallback \r\n"); |
lo | 15:9c1c4368670f | 141 | listenFlag=0; |
FCH_31 | 41:5a436163dddf | 142 | controller.manageListening(); |
lo | 15:9c1c4368670f | 143 | } |
lo | 15:9c1c4368670f | 144 | if(syncFlag){ // Prepare response |
FCH_31 | 41:5a436163dddf | 145 | printf ("*** MAIN *** LOOP : wakeUpSynchroCallback \r\n"); |
lo | 15:9c1c4368670f | 146 | syncFlag=0; |
FCH_31 | 41:5a436163dddf | 147 | controller.manageSynchro(); |
lo | 15:9c1c4368670f | 148 | } |
lo | 15:9c1c4368670f | 149 | if(goodHealthFlag){ // Prepare response |
FCH_31 | 41:5a436163dddf | 150 | printf ("*** MAIN *** LOOP : wakeUpGoodhealthCallback r\n"); |
lo | 15:9c1c4368670f | 151 | goodHealthFlag=0; |
FCH_31 | 41:5a436163dddf | 152 | controller.manageGoodhealth(); |
lo | 15:9c1c4368670f | 153 | } |
lo | 15:9c1c4368670f | 154 | if(payloadFlag){ // read Sensors |
FCH_31 | 41:5a436163dddf | 155 | printf ("*** MAIN *** LOOP : wakeUpPayloadCallback cptr=%d\r\n", statPayLoadCounter); |
lo | 15:9c1c4368670f | 156 | payloadFlag=0; |
FCH_31 | 41:5a436163dddf | 157 | //controller.manageSensors(); |
FCH_31 | 41:5a436163dddf | 158 | // To test ciphering and radio send a simple message |
FCH_31 | 41:5a436163dddf | 159 | |
FCH_31 | 41:5a436163dddf | 160 | memset ( &frame , 0 , FRAME_SIZE ) ; |
FCH_31 | 41:5a436163dddf | 161 | memset ( &message , 0 , FRAME_SIZE ) ; |
FCH_31 | 41:5a436163dddf | 162 | // Fab a simple test message |
FCH_31 | 41:5a436163dddf | 163 | frame[0] = 200 ; |
FCH_31 | 41:5a436163dddf | 164 | frame[1] = 55 ; |
FCH_31 | 41:5a436163dddf | 165 | frame[2] = 'T' ; |
FCH_31 | 41:5a436163dddf | 166 | frame[3] = 'E' ; |
FCH_31 | 41:5a436163dddf | 167 | frame[4] = 'S' ; |
FCH_31 | 41:5a436163dddf | 168 | frame[5] = 'T' ; |
FCH_31 | 41:5a436163dddf | 169 | frame[6] = 'S' ; |
FCH_31 | 41:5a436163dddf | 170 | |
FCH_31 | 41:5a436163dddf | 171 | int n = sprintf ( message, "%c%c___%s___", |
FCH_31 | 41:5a436163dddf | 172 | 0x42, |
FCH_31 | 41:5a436163dddf | 173 | 55, |
FCH_31 | 41:5a436163dddf | 174 | print_double (buffer1, statPayLoadCounter)); |
FCH_31 | 41:5a436163dddf | 175 | |
FCH_31 | 41:5a436163dddf | 176 | memcpy ( frame , message , FRAME_SIZE ); |
FCH_31 | 41:5a436163dddf | 177 | |
FCH_31 | 41:5a436163dddf | 178 | // Send Message |
FCH_31 | 41:5a436163dddf | 179 | _len = strlen (message) ; |
FCH_31 | 41:5a436163dddf | 180 | radioParamEmitter.size = _len ; |
FCH_31 | 41:5a436163dddf | 181 | radioInitEmitter (radioParamEmitter) ; |
FCH_31 | 41:5a436163dddf | 182 | radioSend (radioParamEmitter, frame, _len); |
FCH_31 | 41:5a436163dddf | 183 | memset ( &frame , 0 , FRAME_SIZE ) ; |
lo | 15:9c1c4368670f | 184 | } |
FCH_31 | 41:5a436163dddf | 185 | |
FCH_31 | 41:5a436163dddf | 186 | if (radioHandler (frame, &_len, &_rssi, &_snr) ) { |
FCH_31 | 41:5a436163dddf | 187 | printf ("*** MAIN *** LOOP : radioHandler \r\n"); |
FCH_31 | 41:5a436163dddf | 188 | } |
FCH_31 | 41:5a436163dddf | 189 | |
lo | 15:9c1c4368670f | 190 | if(irqFlag){ // handle IRQ actions |
FCH_31 | 41:5a436163dddf | 191 | printf ("*** MAIN *** LOOP : wakeUpIrqTacSwitch \r\n"); |
lo | 15:9c1c4368670f | 192 | irqFlag=0; |
FCH_31 | 41:5a436163dddf | 193 | controller.manageConfiguration(); |
FCH_31 | 41:5a436163dddf | 194 | } |
lo | 15:9c1c4368670f | 195 | // deepsleep (); // breaks UART |
FCH_31 | 12:e9ec35413787 | 196 | //sleep () ; |
FCH_31 | 12:e9ec35413787 | 197 | wait(1); |
FCH_31 | 8:cd489b7c49a0 | 198 | } |
FCH_31 | 4:41a92fbf702a | 199 | } |
FCH_31 | 8:cd489b7c49a0 | 200 | // No action : all event by IRQ |
FCH_31 | 8:cd489b7c49a0 | 201 | //============================================================================== |
FCH_31 | 7:1d890cab51bd | 202 | |
FCH_31 | 7:1d890cab51bd | 203 | |
FCH_31 | 2:57f098de07c7 | 204 | |
FCH_31 | 10:1b37e3b41947 | 205 | |
FCH_31 | 10:1b37e3b41947 | 206 | // IRQ du tac switch TODO |
FCH_31 | 10:1b37e3b41947 | 207 | // ============================================================ IRQ TAC SWITCH |
FCH_31 | 10:1b37e3b41947 | 208 | void wakeUpIrqTacSwitch (void) { |
lo | 15:9c1c4368670f | 209 | //printf ("*** MAIN *** wakeUpIrqTacSwitch \r\n"); |
lo | 15:9c1c4368670f | 210 | //app.manageConfiguration () ; // IRQ |
lo | 15:9c1c4368670f | 211 | irqFlag=1; |
FCH_31 | 10:1b37e3b41947 | 212 | } |
FCH_31 | 10:1b37e3b41947 | 213 | |
FCH_31 | 10:1b37e3b41947 | 214 | |
FCH_31 | 8:cd489b7c49a0 | 215 | // ============================================================ WATCH DOG PAYLOAD |
FCH_31 | 8:cd489b7c49a0 | 216 | void wakeUpPayloadCallback (void) { |
FCH_31 | 41:5a436163dddf | 217 | statPayLoadCounter++ ; |
FCH_31 | 41:5a436163dddf | 218 | //printf ("*** MAIN *** wakeUpPayloadCallback : %d \r\n", statPayLoadCounter); |
lo | 15:9c1c4368670f | 219 | //app.manageSensors () ; // read Sensors |
lo | 15:9c1c4368670f | 220 | payloadFlag=1; |
FCH_31 | 7:1d890cab51bd | 221 | } |
FCH_31 | 10:1b37e3b41947 | 222 | |
FCH_31 | 8:cd489b7c49a0 | 223 | // ============================================================ WATCH DOG GOODHEALTH |
FCH_31 | 8:cd489b7c49a0 | 224 | void wakeUpGoodhealthCallback (void) { |
lo | 15:9c1c4368670f | 225 | //printf ("*** MAIN *** wakeUpGoodhealthCallback ========================== \r\n"); |
lo | 15:9c1c4368670f | 226 | //app.manageGoodhealth () ; // Prepare response |
lo | 15:9c1c4368670f | 227 | goodHealthFlag=1; |
FCH_31 | 7:1d890cab51bd | 228 | } |
FCH_31 | 10:1b37e3b41947 | 229 | |
FCH_31 | 8:cd489b7c49a0 | 230 | // ============================================================ WATCH DOG SYNCHRO |
FCH_31 | 8:cd489b7c49a0 | 231 | void wakeUpSynchroCallback (void) { |
lo | 15:9c1c4368670f | 232 | //printf ("*** MAIN *** wakeUpSynchroCallback \r\n"); |
lo | 15:9c1c4368670f | 233 | //app.manageSynchro () ; // Prepare response |
lo | 15:9c1c4368670f | 234 | syncFlag=1; |
FCH_31 | 8:cd489b7c49a0 | 235 | } |
FCH_31 | 10:1b37e3b41947 | 236 | |
FCH_31 | 8:cd489b7c49a0 | 237 | // ============================================================ WATCH DOG LISTENING |
FCH_31 | 8:cd489b7c49a0 | 238 | void wakeUpListeningCallback (void) { |
lo | 15:9c1c4368670f | 239 | //printf ("*** MAIN *** wakeUpListeningCallback \r\n"); |
lo | 15:9c1c4368670f | 240 | //app.manageListening () ; // Ecoute radio |
lo | 15:9c1c4368670f | 241 | listenFlag=1; |
FCH_31 | 8:cd489b7c49a0 | 242 | } |
FCH_31 | 10:1b37e3b41947 | 243 | |
FCH_31 | 8:cd489b7c49a0 | 244 | //***************************************************************************** |
FCH_31 | 7:1d890cab51bd | 245 | |
FCH_31 | 8:cd489b7c49a0 | 246 | |
FCH_31 | 41:5a436163dddf | 247 | // A deplacer |
FCH_31 | 41:5a436163dddf | 248 | |
FCH_31 | 41:5a436163dddf | 249 | /* Helper function for printing floats & doubles */ |
FCH_31 | 41:5a436163dddf | 250 | static char *print_double(char* str, double v, int decimalDigits) |
FCH_31 | 41:5a436163dddf | 251 | { |
FCH_31 | 41:5a436163dddf | 252 | int i = 1; |
FCH_31 | 41:5a436163dddf | 253 | int intPart, fractPart; |
FCH_31 | 41:5a436163dddf | 254 | int len; |
FCH_31 | 41:5a436163dddf | 255 | char *ptr; |
FCH_31 | 41:5a436163dddf | 256 | |
FCH_31 | 41:5a436163dddf | 257 | /* prepare decimal digits multiplicator */ |
FCH_31 | 41:5a436163dddf | 258 | for (;decimalDigits!=0; i*=10, decimalDigits--); |
FCH_31 | 41:5a436163dddf | 259 | |
FCH_31 | 41:5a436163dddf | 260 | /* calculate integer & fractinal parts */ |
FCH_31 | 41:5a436163dddf | 261 | intPart = (int)v; |
FCH_31 | 41:5a436163dddf | 262 | fractPart = (int)((v-(double)(int)v)*i); |
FCH_31 | 41:5a436163dddf | 263 | |
FCH_31 | 41:5a436163dddf | 264 | /* fill in integer part */ |
FCH_31 | 41:5a436163dddf | 265 | sprintf(str, "%i.", intPart); |
FCH_31 | 41:5a436163dddf | 266 | |
FCH_31 | 41:5a436163dddf | 267 | /* prepare fill in of fractional part */ |
FCH_31 | 41:5a436163dddf | 268 | len = strlen(str); |
FCH_31 | 41:5a436163dddf | 269 | ptr = &str[len]; |
FCH_31 | 41:5a436163dddf | 270 | |
FCH_31 | 41:5a436163dddf | 271 | /* fill in leading fractional zeros */ |
FCH_31 | 41:5a436163dddf | 272 | for (i/=10;i>1; i/=10, ptr++) { |
FCH_31 | 41:5a436163dddf | 273 | if (fractPart >= i) { |
FCH_31 | 41:5a436163dddf | 274 | break; |
FCH_31 | 41:5a436163dddf | 275 | } |
FCH_31 | 41:5a436163dddf | 276 | *ptr = '0'; |
FCH_31 | 41:5a436163dddf | 277 | } |
FCH_31 | 41:5a436163dddf | 278 | |
FCH_31 | 41:5a436163dddf | 279 | /* fill in (rest of) fractional part */ |
FCH_31 | 41:5a436163dddf | 280 | sprintf(ptr, "%i", fractPart); |
FCH_31 | 41:5a436163dddf | 281 | |
FCH_31 | 41:5a436163dddf | 282 | return str; |
FCH_31 | 41:5a436163dddf | 283 | } |
FCH_31 | 4:41a92fbf702a | 284 | |
FCH_31 | 4:41a92fbf702a | 285 |