5 #include <msp430xgeneric.h>
16 #include "bluetooth_init_cc256x.h"
20 #include "oswald_hal.h"
25 const char *hal_get_version_string(void)
27 return MW_MAIN_VERSION;
30 const char *hal_get_buildno_string(void)
35 const char *hal_get_radio_version_string(void)
37 return cc256x_version;
40 void hal_lcd_set_pixel(uint8_t x, uint8_t y, uint8_t color)
44 mw_lcd_draw_pixel(x, y, color ? LCD_BLACK : LCD_WHITE);
47 void hal_lcd_clear_display(void)
52 void hal_lcd_update_display(void)
54 mw_lcd_update_screen();
57 void hal_lcd_set_backlight(boolean state)
66 boolean hal_lcd_get_backlight(void)
68 return (LCD_LED_POUT & LCD_LED_PIN) ? TRUE : FALSE;
71 void hal_enable_centisecond_timer(void)
73 start_timer(TIMER_100MS_CYCLES);
76 void hal_disable_centisecond_timer(void)
81 void hal_enable_halfsecond_timer(void)
83 start_timer(TIMER_500MS_CYCLES);
86 void hal_disable_halfsecond_timer(void)
91 void hal_get_rtc(clock_state *rtc)
93 /* Update clock state from RTC */
103 void hal_set_rtc(clock_state *rtc, boolean set_sec)
105 /* Update clock state from RTC */
107 RTCMIN = rtc->minute;
109 RTCSEC = rtc->second;
113 rtc->wday = getWochentag(rtc->day, rtc->month, rtc->year);
117 void hal_get_power_state(power_state *pwr)
121 pwr->source = (BAT_CHARGE_IN & BAT_CHARGE_PWR_BIT) ? POWER_SOURCE_BATTERY : POWER_SOURCE_EXTERNAL;
123 /* unless the charger is enabled we do not get a reasonable state */
124 if (!(BAT_CHARGE_IN & BAT_CHARGE_ENABLE_PIN)) {
125 switch (BAT_CHARGE_IN & (BAT_CHARGE_STAT1 | BAT_CHARGE_STAT2)) {
126 case BAT_CHARGE_STAT1:
127 pwr->charge_state = POWER_CHARGER_DONE;
129 case BAT_CHARGE_STAT2:
130 pwr->charge_state = POWER_CHARGER_CHARGING;
132 case (BAT_CHARGE_STAT1 | BAT_CHARGE_STAT2):
133 pwr->charge_state = POWER_CHARGER_UNK;
136 pwr->charge_state = POWER_CHARGER_PRECHARGE;
140 pwr->charge_state = POWER_CHARGER_UNK;
143 if ((pwr->source == POWER_SOURCE_BATTERY) && (RTCSEC != 0)) {
144 /* the ADC and activating the measuring shunts is
145 * power expensive so only do this every minute */
149 /* get new values and so some averaging to avoid jumps */
150 val = mw_get_battery_adc_val();
151 pwr->percent = mw_get_battery_percentage_from_val(val);
155 void hal_vibration_set_state(boolean state)
159 TA1CTL |= TASSEL__ACLK | MC__UPDOWN | ID_0;
168 boolean hal_vibration_get_state(void)
171 return (P7SEL & BIT3) ? TRUE : FALSE;
177 #define BLUETOOTH_DEVICE_NAME "Oswald on MetaWatch"
178 static boolean bt_is_visible = FALSE;
181 bluetooth_state hal_bluetooth_set_state(bluetooth_state state)
185 if (state == BLUETOOTH_OFF && mw_bt_is_enabled() == 1) {
187 bt_is_visible = FALSE;
188 return BLUETOOTH_OFF;
189 } else if (state == BLUETOOTH_ON && mw_bt_is_enabled() == 0) {
193 strncpy((char *)buf, BLUETOOTH_DEVICE_NAME, strlen(BLUETOOTH_DEVICE_NAME));
194 bt_hci_cmd(HCI_HC_BB_OGF, HCI_W_LOCAL_NAME_OCF, strlen(BLUETOOTH_DEVICE_NAME)+1, buf);
195 // read our local address
196 bt_hci_cmd(HCI_INFO_PARAM_OGF, HCI_R_BD_ADDR_OCF, 0, NULL);
198 buf[0] = HCI_BB_SCAN_PAGE;
199 bt_hci_cmd(HCI_HC_BB_OGF, HCI_W_SCAN_EN_OCF, 1, buf);
200 bt_is_visible = FALSE;
203 return BLUETOOTH_ILL;
206 bluetooth_state hal_bluetooth_get_state(void)
208 if (mw_bt_is_enabled() == 1) {
209 if (bt_l2cap_get_connected(0x40))
210 return BLUETOOTH_CONNECTED;
214 return BLUETOOTH_OFF;
217 uint8_t *hal_bluetooth_get_local_bdaddr(void)
219 return bt_hci_get_local_bdaddr();
222 void hal_bluetooth_set_visible(boolean visible)
226 if (mw_bt_is_enabled() == 0) {
227 bt_is_visible = FALSE;
232 // enable page and inquiry scan
233 buf[0] = HCI_BB_SCAN_INQUIRY | HCI_BB_SCAN_PAGE;
234 bt_hci_cmd(HCI_HC_BB_OGF, HCI_W_SCAN_EN_OCF, 1, buf);
235 bt_is_visible = TRUE;
237 // enable page scan only
238 buf[0] = HCI_BB_SCAN_PAGE;
239 bt_hci_cmd(HCI_HC_BB_OGF, HCI_W_SCAN_EN_OCF, 1, buf);
240 bt_is_visible = FALSE;
244 boolean hal_bluetooth_get_visible(void)
246 return bt_is_visible;
249 void hal_bluetooth_send_data(const void *mdat, uint16_t mlen)
251 bt_l2cap_send_channel(0x40, mdat, mlen);
255 * Control the accelerometer
257 void hal_accelerometer_enable(void)
262 void hal_accelerometer_disable(void)
267 uint16_t hal_amblight_get_val(void)
269 return mw_get_amblight_adc_val();