Demonstration program for the VEML6040 and VEML6075 optical sensors

Dependencies:   VEML60xx mbed

Committer:
loopsva
Date:
Mon May 02 21:22:47 2016 +0000
Revision:
5:be5c1d562334
Parent:
4:28b380ba35e4
Added a few more interesting things to display

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:66a40a792cc9 1 #include "mbed.h"
loopsva 0:66a40a792cc9 2 #include "veml60xx.h" //Vishay VEML6075 UVA & UVB sensor
loopsva 0:66a40a792cc9 3
loopsva 0:66a40a792cc9 4 Serial pc(USBTX, USBRX);
loopsva 0:66a40a792cc9 5
loopsva 0:66a40a792cc9 6 #define SDA0 D14 //PTE25
loopsva 0:66a40a792cc9 7 #define SCL0 D15 //PTE24
loopsva 0:66a40a792cc9 8
loopsva 1:cb3f098cfa62 9 veml60xx veml(SDA0, SCL0, 400000); //UV sensor
loopsva 1:cb3f098cfa62 10 veml60xx::veml60xx_struct vemlSTR = {}; //data structure for VEML60xx
loopsva 0:66a40a792cc9 11
loopsva 0:66a40a792cc9 12 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:66a40a792cc9 13 // Print build date / time Note: display is UTC, not local time
loopsva 0:66a40a792cc9 14
loopsva 0:66a40a792cc9 15 void printBuildDate() {
loopsva 0:66a40a792cc9 16 pc.printf("FRDM-K64F + VEML6040 and VEML6075 ");
loopsva 0:66a40a792cc9 17 pc.printf(" -> build: " __DATE__ " " __TIME__ "(UTC) K Braun\n");
loopsva 0:66a40a792cc9 18 }
loopsva 0:66a40a792cc9 19
loopsva 0:66a40a792cc9 20 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:66a40a792cc9 21 // initial splash display
loopsva 0:66a40a792cc9 22
loopsva 0:66a40a792cc9 23 void initSplash() {
loopsva 0:66a40a792cc9 24 pc.printf("\r\n\r\n");
loopsva 0:66a40a792cc9 25 pc.printf("--------------------------------------------------------------------------------\r\n");
loopsva 0:66a40a792cc9 26 printBuildDate();
loopsva 0:66a40a792cc9 27 }
loopsva 0:66a40a792cc9 28
loopsva 0:66a40a792cc9 29 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:66a40a792cc9 30 // Show VEML60xx contents
loopsva 0:66a40a792cc9 31
loopsva 5:be5c1d562334 32 int cnts = 0;
loopsva 1:cb3f098cfa62 33
loopsva 5:be5c1d562334 34 void dispVeml60xxc() {
loopsva 1:cb3f098cfa62 35 uint16_t rdata = veml.getConfig(vemlSTR);
loopsva 0:66a40a792cc9 36 if((rdata & VEML60xx_CONF_BITS_AF) == VEML60xx_CONF_BITS_AF) {
loopsva 1:cb3f098cfa62 37 rdata = veml.startAccess(vemlSTR);
loopsva 0:66a40a792cc9 38 if(rdata == 0) {
loopsva 0:66a40a792cc9 39 int rcnt = 0;
loopsva 0:66a40a792cc9 40 while(1) {
loopsva 1:cb3f098cfa62 41 rdata = veml.getConfig(vemlSTR);
loopsva 0:66a40a792cc9 42 if(!((rdata & VEML60xx_CONF_BITS_TRIG) == VEML60xx_CONF_BITS_TRIG)) break;
loopsva 1:cb3f098cfa62 43 #ifdef RTOS_H
loopsva 1:cb3f098cfa62 44 Thread::wait(1);
loopsva 1:cb3f098cfa62 45 #else
loopsva 0:66a40a792cc9 46 wait_ms(1);
loopsva 1:cb3f098cfa62 47 #endif
loopsva 0:66a40a792cc9 48 rcnt++;
loopsva 0:66a40a792cc9 49 if(rcnt > 2000) break;
loopsva 0:66a40a792cc9 50 }
loopsva 0:66a40a792cc9 51 pc.printf("VEML60xx count: %d\r\n", rcnt);
loopsva 0:66a40a792cc9 52 if(rcnt > 2000) return;
loopsva 0:66a40a792cc9 53 } else {
loopsva 0:66a40a792cc9 54 pc.printf("unexpected VEML60xx error : %d\r\n", rdata);
loopsva 0:66a40a792cc9 55 return;
loopsva 0:66a40a792cc9 56 }
loopsva 0:66a40a792cc9 57 }
loopsva 1:cb3f098cfa62 58
loopsva 5:be5c1d562334 59 cnts++;
loopsva 1:cb3f098cfa62 60 //NOTE: 6040 is auto adjust, 6075 is manual with "opto 0" to "opto 4" cli command. 4 = highest resolution
loopsva 1:cb3f098cfa62 61 if(vemlSTR.is6075) {
loopsva 1:cb3f098cfa62 62 veml.getRawData(vemlSTR);
loopsva 1:cb3f098cfa62 63 bool chgd = false;
loopsva 1:cb3f098cfa62 64 //bool chgd = veml.autoAdjustLux(vemlSTR);
loopsva 5:be5c1d562334 65 pc.printf("\r\nVEML6075 contents, count: %6d\r\n", cnts);
loopsva 1:cb3f098cfa62 66 pc.printf("- id: %04xh\r\n", vemlSTR.id);
loopsva 1:cb3f098cfa62 67 pc.printf("- conf: %04xh\r\n", vemlSTR.conf_reg);
loopsva 4:28b380ba35e4 68 pc.printf("- trig_dly: %dmS\r\n", vemlSTR.trig_dly);
loopsva 1:cb3f098cfa62 69 pc.printf("- uva_step: %.6f\r\n", vemlSTR.uva_step);
loopsva 1:cb3f098cfa62 70 pc.printf("- uvb_step: %.6f\r\n\r\n", vemlSTR.uvb_step);
loopsva 0:66a40a792cc9 71 if(chgd) {
loopsva 0:66a40a792cc9 72 pc.printf("Adjusting Lux level, try again...\r\n");
loopsva 0:66a40a792cc9 73 return;
loopsva 0:66a40a792cc9 74 }
loopsva 1:cb3f098cfa62 75 veml.convertRawData(vemlSTR);
loopsva 1:cb3f098cfa62 76 pc.printf("- uva_d: %04xh\r\n", vemlSTR.uva_d);
loopsva 1:cb3f098cfa62 77 pc.printf("- uvb_d: %04xh\r\n", vemlSTR.uvb_d);
loopsva 1:cb3f098cfa62 78 pc.printf("- dummy_d: %04xh\r\n", vemlSTR.dummy_d);
loopsva 1:cb3f098cfa62 79 pc.printf("- uv_c1: %04xh\r\n", vemlSTR.uv_c1);
loopsva 1:cb3f098cfa62 80 pc.printf("- uv_c2: %04xh\r\n", vemlSTR.uv_c2);
loopsva 1:cb3f098cfa62 81 pc.printf("- uva_comp: %.2f\r\n", vemlSTR.uva_comp);
loopsva 1:cb3f098cfa62 82 pc.printf("- uvb_comp: %.2f\r\n", vemlSTR.uvb_comp);
loopsva 1:cb3f098cfa62 83 pc.printf("- uv_index: %.2f\r\n", vemlSTR.uv_index);
loopsva 1:cb3f098cfa62 84 if((vemlSTR.uva_d == 65535) || (vemlSTR.uvb_d == 65535)) pc.printf("*** UV overflow!!!\r\n");
loopsva 0:66a40a792cc9 85 } else
loopsva 1:cb3f098cfa62 86 if(vemlSTR.is6040) {
loopsva 1:cb3f098cfa62 87 //veml.getRawData(vemlSTR);
loopsva 1:cb3f098cfa62 88 bool chgd = veml.autoAdjustLux(vemlSTR);
loopsva 5:be5c1d562334 89 pc.printf("\r\nVEML6040 contents, count: %6d\r\n", cnts);
loopsva 1:cb3f098cfa62 90 pc.printf("- id: %04xh\r\n", vemlSTR.id);
loopsva 1:cb3f098cfa62 91 pc.printf("- conf: %04xh\r\n", vemlSTR.conf_reg);
loopsva 4:28b380ba35e4 92 pc.printf("- trig_dly: %dmS\r\n", vemlSTR.trig_dly);
loopsva 1:cb3f098cfa62 93 pc.printf("- lux_step: %.6f\r\n\r\n", vemlSTR.lux_step);
loopsva 0:66a40a792cc9 94 if(chgd) {
loopsva 0:66a40a792cc9 95 pc.printf("Adjusting Lux level, try again...\r\n");
loopsva 0:66a40a792cc9 96 return;
loopsva 0:66a40a792cc9 97 }
loopsva 1:cb3f098cfa62 98 veml.convertRawData(vemlSTR);
loopsva 1:cb3f098cfa62 99 pc.printf("- r_d: %04xh %5dd %9.3f Lux\r\n", vemlSTR.r_d, vemlSTR.r_d, vemlSTR.r_lux);
loopsva 1:cb3f098cfa62 100 pc.printf("- g_d: %04xh %5dd %9.3f Lux\r\n", vemlSTR.g_d, vemlSTR.g_d, vemlSTR.g_lux);
loopsva 1:cb3f098cfa62 101 pc.printf("- b_d: %04xh %5dd %9.3f Lux\r\n", vemlSTR.b_d, vemlSTR.b_d, vemlSTR.b_lux);
loopsva 1:cb3f098cfa62 102 pc.printf("- w_d: %04xh %5dd %9.3f Lux\r\n", vemlSTR.w_d, vemlSTR.w_d, vemlSTR.w_lux);
loopsva 4:28b380ba35e4 103 double cct = 4278.8 * pow((vemlSTR.r_lux - vemlSTR.b_lux) / vemlSTR.g_lux + 0.5, -1.2455);
loopsva 4:28b380ba35e4 104 pc.printf("- cct: %5d K\r\n", (int)rint(cct));
loopsva 1:cb3f098cfa62 105 if((vemlSTR.r_d == 65535) || (vemlSTR.g_d == 65535) || (vemlSTR.b_d == 65535) || (vemlSTR.w_d == 65535)) pc.printf("*** RGBW overflow!!!\r\n");
loopsva 0:66a40a792cc9 106 } else {
loopsva 0:66a40a792cc9 107 pc.printf("No VEML60xx device detected...\r\n");
loopsva 0:66a40a792cc9 108 }
loopsva 0:66a40a792cc9 109 }
loopsva 0:66a40a792cc9 110
loopsva 5:be5c1d562334 111 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 5:be5c1d562334 112 // Show VEML60xx contents
loopsva 5:be5c1d562334 113
loopsva 5:be5c1d562334 114 int cnt = 0;
loopsva 5:be5c1d562334 115
loopsva 5:be5c1d562334 116 void dispVeml60xx() {
loopsva 5:be5c1d562334 117 uint16_t rdata = veml.getConfig(vemlSTR);
loopsva 5:be5c1d562334 118 bool chgd = false;
loopsva 5:be5c1d562334 119 //see if AF bit set. If AF set, set TRIG then wait for access to complete
loopsva 5:be5c1d562334 120 if((rdata & VEML60xx_CONF_BITS_AF) == VEML60xx_CONF_BITS_AF) {
loopsva 5:be5c1d562334 121 pc.printf("Triggered mode... ");
loopsva 5:be5c1d562334 122 rdata = veml.startAccess(vemlSTR);
loopsva 5:be5c1d562334 123 chgd = false;
loopsva 5:be5c1d562334 124 if(rdata) {
loopsva 5:be5c1d562334 125 pc.printf("unexpected VEML60xx error : %d\r\n", rdata);
loopsva 5:be5c1d562334 126 return;
loopsva 5:be5c1d562334 127 }
loopsva 5:be5c1d562334 128 #ifdef RTOS_H
loopsva 5:be5c1d562334 129 for(int i = 0; i < 4; i++) {
loopsva 5:be5c1d562334 130 Thread::wait(vemlSTR.trig_dly >> 2);
loopsva 5:be5c1d562334 131 cli_t++;
loopsva 5:be5c1d562334 132 housek_t++;
loopsva 5:be5c1d562334 133 tftp_t++;
loopsva 5:be5c1d562334 134 }
loopsva 5:be5c1d562334 135 #else
loopsva 5:be5c1d562334 136 wait_ms(vemlSTR.trig_dly);
loopsva 5:be5c1d562334 137 #endif
loopsva 5:be5c1d562334 138 pc.printf("\r\n");
loopsva 5:be5c1d562334 139 }
loopsva 5:be5c1d562334 140 cnt++;
loopsva 5:be5c1d562334 141
loopsva 5:be5c1d562334 142 //NOTE: 6040 is auto adjust, 6075 is manual with "opto 0" to "opto 4" cli command. 4 = highest resolution
loopsva 5:be5c1d562334 143 if(vemlSTR.is6075) {
loopsva 5:be5c1d562334 144 veml.getRawData(vemlSTR);
loopsva 5:be5c1d562334 145 //if(!(chgd)) chgd = veml.autoAdjustLux(vemlSTR);
loopsva 5:be5c1d562334 146 pc.printf("\r\nVEML6075 contents, count: %6d\r\n", cnt);
loopsva 5:be5c1d562334 147 pc.printf("- id: %04xh\r\n", vemlSTR.id);
loopsva 5:be5c1d562334 148 pc.printf("- conf: %04xh\r\n", vemlSTR.conf_reg);
loopsva 5:be5c1d562334 149 pc.printf("- trig_dly: %dmS\r\n", vemlSTR.trig_dly);
loopsva 5:be5c1d562334 150 if(chgd) {
loopsva 5:be5c1d562334 151 pc.printf("Adjusting Lux level, try again...\r\n");
loopsva 5:be5c1d562334 152 chgd = false;
loopsva 5:be5c1d562334 153 return;
loopsva 5:be5c1d562334 154 }
loopsva 5:be5c1d562334 155 pc.printf("- uva_step: %.6f\r\n", vemlSTR.uva_step);
loopsva 5:be5c1d562334 156 pc.printf("- uvb_step: %.6f\r\n\r\n", vemlSTR.uvb_step);
loopsva 5:be5c1d562334 157 veml.convertRawData(vemlSTR);
loopsva 5:be5c1d562334 158 pc.printf("- uva_d: %04xh\r\n", vemlSTR.uva_d);
loopsva 5:be5c1d562334 159 pc.printf("- uvb_d: %04xh\r\n", vemlSTR.uvb_d);
loopsva 5:be5c1d562334 160 pc.printf("- dummy_d: %04xh\r\n", vemlSTR.dummy_d);
loopsva 5:be5c1d562334 161 pc.printf("- uv_c1: %04xh\r\n", vemlSTR.uv_c1);
loopsva 5:be5c1d562334 162 pc.printf("- uv_c2: %04xh\r\n", vemlSTR.uv_c2);
loopsva 5:be5c1d562334 163 pc.printf("- uva_comp: %.2f\r\n", vemlSTR.uva_comp);
loopsva 5:be5c1d562334 164 pc.printf("- uvb_comp: %.2f\r\n", vemlSTR.uvb_comp);
loopsva 5:be5c1d562334 165 pc.printf("- uv_index: %.2f ", vemlSTR.uv_index);
loopsva 5:be5c1d562334 166 if(vemlSTR.uv_index >= 11.0) pc.printf("!!! EXTREME !!!\r\n");
loopsva 5:be5c1d562334 167 if((vemlSTR.uv_index < 11.0) && (vemlSTR.uv_index >= 8.0)) pc.printf(" !! VERY HIGH !!\r\n");
loopsva 5:be5c1d562334 168 if((vemlSTR.uv_index < 8.0) && (vemlSTR.uv_index >= 6.0)) pc.printf(" High\r\n");
loopsva 5:be5c1d562334 169 if((vemlSTR.uv_index < 6.0) && (vemlSTR.uv_index >= 3.0)) pc.printf(" Moderate\r\n");
loopsva 5:be5c1d562334 170 if((vemlSTR.uv_index < 3.0) && (vemlSTR.uv_index > 0.0)) pc.printf(" Low\r\n");
loopsva 5:be5c1d562334 171 if(vemlSTR.uv_index == 0.0) pc.printf(" Safe for Vampires\r\n");
loopsva 5:be5c1d562334 172
loopsva 5:be5c1d562334 173 if((vemlSTR.uva_d == 65535) || (vemlSTR.uvb_d == 65535)) pc.printf("*** UV overflow!!!\r\n");
loopsva 5:be5c1d562334 174 } else
loopsva 5:be5c1d562334 175 if(vemlSTR.is6040) {
loopsva 5:be5c1d562334 176 //veml.getRawData(vemlSTR);
loopsva 5:be5c1d562334 177 if(!(chgd)) chgd = veml.autoAdjustLux(vemlSTR);
loopsva 5:be5c1d562334 178 pc.printf("\r\nVEML6040 contents, count: %6d\r\n", cnt);
loopsva 5:be5c1d562334 179 pc.printf("- id: %04xh\r\n", vemlSTR.id);
loopsva 5:be5c1d562334 180 pc.printf("- conf: %04xh\r\n", vemlSTR.conf_reg);
loopsva 5:be5c1d562334 181 pc.printf("- trig_dly: %dmS\r\n", vemlSTR.trig_dly);
loopsva 5:be5c1d562334 182 if(chgd) {
loopsva 5:be5c1d562334 183 pc.printf("Adjusting Lux level, try again...\r\n");
loopsva 5:be5c1d562334 184 chgd = false;
loopsva 5:be5c1d562334 185 return;
loopsva 5:be5c1d562334 186 }
loopsva 5:be5c1d562334 187 pc.printf("- lux_step: %.6f\r\n\r\n", vemlSTR.lux_step);
loopsva 5:be5c1d562334 188 veml.convertRawData(vemlSTR);
loopsva 5:be5c1d562334 189 pc.printf("- red:");
loopsva 5:be5c1d562334 190 pc.printf(" %04xh %5dd", vemlSTR.r_d, vemlSTR.r_d);
loopsva 5:be5c1d562334 191 pc.printf(" %9.3f Lux\r\n- grn:", vemlSTR.r_lux);
loopsva 5:be5c1d562334 192 pc.printf(" %04xh %5dd", vemlSTR.g_d, vemlSTR.g_d);
loopsva 5:be5c1d562334 193 pc.printf(" %9.3f Lux\r\n- blu:", vemlSTR.g_lux);
loopsva 5:be5c1d562334 194 pc.printf(" %04xh %5dd", vemlSTR.b_d, vemlSTR.b_d);
loopsva 5:be5c1d562334 195 pc.printf(" %9.3f Lux\r\n- wht:", vemlSTR.b_lux);
loopsva 5:be5c1d562334 196 pc.printf(" %04xh %5dd", vemlSTR.w_d, vemlSTR.w_d);
loopsva 5:be5c1d562334 197 pc.printf(" %9.3f Lux\r\n- cct:", vemlSTR.w_lux);
loopsva 5:be5c1d562334 198 double cct = 4278.8 * pow((vemlSTR.r_lux - vemlSTR.b_lux) / vemlSTR.g_lux + 0.5, -1.2455);
loopsva 5:be5c1d562334 199 pc.printf(" %5d K ", (int)rint(cct));
loopsva 5:be5c1d562334 200
loopsva 5:be5c1d562334 201 if((int)rint(cct) >= 12000) pc.printf("???? Way Blue!!! \r\n");
loopsva 5:be5c1d562334 202 if(((int)rint(cct) < 12000) && ((int)rint(cct) >= 9000)) pc.printf("Blue Sky Poleward\r\n");
loopsva 5:be5c1d562334 203 if(((int)rint(cct) < 9000) && ((int)rint(cct) >= 7500)) pc.printf("Blue Sky\r\n");
loopsva 5:be5c1d562334 204 if(((int)rint(cct) < 7500) && ((int)rint(cct) >= 6500)) pc.printf("Overcast Sky\r\n");
loopsva 5:be5c1d562334 205 if(((int)rint(cct) < 6500) && ((int)rint(cct) >= 5500)) pc.printf("Daylight Vertical\r\n");
loopsva 5:be5c1d562334 206 if(((int)rint(cct) < 5500) && ((int)rint(cct) >= 5000)) pc.printf("Daylight Horizontal\r\n");
loopsva 5:be5c1d562334 207 if(((int)rint(cct) < 5000) && ((int)rint(cct) >= 4500)) pc.printf("Arc Light\r\n");
loopsva 5:be5c1d562334 208 if(((int)rint(cct) < 4500) && ((int)rint(cct) >= 4150)) pc.printf("undefined\r\n");
loopsva 5:be5c1d562334 209 if(((int)rint(cct) < 4150) && ((int)rint(cct) >= 4100)) pc.printf("Moonlight, Cool\r\n");
loopsva 5:be5c1d562334 210 if(((int)rint(cct) < 4100) && ((int)rint(cct) >= 3300)) pc.printf("Neutral\r\n");
loopsva 5:be5c1d562334 211 if(((int)rint(cct) < 3300) && ((int)rint(cct) >= 2700)) pc.printf("Soft White\r\n");
loopsva 5:be5c1d562334 212 if(((int)rint(cct) < 2700) && ((int)rint(cct) >= 2000)) pc.printf("Sunrise Sunset\r\n");
loopsva 5:be5c1d562334 213 if(((int)rint(cct) < 2000) && ((int)rint(cct) >= 1850)) pc.printf("Candle Light\r\n");
loopsva 5:be5c1d562334 214 if(((int)rint(cct) < 1850) && ((int)rint(cct) >= 1700)) pc.printf("Match Light\r\n");
loopsva 5:be5c1d562334 215 if((int)rint(cct) < 1700) pc.printf("???? Way Red!!! \r\n");
loopsva 5:be5c1d562334 216
loopsva 5:be5c1d562334 217 if((vemlSTR.r_d == 65535) || (vemlSTR.g_d == 65535) || (vemlSTR.b_d == 65535) || (vemlSTR.w_d == 65535)) pc.printf("*** RGBW overflow!!!\r\n");
loopsva 5:be5c1d562334 218 } else {
loopsva 5:be5c1d562334 219 pc.printf("No VEML60xx device detected...\r\n");
loopsva 5:be5c1d562334 220 }
loopsva 5:be5c1d562334 221 chgd = false;
loopsva 5:be5c1d562334 222 }
loopsva 1:cb3f098cfa62 223
loopsva 0:66a40a792cc9 224 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:66a40a792cc9 225 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:66a40a792cc9 226
loopsva 0:66a40a792cc9 227 int main() {
loopsva 0:66a40a792cc9 228 pc.baud(230400);
loopsva 0:66a40a792cc9 229 initSplash();
loopsva 0:66a40a792cc9 230
loopsva 0:66a40a792cc9 231 //set up the light sensor - UV or RGBW
loopsva 0:66a40a792cc9 232 pc.printf("Initializing the VEML60xx Opto Sensor...\r\n");
loopsva 1:cb3f098cfa62 233 veml.setConfig(vemlSTR, VEML60xx_CONF_BITS_IT_400m320m);
loopsva 1:cb3f098cfa62 234 //veml.setConfig(vemlSTR, VEML60xx_CONF_BITS_IT_400m320m | VEML60xx_CONF_BITS_AF);
loopsva 1:cb3f098cfa62 235 veml.getID(vemlSTR);
loopsva 1:cb3f098cfa62 236 if(vemlSTR.is6040) pc.printf("- VEML6040 device ID: 0x%04x CONF: 0x%04x\r\n", vemlSTR.id, vemlSTR.conf_reg);
loopsva 1:cb3f098cfa62 237 if(vemlSTR.is6075) pc.printf("- VEML6075 device ID: 0x%04x CONF: 0x%04x\r\n", vemlSTR.id, vemlSTR.conf_reg);
loopsva 2:9726fbb6f331 238 if((!(vemlSTR.is6040)) && (!(vemlSTR.is6075))) pc.printf("- VEML60xx device ID: 0x%04x CONF: 0x%04x\r\n", vemlSTR.id, vemlSTR.conf_reg);
loopsva 0:66a40a792cc9 239
loopsva 0:66a40a792cc9 240 while(1) {
loopsva 0:66a40a792cc9 241 wait(2.0);
loopsva 0:66a40a792cc9 242 dispVeml60xx();
loopsva 0:66a40a792cc9 243 }
loopsva 0:66a40a792cc9 244 }