pebble/src/fw/applib/platform.h
2025-01-27 11:38:16 -08:00

84 lines
3 KiB
C

/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
typedef enum PlatformType {
PlatformTypeAplite,
PlatformTypeBasalt,
PlatformTypeChalk,
PlatformTypeDiorite,
PlatformTypeEmery,
} PlatformType;
// Unit tests and the firmware don't define the SDK platform defines because reasons.
// Therefore, we need to switch on the platform for the platform type.
#if !defined(SDK)
#if PLATFORM_TINTIN
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeAplite
#elif PLATFORM_SNOWY
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeBasalt
#elif PLATFORM_SPALDING
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeChalk
#elif PLATFORM_SILK
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeDiorite
#elif PLATFORM_ROBERT || PLATFORM_CALCULUS
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeEmery
#else
#error "PBL_PLATFORM_TYPE_CURRENT couldn't be determined: No PLATFORM_* defined!"
#endif
#else
#if PBL_PLATFORM_APLITE
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeAplite
#elif PBL_PLATFORM_BASALT
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeBasalt
#elif PBL_PLATFORM_CHALK
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeChalk
#elif PBL_PLATFORM_DIORITE
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeDiorite
#elif PBL_PLATFORM_EMERY
#define PBL_PLATFORM_TYPE_CURRENT PlatformTypeEmery
#else
#error "PBL_PLATFORM_TYPE_CURRENT couldn't be determined: No PBL_PLATFORM_* defined!"
#endif
#endif
#define PBL_PLATFORM_SWITCH_DEFAULT(PLAT, DEFAULT, APLITE, BASALT, CHALK, DIORITE, EMERY) (\
((PLAT) == PlatformTypeEmery) ? (EMERY) : \
((PLAT) == PlatformTypeDiorite) ? (DIORITE) : \
((PLAT) == PlatformTypeChalk) ? (CHALK) : \
((PLAT) == PlatformTypeBasalt) ? (BASALT) : \
((PLAT) == PlatformTypeBasalt) ? (APLITE) : \
(DEFAULT) \
)
// We fall back to Aplite because we need to fall back on _one_ of the given arguments.
// This prevents issues with sometimes using this for pointers/strings, and sometimes for ints.
//
// NOTE: Optimal use of this does _not_ call a function for the `PLAT` argument! If you do, it
// will be _evaluated on every comparison_, which is unlikely to be what you want!
#define PBL_PLATFORM_SWITCH(PLAT, APLITE, BASALT, CHALK, DIORITE, EMERY) \
PBL_PLATFORM_SWITCH_DEFAULT(PLAT, APLITE, APLITE, BASALT, CHALK, DIORITE, EMERY)
// INTERNAL
#define platform_type_get_name(plat) PBL_PLATFORM_SWITCH_DEFAULT(plat, \
/*default*/ "unknown", \
/*aplite*/ "aplite", \
/*basalt*/ "basalt", \
/*chalk*/ "chalk", \
/*diorite*/ "diorite", \
/*emery*/ "emery")