add PC-Card melody beep(PC Card bus, kludge version)
Original idea from: PAO3
This commit is contained in:
parent
39c124ef2e
commit
4dda8545f9
@ -25,7 +25,7 @@ apmd_enable="NO" # Run apmd to handle APM event from userland.
|
||||
apmd_flags="" # Flags to apmd (if enabled).
|
||||
pccard_enable="NO" # Set to YES if you want to configure PCCARD devices.
|
||||
pccard_mem="DEFAULT" # If pccard_enable=YES, this is card memory address.
|
||||
pccard_beep="1" # pccard beep type.
|
||||
pccard_beep="2" # pccard beep type.
|
||||
pccard_ifconfig="NO" # Specialized pccard ethernet configuration (or NO).
|
||||
pccardd_flags="" # Additional flags for pccardd.
|
||||
pccard_conf="/etc/defaults/pccard.conf" # pccardd(8) config file
|
||||
|
@ -223,7 +223,7 @@ pccardInitialize(void)
|
||||
restorescr(w);
|
||||
return;
|
||||
}
|
||||
beep_newstat = 1;
|
||||
beep_newstat = 2;
|
||||
if (ioctl(fd, PIOCSBEEP, &beep_newstat) < 0) {
|
||||
msgNotify("Warning: unable to set pccard insertion beep type for %s",
|
||||
card_device);
|
||||
|
@ -114,6 +114,8 @@ for a fixed address or "DHCP" for a DHCP client).
|
||||
set the PCCARD controller to silent mode.
|
||||
If 1,
|
||||
set it to beep mode.
|
||||
If 2,
|
||||
set it to melody mode.
|
||||
.It Ar pccard_conf
|
||||
(str) Path to the configuration file for the
|
||||
.Xr pccardd 8
|
||||
|
@ -19,6 +19,6 @@ void pccard_insert_beep __P((void));
|
||||
void pccard_remove_beep __P((void));
|
||||
void pccard_success_beep __P((void));
|
||||
void pccard_failure_beep __P((void));
|
||||
int pccard_beep_select __P((enum beepstate));
|
||||
int pccard_beep_select __P((int));
|
||||
|
||||
#endif /* !_PCCARD_DRIVER_H_ */
|
||||
|
@ -13,67 +13,118 @@
|
||||
|
||||
#include <pccard/driver.h>
|
||||
|
||||
#define PCCARD_BEEP_PITCH0 1600
|
||||
#define PCCARD_BEEP_DURATION0 20
|
||||
#define PCCARD_BEEP_PITCH1 1200
|
||||
#define PCCARD_BEEP_DURATION1 40
|
||||
#define PCCARD_BEEP_PITCH2 3200
|
||||
#define PCCARD_BEEP_DURATION2 40
|
||||
|
||||
static struct callout_handle beeptimeout_ch
|
||||
= CALLOUT_HANDLE_INITIALIZER(&beeptimeout_ch);
|
||||
|
||||
static enum beepstate allow_beep = BEEP_OFF;
|
||||
static int melody_type = 0;
|
||||
|
||||
/*
|
||||
* timeout function to keep lots of noise from
|
||||
* happening with insertion/removals.
|
||||
*/
|
||||
static void enable_beep(void *dummy)
|
||||
#define MAX_TONE_MODE 3
|
||||
#define MAX_STATE 4
|
||||
|
||||
struct tone {
|
||||
int pitch;
|
||||
int duration;
|
||||
};
|
||||
|
||||
|
||||
static struct tone silent_beep[] = {
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static struct tone success_beep[] = {
|
||||
{1200, 40}, {NULL, NULL}
|
||||
};
|
||||
static struct tone failure_beep[] = {
|
||||
{3200, 40}, {NULL, NULL}
|
||||
};
|
||||
static struct tone insert_remove_beep[] = {
|
||||
{1600, 20}, {NULL, NULL}
|
||||
};
|
||||
|
||||
static struct tone success_melody_beep[] = {
|
||||
{1200, 7}, {1000, 7}, { 800, 15}, {NULL, NULL}
|
||||
};
|
||||
static struct tone failure_melody_beep[] = {
|
||||
{2000, 7}, {2400, 7}, {2800, 15}, {NULL, NULL}
|
||||
};
|
||||
static struct tone insert_melody_beep[] = {
|
||||
{1600, 10}, {1200, 5}, {NULL, NULL}
|
||||
};
|
||||
static struct tone remove_melody_beep[] = {
|
||||
{1200, 10}, {1600, 5}, {NULL, NULL}
|
||||
};
|
||||
|
||||
static struct tone *melody_table[MAX_TONE_MODE][MAX_STATE] = {
|
||||
{ /* silent mode */
|
||||
silent_beep, silent_beep, silent_beep, silent_beep,
|
||||
},
|
||||
{ /* simple beep mode */
|
||||
success_beep, failure_beep,
|
||||
insert_remove_beep, insert_remove_beep,
|
||||
},
|
||||
{ /* melody beep mode */
|
||||
success_melody_beep, failure_melody_beep,
|
||||
insert_melody_beep, remove_melody_beep,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
pccard_beep_sub(void *arg)
|
||||
{
|
||||
/* Should never be needed */
|
||||
untimeout(enable_beep, (void *)NULL, beeptimeout_ch);
|
||||
struct tone *melody;
|
||||
melody = (struct tone *)arg;
|
||||
|
||||
allow_beep = BEEP_ON;
|
||||
if (melody->duration != NULL) {
|
||||
sysbeep(melody->duration, melody->pitch);
|
||||
timeout(pccard_beep_sub, ++melody, melody->pitch);
|
||||
} else
|
||||
allow_beep = BEEP_ON;
|
||||
}
|
||||
|
||||
void pccard_insert_beep(void)
|
||||
static void
|
||||
pccard_beep_start(void *arg)
|
||||
{
|
||||
if (allow_beep == BEEP_ON) {
|
||||
sysbeep(PCCARD_BEEP_PITCH0, PCCARD_BEEP_DURATION0);
|
||||
allow_beep = BEEP_OFF;
|
||||
beeptimeout_ch = timeout(enable_beep, (void *)NULL, hz / 5);
|
||||
}
|
||||
}
|
||||
struct tone *melody;
|
||||
melody = (struct tone *)arg;
|
||||
|
||||
void pccard_remove_beep(void)
|
||||
{
|
||||
if (allow_beep == BEEP_ON) {
|
||||
sysbeep(PCCARD_BEEP_PITCH0, PCCARD_BEEP_DURATION0);
|
||||
if (allow_beep == BEEP_ON && melody->duration != NULL) {
|
||||
allow_beep = BEEP_OFF;
|
||||
beeptimeout_ch = timeout(enable_beep, (void *)NULL, hz / 5);
|
||||
sysbeep(melody->duration, melody->pitch);
|
||||
timeout(pccard_beep_sub, ++melody, melody->pitch);
|
||||
}
|
||||
}
|
||||
|
||||
void pccard_success_beep(void)
|
||||
{
|
||||
if (allow_beep == BEEP_ON) {
|
||||
sysbeep(PCCARD_BEEP_PITCH1, PCCARD_BEEP_DURATION1);
|
||||
}
|
||||
pccard_beep_start(melody_table[melody_type][0]);
|
||||
}
|
||||
|
||||
void pccard_failure_beep(void)
|
||||
{
|
||||
if (allow_beep == BEEP_ON) {
|
||||
sysbeep(PCCARD_BEEP_PITCH2, PCCARD_BEEP_DURATION2);
|
||||
}
|
||||
pccard_beep_start(melody_table[melody_type][1]);
|
||||
}
|
||||
|
||||
int pccard_beep_select(enum beepstate state)
|
||||
void pccard_insert_beep(void)
|
||||
{
|
||||
if (state == BEEP_ON || state == BEEP_OFF) {
|
||||
allow_beep = state;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
pccard_beep_start(melody_table[melody_type][2]);
|
||||
}
|
||||
|
||||
void pccard_remove_beep(void)
|
||||
{
|
||||
pccard_beep_start(melody_table[melody_type][3]);
|
||||
}
|
||||
|
||||
int pccard_beep_select(int type)
|
||||
{
|
||||
int errcode = 0;
|
||||
|
||||
if (type == 0) {
|
||||
allow_beep = BEEP_OFF;
|
||||
melody_type = 0;
|
||||
} else if (type < 0 || type > MAX_TONE_MODE)
|
||||
errcode = 1;
|
||||
else {
|
||||
allow_beep = BEEP_ON;
|
||||
melody_type = type;
|
||||
}
|
||||
return errcode;
|
||||
}
|
||||
|
@ -85,6 +85,8 @@ are:
|
||||
silent mode
|
||||
.It Li 1
|
||||
simple beep mode
|
||||
.It Li 2
|
||||
melody mode
|
||||
.El
|
||||
.It
|
||||
.Ic dumpcis
|
||||
|
@ -223,7 +223,7 @@ pccardInitialize(void)
|
||||
restorescr(w);
|
||||
return;
|
||||
}
|
||||
beep_newstat = 1;
|
||||
beep_newstat = 2;
|
||||
if (ioctl(fd, PIOCSBEEP, &beep_newstat) < 0) {
|
||||
msgNotify("Warning: unable to set pccard insertion beep type for %s",
|
||||
card_device);
|
||||
|
Loading…
Reference in New Issue
Block a user