161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* 261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License. 661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at 761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and 1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License. 1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */ 1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* LEDArray implementation */ 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h" 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 223a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult ILEDArray_ActivateLEDArray(SLLEDArrayItf self, SLuint32 lightMask) 2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten ILEDArray *thiz = (ILEDArray *) self; 27bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 28bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLightMask = lightMask; 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 363a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult ILEDArray_IsLEDArrayActivated(SLLEDArrayItf self, SLuint32 *pLightMask) 3761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pLightMask) { 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten ILEDArray *thiz = (ILEDArray *) self; 44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 45bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint32 lightMask = thiz->mLightMask; 46bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pLightMask = lightMask; 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 553a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenstatic SLresult ILEDArray_SetColor(SLLEDArrayItf self, SLuint8 index, const SLHSL *pColor) 5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten do { 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(index < MAX_LED_COUNT) || NULL == pColor) 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLHSL color = *pColor; 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= color.hue && color.hue <= 360000)) 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= color.saturation && color.saturation <= 1000)) 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(0 <= color.lightness && color.lightness <= 1000)) 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 70bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten ILEDArray *thiz = (ILEDArray *) self; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // can't use poke because struct copy might not be atomic 72bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 73bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mColors[index] = color; 74bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } while (0); 77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kastenstatic SLresult ILEDArray_GetColor(SLLEDArrayItf self, SLuint8 index, SLHSL *pColor) 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{ 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!(index < MAX_LED_COUNT) || NULL == pColor) { 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 89bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten ILEDArray *thiz = (ILEDArray *) self; 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // can't use peek because struct copy might not be atomic 91bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_shared(thiz); 92bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLHSL color = thiz->mColors[index]; 93bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_shared(thiz); 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pColor = color; 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 9961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 10261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLLEDArrayItf_ ILEDArray_Itf = { 10361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten ILEDArray_ActivateLEDArray, 10461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten ILEDArray_IsLEDArrayActivated, 10561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten ILEDArray_SetColor, 106a361b51914aeb5f8f65c7ecad719d1e01f90913bGlenn Kasten ILEDArray_GetColor 10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 10861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 10961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid ILEDArray_init(void *self) 11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 111bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten ILEDArray *thiz = (ILEDArray *) self; 112bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &ILEDArray_Itf; 113bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLightMask = 0; 114bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLHSL *color = thiz->mColors; 1150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint8 index; 1163a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten for (index = 0; index < MAX_LED_COUNT; ++index, ++color) { 1173a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten color->hue = 0; // red, but per specification 1.0.1 pg. 259: "Default color is undefined." 1180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten color->saturation = 1000; 1190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten color->lightness = 1000; 1200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten } 1213a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // const 122bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mCount = MAX_LED_COUNT; 12361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 124